Docker Compose 编排入门
容器一多,一条条 docker run 既长又难维护。Compose 把一组容器的配置写进 YAML 文件,一条命令拉起整个应用。本章介绍 Compose v2 的文件骨架、常用命令与 docker run 的对应关系。
为什么需要编排
一个 Web 应用往往要同时跑前端、后端、数据库、缓存,手工管理网络、数据卷、端口极易出错。docker-compose.yml 把「一组容器怎么跑」声明成配置,项目可复现、可交接。
文件骨架
docker-compose.yml 顶层通常有三个 key:services 定义容器,volumes 声明命名卷,networks 声明自定义网络:
services: # 核心:每个 key 定义一个容器
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata: # 声明命名卷,供上面引用
networks:
default: # 不写也行,默认自动建
同一项目的服务自动加入同一网络,容器之间直接用服务名当主机名互访(如连数据库写 db:3306)。
常用命令
在 docker-compose.yml 所在目录执行;默认项目名取目录名,可用 -p 覆盖:
| 命令 | 作用 |
|---|---|
| docker compose up -d | 后台启动(首次自动构建/拉镜像) |
| docker compose down | 停止并删除容器与默认网络 |
| docker compose ps | 查看项目内容器状态 |
| docker compose logs -f | 跟随日志,--tail 100 只看末尾 |
| docker compose exec web sh | 进入容器执行命令 |
| docker compose restart | 重启某服务 |
| docker compose config | 校验并展开完整配置 |
docker compose up -d
# 输出:[+] Running 3/3 db Started ... web Started
docker compose ps
docker compose logs -f --tail 100 web
docker compose down # 加 -v 会连命名卷一起删,慎用!
与 docker run 对照
compose 字段基本都能对应 docker run 参数,记住这张表就能无障碍迁移:
| compose 字段 | 等价 docker run |
|---|---|
| image: nginx | docker run nginx |
| ports: ["8080:80"] | -p 8080:80 |
| environment: KEY: value | -e KEY=value |
| volumes: dbdata:/var/lib/mysql | -v dbdata:/var/lib/mysql |
| restart: unless-stopped | --restart unless-stopped |
| depends_on: [db] | 先启动 db(顺序依赖) |
一个小而全的示例
web 连 db:代码里数据库地址直接写服务名 db,无需关心容器 IP:
services:
web:
build: .
ports:
- "8080:3000"
environment:
DB_HOST: db
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: shop
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
docker compose up -d # 项目目录下执行
curl http://localhost:8080
小结
Compose 把多容器应用的启动说明书沉淀进 docker-compose.yml:services 定义容器、volumes/networks 声明共享资源,up/down/ps/logs/exec 覆盖日常操作;字段与 docker run 一一对应,会对照就会写。