【Docker 08】Compose - 容器编排

发布于:2025-06-22 ⋅ 阅读:(16) ⋅ 点赞:(0)

🌈 一、Docker Compose 介绍

⭐ 1. Docker Compose 是什么

  • Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具,它让用户可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务(如 Web 服务、数据库、缓存等),然后使用一条命令就可以启动整个应用栈。
  • 在 docker-compose 中,有以下两个非常重要的概念:
    1. 服务 service:由若干相同镜像容器组成的应用。
    2. 项目 project:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义,整个 docker-compose.yml 定义一个项目。

⭐ 2. Docker Compose 的必要性

  • Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程。
  • 假设当前要启动一个应用,它涉及到了 MySQL 和 Nginx,需要分别为应用、MySQL 和 Nginx 创建单独的 Docker 容器,然后将这些容器运行起来。当构建好 Docker 之后,每次启动这个应用都至少需要 docker run 三次,未免也太过繁琐。且这些容器都是分散独立的,也不方便镜像管理。
  • 此时就引入了 Docker Compose 来将那些为同一个应用服务的容器整合起来,方便进行管理。

Docker Compose 主要优势

  • 简化控制:Docker Compose 允许用户在单个 YAML 文件中定义和管理多容器应用程序。简化了编排和协调各种服务的复杂任务,从而更轻松地管理和复制用户的应用程序环境。
  • 高效协作:Docker Compose 的配置文件易于共享,促进了开发、运营、测试等项目相关者之间的协作。
  • 快速应用程序开发:Docker Compose 会缓存用于创建容器的配置。当重新启动未更改的服务时,Docker Compose 会重新使用现有容器。重复使用容器意味着可以非常快速的更改环境。
  • 跨环境的可移植性:Docker Compose 支持 Compose 文件中的变量,可以使用这些变量为不同的环境或不同的用户自定义合成。

⭐ 3. Docker Compose 的功能

  • Docker Compose 可以管理应用程序的整个生命周期。
功能分类 具体内容 示例命令
服务编排 使用 docker-compose.yml 文件定义多个服务 docker compose up
自动构建镜像 可以自动根据 Dockerfile 文件构建镜像 docker compose build
一键启动于停止 一条命令就可以 启动 / 停止 整个应用 docker compose up / down
服务依赖管理 通过 depends_on 来定义服务之间的依赖关系 depends_on: [db]
网络自动管理 默认为服务创建隔离的虚拟网络,也支持自定义网络 networks:
数据卷管理 自动创建、挂载卷,实现数据持久化 volumes:
日志集中查看 查看所有服务容器的日志输出 docker compose logs
配置参数统一管理 可以使用 .env 文件来定义环境变量 .env 文件 + %{VAR} 语法

⭐ 4. Docker Compose 的使用场景

  1. 本地开发环境构建:用于本地构建一个由多个服务组成的项目(如 Web + 数据库 + 缓存),通过一个 docker-compose.yml 文件可以一键启动所有组件,避免环境配置混乱。
  2. 多环境配置管理:结合多个 Compose 文件或环境变量管理不同部署环境下的配置,可以避免重复配置和代码污染,提升部署灵活性。
  3. 数据库备份 / 恢复演练:搭建一个隔离的数据库环境进行数据恢复、备份策略测试或异常演练,不会影响正式环境。

🌈 二、Docker Compose 文件

  • Docker Compose 可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用所需要的服务。

⭐ 1. 文件语法版本

  • 当前官方支持 3 个大版本(version1、version2、version3),其中的 version1 已经被废弃。
  • 建议始终使用 Docker 官方文档推荐的最新版语法,以获得最大兼容性和功能支持。
Compose 版本 对应字段写法 支持的最低 Docker Engine 版本 说明
1 不写 version 字段 < 1.10 功能有限,已废弃
2 version: ‘2’ 1.10+ 引入了 depends_on 等基本功能
2.1 ~ 2.4 version: ‘2.x’ 1.12 ~ 17.12 增强了 healthcheck、资源限制等
3 version: ‘3’ 1.13+ 为 Swarm 服务模式涉及
3.1 ~ 3.9 version: ‘3.x’ 17.01 ~ 20.10 添加 secrets、configs、runtime
3.8 version: ‘3.8’ 19.03+ 最常用的稳定版本
3.9 version: ‘3.9’ 20.10+ 最新 v3 版本,新增 profiles

⭐ 2. 文件基本结构

  • 一个标准的 docker-compose.yml 文件主要包括以下几个顶层字段(提示:xxx 仅作为占位,需根据具体服务进行填写)。
version: '3.8'           # 指定语法版本
services:                # 服务定义块(核心),可以存在多个
  servicename:           # 服务名称,内部 bridge 网络下可作为 DNS 名称
    image:        xxx    # 必选,镜像的名字
    command:      xxx    # 可选,覆盖默认镜像里的 CMD 命令
    environment:  xxx    # 可选,设置环境变量,等价于 docker run 的 --env
    volumes:      xxx    # 可选,挂载数据卷,等价于 docker run 的 -v
    networks:     xxx    # 可选,加入的网络,等价于 docker run 的 --network
    ports:        xxx    # 可选,端口映射,等价于 docker run 的 -p
    expose:       xxx    # 可选,仅声明容器暴露的端口,等价于 --expose
    depends_on:   xxx    # 可选,设置服务间的依赖顺序,类似于 --link
    restart:      xxx    # 可选,容器重启策略,等价于 --restart
    build:        xxx    # 可选,构建镜像路径,等价于 docker build 的 -f
  servicename2:
    # ...
  servicename3:
    # ...
volumes:                # 可选,数据卷定义块,等价于 docker volume create
  # volume_name:
  #   driver: xxx
networks:               # 可选,网络定义块,等价于 docker network create
  # network_name:
  #   driver: bridge

⭐ 3. 常见字段格式语法

🌙 3.1 image

  • 用于指定容器运行的镜像,以下格式都可以:
image: image_name                                 # 镜像名(默认最新版本)
image: image_name:tag                             # 镜像 + 标签(版本号)
image: image_name@sha256:digest                   # 镜像 + 摘要哈希
image: namespace/image_name                       # 指定命名空间镜像
image: registry_host:port/namespace/image_name    # 私有仓库中的镜像

🌙 3.2 command

  • 用于覆盖镜像默认的启动命令,以下格式都可以:
command: "executable param1 param2"               # 字符串形式命令
command: ["executable", "param1", "param2"]       # 列表形式命令(推荐)

🌙 3.3 entrypoint

  • 用于覆盖容器默认的 entrypoint,以下格式都可以:
entrypoint: "/entry.sh"                           # 字符串形式入口点
entrypoint: ["sh", "/entry.sh"]                   # 列表形式入口点(推荐)

🌙 3.4 environment

  • 用于设置容器的环境变量,以下格式都可以:
environment:
  - VAR_NAME=value                                # 字符串列表格式
  - VAR_NAME                                      # 从宿主环境继承变量

environment:
  VAR_NAME: value                                 # 映射格式(推荐使用)
  ANOTHER_VAR: "true"

🌙 3.5 networks

  • 指定容器运行的网络,可用于服务发现,以下格式都可以:
networks:
  - network_name                                   # 加入已有网络(简写形式)

networks:
  custom_net:
    aliases:
      - service_alias                              # 在网络中定义别名

🌙 3.6 volumes

  • 用于将宿主机的存储卷 / 文件挂载到容器中:
volumes:
  - host_path:container_path                       # 将宿主机路径挂载到容器中
  - volume_name:container_path                     # 使用命名卷挂载数据
  - container_path                                 # 创建匿名卷并挂载到容器路径

  - type: volume|bind                              # 指定挂载类型(volume 或 bind)
    source: volume_name_or_host_path               # 数据来源(卷名或宿主路径)
    target: container_path                         # 容器内的目标挂载路径
    read_only: true|false                          # 是否只读挂载

🌙 3.7 ports

  • 用于配置宿主机和容器之间的端口映射:
ports:
  - "host_port:container_port"                     # 宿主端口映射到容器端口
  - "host_ip:host_port:container_port"             # 限定绑定主机 IP
  - "container_port"                               # 随机分配宿主机端口映射容器端口

  - target: container_port                         # 容器暴露端口(Swarm 专用格式)
    published: host_port                           # 映射到宿主机的端口
    protocol: tcp|udp                              # 协议类型
    mode: ingress|host                             # 发布模式(负载均衡或主机直连)

🌙 3.8 expose

  • 用于暴露容器端口,仅在网络中可访问:
expose:
  - container_port                                 # 向同一网络中的容器暴露端口
  - another_container_port                         # 不对主机暴露,仅内部访问

🌙 3.9 build

  • 用于从源码构建镜像,以下几种格式都可以:
build: context_path                                # 简写,指定构建上下文路径

build:
  context: context_path                            # 构建上下文路径(目录)
  dockerfile: Dockerfile_name                      # Dockerfile 文件名(默认是 Dockerfile)
  args:                                            # 构建时传入的参数(ARG)
    ARG_NAME: value
  target: build_stage_name                         # 多阶段构建时的目标阶段
  cache_from:
    - image_name:tag                               # 用于加速构建的缓存镜像来源

🌙 3.10 depends_on

  • 用于声明依赖服务的启动顺序(仅控制启动顺序,不保证服务已就绪):
depends_on:
  - service_a                                      # 当前服务依赖 service_a 启动
  - service_b                                      # 当前服务依赖 service_b 启动

🌙 3.11 env_file

  • 用于引入 .env 文件来设置环境变量:
env_file:
  - .env                                           # 默认环境文件,当前路径
  - config/dev.env                                 # 自定义路径下的 .env 文件

🌈 三、Docker Compose 命令

⭐ 1. 命令清单

命令 功能
01 docker compose build 构建服务所需要的镜像
02 docker compose config 检查 docker-compose.yml 文件格式是否正确,并以规范的格式来显示配置
03 docker compose cp 在本地系统和服务容器之间拷贝文件
04 docker compose create 创建服务的容器,但不启动它们
05 docker compose up 构建,(重新)创建,启动,链接一个服务相关的容器
06 docker compose down 停止所有容器,并删除容器、网络、卷等资源
07 docker compose exec 在运行中的容器内执行命令
08 docker compose images 列出所有容器当前使用的镜像
09 docker compose kill 强制停止服务的容器
10 docker compose logs 查看服务容器输出的日志
11 docker compose ls 显示当前主机上的所有 Compose 项目
12 docker compose pause 暂停服务容器
13 docker compose unpause 恢复被暂停的服务容器
14 docker compose ps 列出当前项目中运行的所有容器
15 docker compose pull 从远程仓库拉取服务镜像
16 docker compose push 推送服务镜像到远程仓库
17 docker compose restart 重启 / 重启某个服务
18 docker compose rm 删除服务停止的容器
19 docker compose run 在指定服务容器上执行相关的命令(一次性)
20 docker compose start 启动当前停止的某个容器
21 docker compose stop 停止当前运行的某个容器
22 docker compose top 显示服务容器中运行的进程
23 docker compose port 列出所有的服务端口映射
24 docker compose events 从服务获取实时事件
25 docker compose version 查看 Compose 版本信息

⭐ 2. 命令通用格式

  • 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或容器。
    • 如果没有特别说明,命令对象默认是项目,这意味着项目中所有的服务都会受到命令影响。
  • Docker Compose 命令的基本使用格式如下:
docker compose [options] command [args...]
options 的常见选项 说明
-f 或 --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
-p 或 --project-name 指定项目名称,默认将所在目录的目录名作为项目名

⭐ 3. docker compose up

  • 该命令用于启动并创建 Compose 文件中定义的所有服务容器。
  • 它会尝试自动完成包括购进啊镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作。

1. 基础语法

docker compose up [options] [service_name...]
options 的可选项 功能
-d 在后台运行服务容器
--force-recreate 强制重新创建容器,不能和 --no-recreate 同时使用
--no-recreate 如果容器已经存在,则不重新创建,不能和 --force-recreate 同时存在

2. 使用示例

docker compose up -d web	# 后台启动名为 web 的服务

⭐ 4. docker compose down

  • 用于停止并删除所有 / 指定的服务容器、网络、卷(可选)和镜像(可选),用于彻底清理 Compose 启动的资源。

1. 基础语法

docker compose down [options] [service_name...]
options 的可选项 功能
-v 或 --volumes 删除所有的目录映射

2. 使用示例

docker compose down -v # 删除所有的服务容器、网络、卷

⭐ 5. docker compose run

  • 临时运行一个服务容器,并在其中执行命令,不影响原有容器的生命周期。

1. 基础语法

docker compose run [options] service_name [command] [args...]
options 的可选项 功能
-d 在后台运行容器
--name NAME 自定义容器名称(默认为 项目_服务_序号)
--entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量的值
-u 或 --user="" 指定运行容器的用户 UID 或 用户名
--rm 命令执行完后,自动删除容器
-p 或 --publish=[] 将主机端口映射到容器端口,格式为 host_port:container_port

2. 使用示例

docker compose run --rm db sh                    # 临时进入 db 服务执行 sh
docker compose run app npm install               # 对 app 服务执行 npm 安装

🌈 四、Docker Compose 部署 WordPress

⭐ 1. WordPress 介绍

  • WordPress 是一个免费、开源的内容管理系统(CMS),用户可以通过直观的管理页面创建、管理、发布数字内容,主要用于构建和管理网站

WordPress 的核心功能

功能模块 说明
文章与页面 创建并发布博客文章和页面,支持分类、标签、草稿、发布时间等
插件系统 提供扩展功能,例如 SEO 优化、安全防护、缓存、联系表单、电商功能等
主题系统 可切换外观风格,支持免费/付费主题,开发者也可自定义开发主题
媒体管理 上传和插入图片、视频、PDF 等媒体资源,有图库管理
用户与权限管理 支持多个用户角色:管理员、编辑、作者、投稿者、订阅者
评论系统 内建文章评论功能,支持反垃圾评论插件如 Akismet
多语言支持 支持多语言网站,可配合插件如 Polylang、WPML 构建多语种页面

⭐ 2. WordPress 部署

  1. 编写 Docker Compose:创建一个 docker-compose.yml 文件,内容如下:
version: "3.8"                                     # 指定 Docker Compose 文件语法版本

services:                                          # 所有服务容器定义块

  wordpress:                                       # WordPress 服务(Web前端)
    image: wordpress                               # 使用官方 WordPress 镜像
    restart: always                                # 始终重启(容器异常退出时自动恢复)

    depends_on:                                    # 设置服务依赖关系
      db:                                          # 依赖名为 db 的服务(MySQL)
        condition: service_healthy                 # 等待 db 服务变为健康后才启动本服务

    ports:
      - 8080:80                                    # 将主机 8080 端口映射到容器 80 端口(HTTP)

    environment:                                   # 设置环境变量供 WordPress 安装初始化使用
      WORDPRESS_DB_HOST:     db                    # 数据库主机(服务名)
      WORDPRESS_DB_USER:     MyWordPressUser       # 数据库用户名
      WORDPRESS_DB_PASSWORD: MyWordPressPass       # 数据库密码
      WORDPRESS_DB_NAME:     WordPress             # 要使用的数据库名

    volumes:
      - ./WordPress:/var/www/html                  # 映射本地目录到容器网站目录,实现持久化

  db:                                              # MySQL 服务(数据库)
    image: mysql:5.7                               # 使用官方 MySQL 5.7 镜像(兼容性良好)
    restart: always                                # 始终重启(数据库异常后自动恢复)

    environment:                                   # 设置数据库初始化参数(首次运行有效)
      MYSQL_DATABASE:      WordPress               # 初始化创建的数据库名
      MYSQL_USER:          MyWordPressUser         # 自定义数据库用户
      MYSQL_PASSWORD:      MyWordPressPass         # 数据库用户密码
      MYSQL_ROOT_PASSWORD: MyRootPass              # 数据库 root 用户密码

    volumes:
      - ./MysqlVarLib:/var/lib/mysql               # 映射本地目录到容器数据库目录,实现数据持久化

    healthcheck:                                   # 健康检查(用于依赖启动判断)
      test:     mysql -u root -pMyRootPass -e "SELECT 1;" # 测试 MySQL 是否响应查询
      timeout:  5s                                        # 每次检查最大等待时间
      retries:  10                                        # 最大重试次数
  1. 让站点在后台运行:
docker compose up -d

image-20250621223242234

  1. 在浏览器内通过访问服务器的 8080 端口来访问容器内的 web 页面。

image-20250621223605257

  1. 配置参数,点击安装:

image-20250621224014197

image-20250621224042749

  1. 使用创建的用户名和密码进行登录:

image-20250621224131772

  1. 进入后台,发布一篇 blog 看看功能是否正常。

image-20250621224828322

  1. 清理资源:先停应用,再停数据库。

image-20250621225210513


网站公告

今日签到

点亮在社区的每一天
去签到