# Docker Compose 编排 ## 场景 一个应用要连数据库、缓存、反向代理,几个容器一起起,手工 `docker run` 太麻烦。 ## 前置条件 - 已装 Docker 和 compose 插件(`docker compose version`) - 目录规划好:配置文件、数据卷分开 - 想清楚数据卷放哪,别用匿名卷 ## 配置 ```yaml # 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" ``` ```bash docker compose up -d docker compose ps docker compose logs -f app docker compose down # 保留数据 docker compose down -v # 连数据卷一起删 ``` ## 验证 ```bash docker compose ps docker compose config # 渲染后的配置 curl -I http://127.0.0.1:8080 ``` ## 回滚 ```bash docker compose down docker compose up -d # 回到上一个镜像版本前先改 image tag ``` ## 坑 - **`down -v` 会删掉命名卷**,数据全没,执行前看清。 - `depends_on` 默认只等容器启动,不等服务就绪,要配 `healthcheck` + `condition`。 - 相对路径 `./data` 是相对 compose 文件所在目录,不是当前目录。 - 环境变量写在 `.env` 里不要提交到 Git。 - 改完 compose 文件要 `up -d` 才会生效,只 `restart` 不改配置。 - 多个 compose 项目在同一台机器上,项目名冲突会互相覆盖。