--- title: "07-Compose-编排实操" created: 2026-09-01 tags: - 项目筑基 --- # Compose 编排实操 02 篇讲清了"Docker vs Compose 是什么关系"(单容器工具 vs 多容器编排),本篇动手把它用起来。学完你会发现:**Compose 就是一份 yaml 说明书 + 一个把说明书变成现实的命令**——而它正是再次出发组所有服务的实际运行形态。 ## 一、从三条 docker run 到一份 yaml 假设要跑"网站 + 数据库",散装写法: ```bash 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`: ```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` | 崩溃/开机自愈(生产必配) | 一个文件读下来就是整套部署方案——**配置即文档**。 ## 二、四个命令走天下 ```bash docker compose up -d # 一键拉起全部服务(自动建网络+卷,缺镜像自动 pull) docker compose ps # 本组容器状态 docker compose logs -f # 全组日志 docker compose down # 全组拆除(容器+网络;加 -v 连卷一起删,慎用) ``` 改了 yaml 之后怎么办?**再跑一遍 `up -d`**——Compose 会对比差异,只重建变了的服务。停某单个服务:`docker compose stop web`(范围限定在本组)。 > [!tip] v1 与 v2 的写法 > 老教程里是 `docker-compose`(带横线,v1 独立程序);现在推荐 `docker compose`(空格,v2 是 Docker 插件,随 Docker 一起装)。两者命令几乎一致,遇到 `docker-compose: command not found` 就换空格写法。再次出发组两种写法都出现过,就是这段历史。 ## 三、depends_on 只管"先起",不管"就绪" 一个高频坑:`depends_on` 保证 db **容器启动**在 web 之前,但 MySQL 启动到能接受连接需要几秒到几十秒——web 可能已经连不上数据库崩了。应对方式: 1. 应用层加重试(最常见); 2. Compose 的 `healthcheck` + `condition: service_healthy`(v2.20+ 写法,细节用时再查)。 知道有这个坑,报 connection refused 时先怀疑时序,别急着重启。 ## 四、闭环:Dockge 就是 Compose 的可视化 再次出发组 [[05-极简三剑客 Dockge + FileBrowser|极简三剑客]] 里强推的 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 里部署在线编译器并挂到公网:[[08-docker部署网页编译器|docker 部署网页编译器]]。 --- ⬅️ [[06-数据卷与网络|数据卷与网络]] 🏠 [[00-网络与项目|00-网络与项目]] ➡️ [[08-docker部署网页编译器|docker部署网页编译器]]