Oamc

Docker Compose 编排

本页目录

场景

一个应用要连数据库、缓存、反向代理,几个容器一起起,手工 docker run 太麻烦。

前置条件

  • 已装 Docker 和 compose 插件(docker compose version)
  • 目录规划好:配置文件、数据卷分开
  • 想清楚数据卷放哪,别用匿名卷

配置

# 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"
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose down          # 保留数据
docker compose down -v       # 连数据卷一起删

验证

docker compose ps
docker compose config        # 渲染后的配置
curl -I http://127.0.0.1:8080

回滚

docker compose down
docker compose up -d         # 回到上一个镜像版本前先改 image tag

坑

  • down -v 会删掉命名卷,数据全没,执行前看清。
  • depends_on 默认只等容器启动,不等服务就绪,要配 healthcheck + condition。
  • 相对路径 ./data 是相对 compose 文件所在目录,不是当前目录。
  • 环境变量写在 .env 里不要提交到 Git。
  • 改完 compose 文件要 up -d 才会生效,只 restart 不改配置。
  • 多个 compose 项目在同一台机器上,项目名冲突会互相覆盖。