外观
8. Docker Compose 核心概念
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过 YAML 配置文件来管理复杂的应用架构,实现一键部署和管理。
核心价值
Docker Compose 解决了单机多容器应用的编排问题,让开发者能够像管理单个应用一样管理整个微服务栈。
8.1 工作原理
Docker Compose 通过 docker-compose.yml 文件定义:
- 服务 (Services):容器实例的配置
- 网络 (Networks):服务间的通信桥梁
- 卷 (Volumes):数据持久化存储
- 配置 (Configs):运行时配置管理
8.2 最常用 Docker Compose 命令
8.2.1 核心管理命令
| 命令 | 说明 | 常用场景 |
|---|---|---|
docker-compose up -d | 后台启动所有服务 | 生产环境部署 |
docker-compose down | 停止并移除所有服务 | 清理测试环境 |
docker-compose ps | 查看服务运行状态 | 监控服务健康 |
docker-compose logs -f | 查看实时日志 | 调试和故障排查 |
docker-compose restart | 重启所有服务 | 配置更新后重启 |
高效使用技巧
- 使用
docker-compose up -d --build强制重新构建镜像 - 使用
docker-compose logs -f --tail=100查看最近 100 行日志
8.2.2 服务级操作命令
bash
# 针对特定服务操作
docker-compose up -d nginx # 只启动 nginx 服务
docker-compose logs -f app # 查看 app 服务日志
docker-compose restart database # 重启数据库服务
docker-compose exec app bash # 进入容器执行命令
# 构建和镜像管理
docker-compose build app # 构建特定服务镜像
docker-compose pull # 拉取所有服务镜像
docker-compose push # 推送自定义镜像1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
8.2.3 环境管理命令
bash
# 清理命令
docker-compose down -v # 移除容器和匿名卷
docker-compose down --rmi all # 移除容器和镜像
# 配置文件管理
docker-compose -f production.yml up -d # 指定配置文件
docker-compose config # 验证配置文件语法1
2
3
4
5
6
7
2
3
4
5
6
7
8.3 命名空间隔离机制
Docker Compose 通过项目 (Project) 概念实现命名空间隔离,确保不同应用间的资源互不干扰。
8.3.1 项目命名规则
bash
# 默认项目名:当前目录名
docker-compose up -d
# 自定义项目名
docker-compose -p myapp up -d
# 项目隔离效果
docker-compose -p dev ps # 查看开发环境服务
docker-compose -p prod ps # 查看生产环境服务1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
命名空间隔离原理
- 网络隔离:每个项目创建独立的 Docker 网络
- 容器命名:容器名格式为
{project_name}_{service_name}_{index} - 卷隔离:卷名包含项目名前缀
- 资源隔离:不同项目的资源完全独立
8.3.2 多环境部署实践
bash
# 开发环境
docker-compose -p dev -f docker-compose.yml -f docker-compose.dev.yml up -d
# 生产环境
docker-compose -p prod -f docker-compose.yml -f docker-compose.prod.yml up -d
# 测试环境
docker-compose -p test -f docker-compose.yml -f docker-compose.test.yml up -d1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
环境隔离最佳实践
- 使用不同的项目名前缀区分环境(dev/prod/test)
- 通过覆盖文件 (override files) 管理环境差异
- 定期清理不用的项目资源
8.3.3 资源命名示例
bash
# 项目名: webapp
# 服务名: nginx, app, db
# 生成的资源名
网络: webapp_default
容器: webapp_nginx_1, webapp_app_1, webapp_db_1
卷: webapp_nginx_data, webapp_db_data1
2
3
4
5
6
7
2
3
4
5
6
7
8.4 配置文件详解
8.4.1 基础配置结构
yaml
version: "3.8"
services: # 定义服务
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app
environment:
- NODE_ENV=production
networks:
- frontend
- backend
networks: # 定义网络
frontend:
driver: bridge
backend:
driver: bridge
volumes: # 定义卷
db_data:
driver: local1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
8.4.2 常用配置参数详解
8.4.2.1 服务级参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
image | string | 指定使用的 Docker 镜像 | image: nginx:alpine |
build | string/object | 从 Dockerfile 构建镜像 | build: ./app |
container_name | string | 指定容器名称 | container_name: myapp_web |
ports | array | 端口映射 (宿主机:容器) | ports: ["8080:80"] |
expose | array | 只做端口声明,不映射 | expose: ["3000"] |
volumes | array | 卷挂载(宿主机:容器) | volumes: ["./data:/app/data"] |
environment | array/object | 环境变量 | environment: ["NODE_ENV=prod"] |
env_file | string/array | 从文件加载环境变量 | env_file: .env |
command | string/array | 覆盖默认启动命令 | command: ["npm", "start"] |
entrypoint | string/array | 覆盖默认入口点 | entrypoint: ["/bin/bash"] |
working_dir | string | 设置工作目录 | working_dir: /app |
user | string | 指定运行用户 | user: "1000:1000" |
restart | string | 重启策略 | restart: unless-stopped |
重启策略
restart 的值可以是 no、always、on-failure、unless-stopped。
no:默认,不自动重启。always:不论是手动 stop,还是系统重启,该服务总是重启。on-failure:只有服务退出码非 0 时才重启。unless-stopped:类似 always,但手动 stop 之后不再自动重启;宿主机重启后会被重新拉起。
8.4.2.2 网络和通信参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
networks | array | 加入指定网络 | networks: ["frontend", "backend"] |
depends_on | array/object | 服务依赖关系 | depends_on: ["db", "redis"] |
links | array | 链接到其他服务 | links: ["db:database"] |
external_links | array | 链接外部容器 | external_links: ["redis:redis-server"] |
aliases | array | 网络别名 | aliases: ["web", "api"] |
服务依赖关系
depends_on仅控制启动顺序,不保证服务就绪。建议使用健康检查确保服务完全可用。links是 Docker 1 时代的老兼容语法,是直接把一个容器加入另一个容器的 /etc/hosts 并创建环境变量,现在使用networks来替代。external_links是用来链接外部容器,把宿主机上已经存在的容器(docker run 启动的,或别的 Compose 工程里的)拉进当前工程的 /etc/hosts,让当前服务能用别名访问它,现在使用networks的外部网络功能和aliases来替代。
8.4.2.3 资源限制参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
cpu_count | number | CPU 核心数限制 | cpu_count: 2 |
cpu_percent | number | CPU 使用百分比 | cpu_percent: 50 |
cpu_shares | number | CPU 共享权重 | cpu_shares: 1024 |
cpu_quota | number | CPU 时间配额 | cpu_quota: 50000 |
mem_limit | string | 内存限制 | mem_limit: 512m |
mem_reservation | string | 内存软限制 | mem_reservation: 256m |
memswap_limit | string | 交换内存限制 | memswap_limit: 1g |
8.4.2.4 健康检查和监控参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
healthcheck | object | 健康检查配置 | healthcheck: {test: ["CMD", "curl", "-f", "http://localhost"]} |
logging | object | 日志配置 | logging: {driver: json-file, options: {max-size: 10m}} |
ulimits | object | 系统限制 | ulimits: {nofile: {soft: 1024, hard: 2048}} |
8.4.2.5 网络配置参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
driver | string | 网络驱动 | driver: bridge |
driver_opts | object | 驱动选项 | driver_opts: {com.docker.network.bridge.name: mybridge} |
ipam | object | IP 地址管理 | ipam: {config: [{subnet: 172.20.0.0/16}]} |
internal | boolean | 内部网络 | internal: true |
external | boolean | 使用外部网络 | external: true |
8.4.2.6 卷配置参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
driver | string | 卷驱动 | driver: local |
driver_opts | object | 驱动选项 | driver_opts: {type: tmpfs, device: tmpfs} |
external | boolean | 使用外部卷 | external: true |
labels | object | 卷标签 | labels: {com.example: data} |
8.4.3 服务依赖管理
yaml
services:
web:
image: nginx
depends_on:
- app
- db
# 使用健康检查确保依赖服务就绪
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 101
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
8.5 ELK 栈部署案例
8.5.1 项目背景
学校网络运维团队需要搭建 ELK 平台收集网络设备日志,实现统一监控和故障排查。
8.5.2 Docker Compose 配置
yaml
version: "3.8"
services:
elasticsearch:
image: elasticsearch:8.4.3
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch"
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "xpack.security.enabled=false" # 禁用安全特性
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
networks:
- elk_network
healthcheck:
test:
["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
kibana:
image: kibana:8.4.3
container_name: kibana
depends_on:
elasticsearch:
condition: service_healthy
environment:
- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
- "I18N_LOCALE=zh-CN"
ports:
- "5601:5601"
networks:
- elk_network
logstash:
image: logstash:8.4.3
container_name: logstash
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
- ./logstash/config:/usr/share/logstash/config
ports:
- "5044:5044" # Filebeat 输入
- "4560:4560" # HTTP 输入
depends_on:
elasticsearch:
condition: service_healthy
networks:
- elk_network
networks:
elk_network:
driver: bridge
volumes:
elasticsearch_data:
driver: local1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
8.5.3 部署和验证
bash
# 创建项目目录结构
mkdir -p elk/{logstash/{pipeline,config},elasticsearch/config}
# 启动服务
docker-compose -p elk up -d
# 验证服务状态
docker-compose -p elk ps
# 查看日志
docker-compose -p elk logs -f elasticsearch
# 停止服务
docker-compose -p elk down1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
生产环境优化
- 配置 Elasticsearch 集群模式
- 启用 X-Pack 安全特性
- 配置持久化存储
- 设置资源限制
8.6 最佳实践
8.6.1 开发环境规范
yaml
# docker-compose.dev.yml
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
8.6.2 生产环境配置
yaml
# docker-compose.prod.yml
version: "3.8"
services:
app:
image: myapp:${TAG:-latest}
environment:
- NODE_ENV=production
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
restart_policy:
condition: on-failure1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8.6.3 安全注意事项
安全风险防范
- 避免在生产环境使用
latest标签 - 定期更新基础镜像版本
- 使用 secrets 管理敏感信息
- 配置适当的网络隔离
8.6.4 性能优化建议
性能调优要点
- 合理配置资源限制
- 使用多阶段构建减少镜像大小
- 配置健康检查和重启策略
- 优化卷挂载性能