🌈 一、Docker Compose 介绍
⭐ 1. Docker Compose 是什么
- Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具,它让用户可以通过一个 YAML 文件(通常是
docker-compose.yml
)来配置应用所需要的服务(如 Web 服务、数据库、缓存等),然后使用一条命令就可以启动整个应用栈。 - 在 docker-compose 中,有以下两个非常重要的概念:
- 服务
service
:由若干相同镜像容器组成的应用。 - 项目
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 的使用场景
- 本地开发环境构建:用于本地构建一个由多个服务组成的项目(如 Web + 数据库 + 缓存),通过一个 docker-compose.yml 文件可以一键启动所有组件,避免环境配置混乱。
- 多环境配置管理:结合多个 Compose 文件或环境变量管理不同部署环境下的配置,可以避免重复配置和代码污染,提升部署灵活性。
- 数据库备份 / 恢复演练:搭建一个隔离的数据库环境进行数据恢复、备份策略测试或异常演练,不会影响正式环境。
🌈 二、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 部署
- 编写 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 # 最大重试次数
- 让站点在后台运行:
docker compose up -d
- 在浏览器内通过访问服务器的 8080 端口来访问容器内的 web 页面。
- 配置参数,点击安装:
- 使用创建的用户名和密码进行登录:
- 进入后台,发布一篇 blog 看看功能是否正常。
- 清理资源:先停应用,再停数据库。