Docker Compose 编排
场景
一个应用要连数据库、缓存、反向代理,几个容器一起起,手工 docker run 太麻烦。
前置条件
- 已装 Docker 和 compose 插件(
docker compose version) - 目录规划好:配置文件、数据卷分开
- 想清楚数据卷放哪,别用匿名卷
配置
# docker-compose.yml
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: appdb
volumes:
- ./data/mysql:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
interval: 10s
retries: 5
app:
image: registry.corp.local/app:1.2.0
restart: always
depends_on:
db:
condition: service_healthy
environment:
DB_HOST: db
volumes:
- ./config:/app/config:ro
ports:
- "8080:8080"
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose down # 保留数据
docker compose down -v # 连数据卷一起删
验证
docker compose ps
docker compose config # 渲染后的配置
curl -I http://127.0.0.1:8080
回滚
docker compose down
docker compose up -d # 回到上一个镜像版本前先改 image tag
坑
down -v会删掉命名卷,数据全没,执行前看清。depends_on默认只等容器启动,不等服务就绪,要配healthcheck+condition。- 相对路径
./data是相对 compose 文件所在目录,不是当前目录。 - 环境变量写在
.env里不要提交到 Git。 - 改完 compose 文件要
up -d才会生效,只restart不改配置。 - 多个 compose 项目在同一台机器上,项目名冲突会互相覆盖。