15.8.1 Compose核心概念与适用场景

Compose核心概念与适用场景#

Compose 通过一个 docker-compose.yml 将多服务、网络、存储卷与依赖关系定义为可复用的应用栈,适合快速搭建一致的开发/测试环境与中小规模部署。其核心理念是“声明式配置 + 一键编排”。

原理草图(服务、网络、卷关系)

文章图片

核心概念
- Project(项目):Compose 运行时的逻辑单元,默认使用目录名作为项目名(可用 -p 覆盖)。
- Service(服务):定义镜像、端口、环境变量、卷等,Compose 会创建同名容器实例。
- Network(网络):服务间通信的逻辑网络,默认创建 project_default
- Volume(卷):持久化数据,容器重建后仍可保留数据。
- Config/Secret(配置/密文):管理配置与敏感信息,提升安全性与一致性。


安装与验证(示例)#

以下以 Docker Compose V2(集成在 Docker CLI)为例。

1)安装(Linux)

# 安装 Docker Engine 后,Compose V2 默认随 Docker 安装
docker version
docker compose version

2)验证

docker compose version
# 预期输出:Docker Compose version v2.x.x

最小可用示例(可执行)#

目录结构

./compose-demo/
├── docker-compose.yml
└── .env

.env

MYSQL_ROOT_PASSWORD=Root@123
MYSQL_DATABASE=appdb

docker-compose.yml

version: "3.9"

services:
  db:
    image: mysql:8.0
    container_name: demo-db
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app_net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  web:
    image: nginx:1.25
    container_name: demo-web
    ports:
      - "8080:80"
    depends_on:
      db:
        condition: service_healthy
    networks:
      - app_net

networks:
  app_net:

volumes:
  db_data:

启动与验证

cd compose-demo
docker compose up -d
docker compose ps

预期效果:
- 访问 http://localhost:8080 返回 Nginx 默认页
- demo-db 通过健康检查后,demo-web 才启动


关键命令(含解释)#

# 1. 启动(后台)
docker compose up -d

# 2. 查看服务状态
docker compose ps

# 3. 查看日志(跟随)
docker compose logs -f

# 4. 进入容器
docker compose exec web /bin/sh

# 5. 停止并移除容器(保留卷)
docker compose down

# 6. 停止并移除容器与卷(谨慎,数据会清空)
docker compose down -v

适用场景#

  • 本地开发与联调:快速启动数据库、缓存、消息队列等依赖。
  • 测试与预发布:一键部署、回滚方便,环境可复现。
  • 中小规模生产:对弹性与调度要求不高时,部署简单、成本低。
  • 微服务原型验证:快速验证服务拓扑与依赖关系。

不适用或需谨慎
- 大规模集群:缺乏自动扩缩、调度与服务治理能力。
- 严格高可用/多区域:建议 Kubernetes 或混合方案。


常见排错(含命令)#

1)容器启动失败

docker compose ps
docker compose logs -f <service>
  • 常见原因:端口冲突、环境变量缺失、镜像拉取失败。

2)端口冲突

ss -lntp | grep 8080
# 修改 docker-compose.yml 的端口映射后重启
docker compose up -d

3)服务依赖未就绪

docker compose logs -f db
# 检查 healthcheck 是否通过

4)卷权限问题(尤其是数据库)

docker compose exec db id
ls -ld /var/lib/mysql
  • 解决:使用官方镜像默认目录,避免自定义宿主机目录权限不匹配。

练习#

  1. 将示例中的 Nginx 端口改为 8090,重新启动并验证访问。
  2. web 增加一个自定义环境变量 APP_ENV=dev,进入容器查看是否生效。
  3. 添加一个 redis 服务并与 web 同网段通信(只需启动,不必应用层联动)。
  4. 执行 docker compose down -v,验证 db_data 数据是否被删除(谨慎操作)。