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
- 解决:使用官方镜像默认目录,避免自定义宿主机目录权限不匹配。
练习#
- 将示例中的 Nginx 端口改为
8090,重新启动并验证访问。 - 为
web增加一个自定义环境变量APP_ENV=dev,进入容器查看是否生效。 - 添加一个
redis服务并与web同网段通信(只需启动,不必应用层联动)。 - 执行
docker compose down -v,验证db_data数据是否被删除(谨慎操作)。