本节摘要:compose 命令族是把叁部容器命令升级到"整组视角"的版本:up 起全组、ps 看全组、logs 收全组日志、exec 进指定服务、down 收全组。本节按一次完整的启动到下线轮回走现场,每个命令都给出与散装 docker 命令的等价对照,顺带交代 -d、-v、--scale 等高频义项。
项目里服务一多,起要敲一长串 run,停要挨个 stop——compose 命令族把这些动作收拢成"以项目为单位"的整组操作。本节现场沿用上一节那份文件,从空目录到全组上线再全组收摊,走完一个标准轮回。
$ docker compose up -d [+] Running 6/6 ✔ Network composeproj_default Created ✔ Volume "composeproj_dbdata" Created ✔ Container composeproj-db-1 Started ✔ Container composeproj-cache-1 Started ✔ Container composeproj-api-1 Started ✔ Container composeproj-web-1 Started
读这份输出:Compose 自动建了默认网络(陆部说过的自动组网)与顶级声明的卷,容器名按"项目-服务-序号"规则生成。up 首次执行会补齐网络与卷,之后复跑只做增量。-d 与叁部 run 的义项同义:放后台;不加它,四组日志会合流刷屏——开发时看整体动静,调试单个服务时再按 Ctrl+C 收回前台。
等价对照帮着建立映射:这一条 up 约等于一组 docker network create、docker volume create 加四条 docker run,而且启动顺序、健康检查等待都替你排好了。
$ docker compose ps NAME IMAGE STATUS composeproj-web-1 nginx:1.25 Up 10 minutes composeproj-api-1 composeproj-api Up 10 minutes composeproj-db-1 postgres:16 Up 10 minutes (healthy) composeproj-cache-1 redis:7.2 Up 10 minutes $ docker compose logs api -n 5 composeproj-api-1 | [INFO] listening on 9000 $ docker compose exec db psql -U postgres -c "select 1" ?column? ---------- 1
ps 默认只列本项目的容器,STATUS 里的 healthy 来自 7.1 声明的 healthcheck;logs 可以点名服务(api)、配 -f 跟踪、-n 取尾部,比在 docker logs 里记容器全名省事得多;exec 与叁部词条同构,只是对象从容器名换成了服务名。这套"服务名直达"的糖衣,是 compose 命令族对散装命令的最大体验升级。
$ sed -i 's/listening on 9000/listening on 9001/' api/config.yml $ docker compose up -d ✔ Container composeproj-api-1 Recreated ✔ Container composeproj-web-1 Running $ docker compose down ✔ Container composeproj-web-1 Removed ... ✔ Network composeproj_default Removed $ docker volume ls | grep composeproj local composeproj_dbdata
复跑 up 时 Compose 只动配置变了的服务:api 被 Recreated,web 原样 Running——这个"按需重建"就是 Compose 版的滚动更新。down 拆掉容器与网络,但卷默认留下,dbdata 在下一个轮回里继续服役;确认数据也不要了才上 -v。这条删与留的边界值得背下来:容器网络可再生,卷里是数据。
⚠️ 常见坑:在错误目录敲 compose 命令,会报 no configuration file provided——compose 靠当前目录找 compose 文件,目录不对等于项目不对。多项目并行时用 -f 指定文件、-p 指定项目名,别靠 cd 搬运气。
docker compose up [-d] [--build] [--scale 服务=数量] # 起全组 docker compose ps [-a] # 整组状态 docker compose logs [-f] [-n N] [服务] # 合流日志 docker compose exec 服务 命令 # 进指定服务 docker compose restart [服务] # 重启全组或单服务 docker compose stop / start # 停与再起(不拆容器) docker compose down [-v] [--rmi all] # 收全组 docker compose config [-q] # 校验与反解文件
stop 与 down 的分工:stop 只是全组停靠(容器还在,start 即复活),down 是拆组(容器与网络删除)。--scale 让单个服务横向复制多份,web 前加负载均衡即可消费多实例;--build 则强制先重新构建再起,配 7.1 的 build 字段使用。
💡 习惯建议:把
docker compose up -d --build设为开发环境的默认起手式——代码改了镜像就该重建,忘了 --build 的"改了没生效"至少浪费半根咖啡。
命令都熟了,下一节把网关、应用、数据库三个服务拧成一个真实项目:启动竞态、健康检查、滚动重建一次讲透。