深色模式
docker-compose 多容器编排
摘要:单机上要跑多个互相依赖的容器时,手写一堆
docker run不可维护。本文用一份 compose 文件定义 Web + MySQL + Redis,覆盖启动顺序、健康检查、数据卷、网络与常用运维命令。
适用环境
- 已安装 Docker(含
docker compose插件,注意是空格不是横线) - 内存 ≥ 4G
- 示例镜像:
nginx:alpine、mysql:8、redis:7-alpine
操作步骤
一、确认插件可用
bash
docker compose version1
若提示命令不存在,回到官方安装文档补装 docker-compose-plugin。
二、编写 compose.yaml
yaml
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
db:
condition: service_healthy
networks:
- app-net
restart: unless-stopped
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: ExamplePass123
MYSQL_DATABASE: appdb
volumes:
- db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-net
restart: unless-stopped
cache:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- cache-data:/data
networks:
- app-net
restart: unless-stopped
volumes:
db-data:
cache-data:
networks:
app-net:
driver: bridge1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
关键设计:
depends_on的condition: service_healthy让 web 等数据库真正就绪再启动,而不是等它「容器起来了」。- 数据卷用命名卷,不绑宿主路径,方便迁移。
- 三个服务在同一
app-net,可直接用服务名互访:db:3306、cache:6379。
三、用 .env 管理变量
bash
cat > .env <<'EOF'
MYSQL_ROOT_PASSWORD=ExamplePass123
WEB_PORT=8080
EOF1
2
3
4
2
3
4
yaml
services:
web:
ports:
- "${WEB_PORT}:80"
db:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}1
2
3
4
5
6
7
2
3
4
5
6
7
四、启动与管理
bash
docker compose up -d # 后台启动全部服务
docker compose ps # 查看状态
docker compose logs -f web # 只看 web 的日志
docker compose logs -f --tail=100 # 全部服务最后 100 行
docker compose exec db sh # 进容器
docker compose up -d --scale web=3 # 扩容 web 到 3 个
docker compose stop # 停止但保留容器
docker compose down # 停止并移除容器、网络
docker compose down -v # 连数据卷一起删1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
危险
docker compose down -v 会永久删除 compose 文件里声明的所有命名卷,数据库数据不可恢复。生产环境执行前必须先备份。
五、修改配置后的生效方式
bash
docker compose up -d # 只重建有变化的服务
docker compose restart web # 仅重启,不重建(配置变更时不够)1
2
2
改了 environment 或挂载文件必须 up -d 重建,restart 不会重新注入环境变量。
验证
- [ ]
docker compose ps三个服务均为running(db 还需 healthy) - [ ]
curl http://127.0.0.1:8080可访问 - [ ]
docker compose exec web ping -c 2 db能解析并通 - [ ] 写入数据库后
down再up -d,数据仍在
常见坑
- web 先于 db 起来导致连不上:
depends_on默认只等容器启动不等就绪,必须配condition: service_healthy。 - 端口冲突
address already in use:宿主 8080 被占用,改.env里的WEB_PORT或停掉占用进程。 - 改了 compose 文件没生效:只执行了
restart,需要用up -d触发重建。 docker-compose(带横线)命令找不到:新版是插件形式docker compose(空格),旧式 Python 版已弃用。- 数据莫名丢失:误用了
down -v,或把 volume 定义写成了./data:/var/lib/mysql后清空了宿主目录。