Compose 编排实操
02 篇讲清了"Docker vs Compose 是什么关系"(单容器工具 vs 多容器编排),本篇动手把它用起来。学完你会发现:Compose 就是一份 yaml 说明书 + 一个把说明书变成现实的命令——而它正是再次出发组所有服务的实际运行形态。
一、从三条 docker run 到一份 yaml
假设要跑"网站 + 数据库",散装写法:
docker network create site
docker run -d --name db --network site-net -e MYSQL_ROOT_PASSWORD=secret -v dbdata:/var/lib/mysql mysql:8
docker run -d --name web --network site-net -p 8080:80 -v /root/docker_data/web:/usr/share/nginx/html nginx
命令长了难维护、重启顺序靠人脑、换服务器要重敲一遍。换成 Compose,把同样的信息写进 compose.yaml:
services:
web:
image: nginx
container_name: web
ports:
- "8080:80"
volumes:
- /root/docker_data/web:/usr/share/nginx/html
depends_on:
- db
restart: unless-stopped
db:
image: mysql:8
container_name: db
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
字段对照(全部来自前几篇的散装知识):
| yaml 字段 | 对应的 docker 概念 |
|---|---|
image |
run 的镜像名 |
ports |
-p 端口映射 |
volumes |
-v 数据卷(顶层 volumes: 声明的是命名卷) |
environment |
-e 环境变量 |
depends_on |
启动顺序(db 先于 web 起) |
restart: unless-stopped |
崩溃/开机自愈(生产必配) |
一个文件读下来就是整套部署方案——配置即文档。
二、四个命令走天下
docker compose up -d # 一键拉起全部服务(自动建网络+卷,缺镜像自动 pull)
docker compose ps # 本组容器状态
docker compose logs -f # 全组日志
docker compose down # 全组拆除(容器+网络;加 -v 连卷一起删,慎用)
改了 yaml 之后怎么办?再跑一遍 up -d——Compose 会对比差异,只重建变了的服务。停某单个服务:docker compose stop web(范围限定在本组)。
v1 与 v2 的写法
老教程里是 docker-compose(带横线,v1 独立程序);现在推荐 docker compose(空格,v2 是 Docker 插件,随 Docker 一起装)。两者命令几乎一致,遇到 docker-compose: command not found 就换空格写法。再次出发组两种写法都出现过,就是这段历史。
三、depends_on 只管"先起",不管"就绪"
一个高频坑:depends_on 保证 db 容器启动在 web 之前,但 MySQL 启动到能接受连接需要几秒到几十秒——web 可能已经连不上数据库崩了。应对方式:
- 应用层加重试(最常见);
- Compose 的
healthcheck+condition: service_healthy(v2.20+ 写法,细节用时再查)。
知道有这个坑,报 connection refused 时先怀疑时序,别急着重启。
四、闭环:Dockge 就是 Compose 的可视化
再次出发组 极简三剑客 里强推的 Dockge,本质就是这份 yaml 的可视化编辑器:/opt/stacks 里一个文件夹一个服务,每个文件夹里躺着一篇 compose.yaml——在 Dockge 网页上点"部署",等于在对应目录跑 docker compose up -d;"打包带走换服务器",就是把这个文件夹拷走。
学到这里,回头看完整指南里每个服务的部署片段(image/ports/volumes/restart),应该全部能自己读懂了。
五、自查清单
学完 Compose,用这份清单验收:
- 能手写一个含 ports/volumes/environment 的 compose.yaml
- 知道改完 yaml 用
up -d重建而不是 down 再 up - 知道
down和down -v的区别(数据在不在) - 知道容器互联靠服务名,不查 IP
- 知道 Dockge 与 compose.yaml 的对应关系
概念、命令、镜像构建、数据网络、编排五篇全部就位,最后看两个把它们串起来的完整实战——在 Docker 里部署在线编译器并挂到公网:docker 部署网页编译器。
⬅️ 数据卷与网络 🏠 00-网络与项目 ➡️ docker部署网页编译器
💬 评论