Docker 学习笔记:Docker Compose 多容器编排
本笔记介绍 Docker Compose 的使用方法,通过一个 YAML 文件定义和运行多容器应用,实现高效的一键部署与生命周期管理。包含 WordPress 实战案例,覆盖从开发到生产的典型场景。
30. Docker Compose 概述
Docker Compose 是 Docker 官方提供的用于定义和运行多容器应用的工具。通过一个 docker-compose.yml 模板文件,可以一次性启动一组相关联的容器,无需逐个手动操作。
30.1 核心概念
- 服务 (service):一个应用的容器,实际上可以包含若干个运行相同镜像的容器实例。
- 项目 (project) :由一组相关联的服务组成的完整业务单元,在
docker-compose.yml中定义。
Compose 的默认管理对象是项目,通过子命令可以对项目中的一组容器进行便捷的生命周期管理。Compose 项目由 Python 编写(后用 Go 重写),底层调用 Docker API,只要平台支持 Docker,就可以使用 Compose 进行编排管理。
30.2 为什么需要 Compose?
在日常工作中,一个 Web 项目通常需要 Web 服务、数据库服务甚至负载均衡等多个容器配合工作。如果逐一手动启停,维护量巨大且效率低下。Compose 可以轻松、高效地管理这些容器。
31. 安装与版本检查
Docker Compose 已作为 Docker CLI 插件集成,安装 Docker 后即可使用 docker compose 命令。
bash
$ docker compose version
Docker Compose version v2.27.0
查看帮助信息:
bash
$ docker compose -h
32. Compose 模板文件
默认模板文件名为 docker-compose.yml,采用 YAML 格式。
32.1 文件结构
version:模板文件版本(Compose v2 开始不再强制要求)。services:定义各个服务容器,每个服务可以指定镜像、端口、环境变量、数据卷、依赖等。networks、volumes:可选,定义网络和卷。
32.2 简单示例
yaml
services:
webapp:
image: httpd
更详细的配置可参考官方文档:Compose file reference
33. 实战:使用 Compose 部署 WordPress
33.1 传统 docker run 方式
bash
# MySQL 容器
$ docker run -tid --name db --restart always \
-v /db:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=huawei \
-e MYSQL_DATABASE=wordpress \
mysql
# WordPress 容器
$ docker run -tid --name blog \
-v /web:/var/www/html \
-p 80:80 \
--link db \
-e WORDPRESS_DB_HOST=db \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=huawei \
-e WORDPRESS_DB_NAME=wordpress \
wordpress
33.2 Compose 方式
创建项目目录并编写 docker-compose.yml:
bash
$ mkdir wordpress && cd wordpress
$ vim docker-compose.yml
yaml
services:
blog: # WordPress 服务
image: wordpress:latest
restart: always
ports:
- "80:80"
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=huawei
- WORDPRESS_DB_NAME=wordpress
db: # MySQL 服务
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=huawei
- MYSQL_DATABASE=wordpress
检查语法:
bash
$ docker compose config -q
33.3 启动项目
bash
$ docker compose up -d
[+] Running 3/3
✔ Network wordpress_default Created
✔ Container wordpress-db-1 Started
✔ Container wordpress-blog-1 Started
查看状态:
bash
$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
85b438b2ff89 wordpress:latest "docker-entrypoint.s..." ... 0.0.0.0:80->80/tcp wordpress-blog-1
3c340ed1e299 mysql:latest "docker-entrypoint.s..." ... 3306/tcp, 33060/tcp wordpress-db-1
33.4 验证
浏览器访问 http://<宿主机IP>/wp-admin/install.php,按照界面完成 WordPress 安装。
34. 常用 Compose 命令速查
| 命令 | 功能 |
|---|---|
docker compose up -d |
后台启动所有服务 |
docker compose down |
停止并删除容器、网络(默认不删除 volume) |
docker compose ps |
查看项目中的容器状态 |
docker compose logs -f |
查看所有服务的日志 |
docker compose restart |
重启所有服务 |
docker compose stop |
停止所有服务 |
docker compose start |
启动已停止的服务 |
docker compose rm |
删除已停止的服务容器 |
docker compose config -q |
验证并查看最终配置 |
docker compose pull |
拉取服务镜像 |
docker compose exec <服务名> <命令> |
在指定服务容器中执行命令 |
35. 知识点速查表
35.1 Compose 文件常用指令
| 指令 | 说明 | 示例 |
|---|---|---|
image |
指定使用的镜像 | image: wordpress:latest |
build |
指定 Dockerfile 路径,用于构建镜像 | build: . |
ports |
端口映射,格式 宿主机端口:容器端口 |
ports: - "80:80" |
environment |
设置环境变量 | environment: - MYSQL_ROOT_PASSWORD=123 |
volumes |
挂载数据卷 | volumes: - ./data:/var/lib/mysql |
networks |
指定网络 | networks: - my_net |
depends_on |
指定服务依赖顺序 | depends_on: - db |
restart |
重启策略 | restart: always |
command |
覆盖容器默认命令 | command: python app.py |
35.2 Compose 与 docker run 参数对照
| docker run 参数 | Compose 对应配置 | 说明 |
|---|---|---|
-d |
docker compose up -d |
后台运行 |
-p 8080:80 |
ports: - "8080:80" |
端口映射 |
-v /host:/container |
volumes: - /host:/container |
绑定挂载 |
-e KEY=VALUE |
environment: - KEY=VALUE |
环境变量 |
--name web |
服务名默认为容器名前缀 | 自动以 项目名_服务名_序号 命名 |
--restart always |
restart: always |
重启策略 |
--link db |
同一项目内服务名可直接 DNS 解析 | 无需 --link |
35.3 项目生命周期管理
| 阶段 | 命令 |
|---|---|
| 启动 | docker compose up -d |
| 停止 | docker compose stop 或 down |
| 重启 | docker compose restart |
| 删除 | docker compose down(默认保留 volume,加 -v 删除) |
| 扩展 | docker compose up -d --scale 服务名=数量 |
至此,Docker Compose 多容器编排学习完毕,后续可结合 Swarm 或 Kubernetes 进入容器集群管理。