Docker Compose 编排入门

容器一多,一条条 docker run 既长又难维护。Compose 把一组容器的配置写进 YAML 文件,一条命令拉起整个应用。本章介绍 Compose v2 的文件骨架、常用命令与 docker run 的对应关系。

为什么需要编排

Compose 编排 vs 多条 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: nginxdocker 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 一一对应,会对照就会写。

笔记加载中…