SuperAPI AI 工具集

docker-compose

部署与运维

查看项目

更新于 10-15 12:23

技能介绍

用途

Docker Compose 技能用于指导编写生产级的 Docker Compose 配置,面向多容器应用的编排。当用户提到 docker compose、docker-compose.yml、compose 文件、compose 怎么写、compose 配置、多容器、multi-container、服务编排、depends_on、profiles、override、compose network、compose volume 等关键词时,应使用该技能。

主要能力

完整文件结构

compose.yml 的顶层结构包括:

  • name:项目名称
  • services:容器定义
  • networks:网络拓扑
  • volumes:持久化存储
  • secrets:敏感数据(Swarm)
  • configs:非敏感配置(Swarm)

服务核心配置

services 下可配置:

  • image:从镜像仓库拉取,如 myapp:${TAG:-latest}
  • build:从 Dockerfile 构建,可指定 context 与 dockerfile
  • container_name:显式容器名(可选)
  • hostname:主机名
  • ports:端口映射,支持 host:container、绑定到 localhost(如 127.0.0.1:8443:443)、UDP(如 8080:8080/udp)
  • environment:环境变量,服务名即主机名
  • env_file:从文件加载环境变量
  • volumes:命名卷、只读绑定挂载(:ro)、读写绑定挂载
  • depends_on:依赖控制,可配合 condition: service_healthy 或 service_started
  • healthcheck:健康检查,含 test、interval、timeout、retries、start_period
  • restart:重启策略,如 unless-stopped
  • deploy:仅 Swarm 使用,含 replicas、resources.limits(cpus、memory)
  • profiles:可选服务标记

网络

  • 默认网络:Compose 自动创建默认 bridge 网络,所有服务可通过服务名互相访问。未暴露端口的服务仅能被其他服务访问。
  • 自定义网络:可定义 frontend(对外)与 backend(internal: true,禁止外部访问),服务可加入多个网络,实现隔离。

环境变量

三种方式:

  • environment:写在 compose.yml 中,适合简单、少量变量
  • env_file:外部文件如 .env.production,适合大量变量、区分环境
  • .env 文件:项目根目录自动加载,用于默认值与 $VARIABLE 替换

.env 示例:TAG=v1.2.3、DB_PASSWORD=secret123,在 compose.yml 中通过 ${TAG:-latest}、${DB_PASSWORD} 引用。

依赖与启动顺序

depends_on 可指定 condition:service_healthy(等待健康检查通过)或 service_started(等待启动)。配合 healthcheck 使用,例如 db 服务使用 pg_isready 检查。

Profiles 可选服务

通过 profiles 标记可选服务,如 debug-tools 标记 [debug]、elasticsearch 标记 [analytics],仅在 docker compose --profile debug up 时启动。

多环境 Override

  • compose.yml:基础配置
  • compose.override.yml:本地开发覆盖(自动应用)
  • compose.prod.yml:生产覆盖

本地使用 docker compose up -d 自动合并 override;生产使用 docker compose -f compose.yml -f compose.prod.yml up -d 显式指定。

迁移到 Kubernetes

使用 kompose convert -f compose.yml 生成 K8s YAML,再 kubectl apply -f .

使用方式(推荐编排流程)

  1. 规划服务:列出所有服务、端口、数据卷、环境变量
  2. 编写 compose.yml:定义 services/networks/volumes
  3. 配置依赖:depends_on + condition: service_healthy
  4. 本地验证:docker compose up -d → docker compose ps → docker compose logs
  5. 生产部署:添加资源限制、重启策略、日志轮转 → docker compose -f compose.yml -f compose.prod.yml up -d

常见陷阱

  • depends_on 无 healthcheck:depends_on 只等待容器启动,不等待就绪。应添加 condition: service_healthy 与 healthcheck 块,并用 docker compose ps 验证健康状态。
  • 端口冲突:多个服务不能绑定同一主机端口。应使用不同主机端口,或对仅内部访问的服务移除 ports(通过服务名通信)。
  • 绑定挂载路径:相对路径基于 compose 文件所在位置解析。应使用 ./config 而非 config/,并用 docker compose config 验证解析路径。
  • .env 文件安全:.env 常含密钥。应将 .env 加入 .gitignore,Swarm 使用 Docker secrets,使用 .env.example 存放占位值。
  • docker compose 与 docker-compose:现代语法为 docker compose(插件),docker-compose(独立二进制)已弃用,应始终使用带空格的 docker compose。

适用场景与限制

能做:

  • 多容器应用编排:services/networks/volumes/secrets/configs 完整定义
  • 环境管理:.env / env_file / override 文件策略
  • 依赖控制:depends_on + healthcheck + profiles

需条件:

  • 多主机部署:需迁移到 Swarm(docker stack deploy)或 K8s
  • 滚动更新/自动扩缩:Compose 不支持,需 Swarm 或 K8s

超范围:

  • 编写 Dockerfile:使用 docker-dockerfile
  • K8s 部署:使用 kompose convert + K8s 技能
  • 云服务编排(Terraform):IaaC 工具

不适用场景:单容器应用(用 docker-run)、编写 Dockerfile(用 docker-dockerfile)、Kubernetes 部署(用 K8s manifests / Helm charts)、Docker 基础(用 docker-basics)。

安全与稳定性建议

  • 后端网络使用 internal: true 防止外部访问
  • 不要提交含密钥的 .env 文件,使用 CI secrets 或 Docker Swarm secrets
  • 单主机生产 Compose:结合 systemd 实现开机自启
  • 多主机生产:迁移到 Swarm(docker stack deploy)或 Kubernetes

官方文档参考

  • Docker Compose 概述:https://docs.docker.com/compose/
  • Compose 文件参考:https://docs.docker.com/reference/compose-file/
  • Compose CLI:https://docs.docker.com/reference/cli/docker/compose/
  • 环境变量:https://docs.docker.com/compose/environment-variables/
  • Compose 网络:https://docs.docker.com/compose/networking/
  • 生产环境 Compose:https://docs.docker.com/compose/production/