Docker Compose 编排说明 🐳 📖 目录导航 ✨ Docker Compose 特点与优势 🚀 一、
Docker Compose 编排说明 🐳
📖 目录导航
✨ Docker Compose 特点与优势
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,具有以下特点:
- 🏗️ 简化部署:使用 YAML 文件定义多容器应用,一键部署
- 🔄 环境一致性:确保开发、测试和生产环境的一致性
- 📋 声明式配置:通过配置文件管理应用服务、网络和卷
- ⚡ 快速启动:一条命令即可启动整个应用栈
- 🔗 服务依赖:自动处理服务间的依赖关系和启动顺序
- 🌐 网络管理:自动创建容器网络,方便服务间通信
- 📦 版本控制:配置文件可纳入版本控制系统
- 🔧 灵活扩展:支持多环境配置和扩展字段
- 📊 资源管理:可限制容器使用的 CPU 和内存资源
🚀 一、快速创建 Docker Compose 文件
1
2
3
4
5
6
7
8
9
10
|
# 创建目录并初始化 docker-compose.yml 文件
mkdir -p /mnt/mydisk/home/toolbox && cd $_ && \
cat > /mnt/mydisk/home/toolbox/docker-compose.yml <<'EOF'
services:
# 在这里添加你的服务配置
EOF
# 启动服务
cd /mnt/mydisk/home/toolbox && docker-compose up -d
|
📝 二、Docker Compose 文件详细说明
基本结构示例
1
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
|
version: "3.8" # 使用的 Docker Compose 文件版本
services: # 定义服务
toolbox: # 服务名称(可自定义)
container_name: toolbox # 容器名称(可自定义)
image: cleverest/toolbox:latest # 镜像版本
restart: unless-stopped # 重启策略
network_mode: bridge # 网络模式
ports: # 端口映射
- "8383:80" # 宿主机端口:容器端口
volumes: # 卷映射
- /var/run/docker.sock:/var/run/docker.sock # Docker 引擎交互
- ./app/data:/app/data # 相对路径映射
- /mnt:/mnt # 绝对路径映射
environment: # 环境变量
- TZ=Asia/Shanghai # 时区设置
- PUID=1000 # 用户ID
- PGID=1000 # 用户组ID
extra_hosts: # 主机映射
- "api.telegram.org:149.154.167.220"
- "api.tmdb.org:18.66.102.107"
hostname: toolbox # 容器主机名
command: ["--debug"] # 覆盖默认启动命令
depends_on: # 服务依赖
- database
- redis
database: # 另一个服务示例
image: postgres:13
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- db_data:/var/lib/postgresql/data
volumes: # 定义命名卷
db_data:
|
⚙️ 三、配置项详解
1️⃣ Docker 重启策略
1
2
3
4
|
restart: "no" # ❌ 容器退出时不重启(默认值)
restart: always # 🔄 总是重启容器(无论退出状态)
restart: on-failure # ⚠️ 仅在非零退出状态时重启
restart: unless-stopped # 🛑 除非手动停止,否则总是重启
|
2️⃣ 端口映射
1
2
3
4
5
6
|
ports:
- "8383:80" # 将宿主机的8383端口映射到容器的80端口
- "8443:443" # 将宿主机的8443端口映射到容器的443端口
- "9000:9000/tcp" # 指定TCP协议
- "9000:9000/udp" # 指定UDP协议
- "49100-49200:3000-3100" # 端口范围映射
|
3️⃣ 卷映射
1
2
3
4
5
6
7
8
9
10
11
12
13
|
volumes:
# 绑定挂载(主机路径:容器路径)
- /host/path:/container/path # 绝对路径
- ./relative/path:/container/path # 相对路径(相对于Compose文件)
# 命名卷(需要在顶层volumes部分定义)
- named_volume:/container/path
# 匿名卷(不推荐,难以管理)
- /container/path
# 只读挂载
- /host/path:/container/path:ro
|
4️⃣ 环境变量
1
2
3
4
5
6
7
8
9
10
11
12
|
environment:
- TZ=Asia/Shanghai # 设置时区
- PUID=1000 # 设置用户ID
- PGID=1000 # 设置组ID
- DEBUG=true # 布尔值
- MAX_CONNECTIONS=100 # 数字值
# 或者使用字典格式
environment:
TZ: Asia/Shanghai
PUID: 1000
PGID: 1000
|
5️⃣ 网络模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 使用默认的桥接网络
network_mode: bridge
# 使用主机网络(容器直接使用主机网络栈)
network_mode: host
# 使用其他容器的网络栈
network_mode: service:service_name
# 使用自定义网络(推荐用于多容器应用)
networks:
- frontend
- backend
# 在文件底部定义网络
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 内部网络,不对外暴露
|
6️⃣ 主机映射
1
2
3
4
|
extra_hosts:
- "api.telegram.org:149.154.167.220" # 域名:IP
- "api.tmdb.org:18.66.102.107"
- "local.example.com:127.0.0.1"
|
7️⃣ 容器主机名
1
2
|
hostname: my-container # 设置容器主机名
domainname: example.com # 设置容器域名
|
🛠️ 四、高级配置示例
资源限制
1
2
3
4
5
6
7
8
|
deploy:
resources:
limits:
memory: 2G # 💪 内存限制(根据需求调整)
cpus: '2.0' # ⚡ CPU限制
reservations:
memory: 512M # 🛌 内存保留
cpus: '1.0' # 🔋 CPU保留
|
健康检查
1
2
3
4
5
6
|
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
|
日志配置
1
2
3
4
5
|
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
|
💡 五、实用技巧与最佳实践
1. 使用环境变量文件
1
2
3
4
5
6
7
8
9
10
11
|
# 引用环境变量文件
env_file:
- .env
- .env.production
# .env 文件示例
TZ=Asia/Shanghai
PUID=1000
PGID=1000
DB_HOST=database
DB_PORT=5432
|
2. 多环境配置
1
2
3
4
5
6
7
8
9
|
# docker-compose.yml
version: "3.8"
services:
app:
image: myapp:${TAG:-latest}
ports:
- "${HOST_PORT}:8080"
environment:
- DB_HOST=${DB_HOST}
|
1
2
3
4
5
6
|
# 使用不同的环境变量文件
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
|
3. 扩展配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 使用扩展字段避免重复配置
x-common-environment: &common-env
TZ: Asia/Shanghai
PUID: 1000
PGID: 1000
services:
app1:
environment:
<<: *common-env
SPECIFIC_VAR: value1
app2:
environment:
<<: *common-env
SPECIFIC_VAR: value2
|
🚦 六、常用命令
启动服务
1
2
3
4
5
6
7
8
|
# 启动所有服务(后台模式)
docker-compose up -d
# 启动特定服务
docker-compose up -d service_name
# 强制重新创建容器
docker-compose up -d --force-recreate
|
停止服务
1
2
3
4
5
6
7
8
|
# 停止所有服务
docker-compose down
# 停止服务但保留卷
docker-compose down --volumes
# 停止服务并删除所有资源
docker-compose down --rmi all --volumes --remove-orphans
|
查看状态
1
2
3
4
5
6
7
8
9
10
|
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
docker-compose logs -f # 实时日志
docker-compose logs service_name # 特定服务日志
# 查看服务资源使用情况
docker-compose top
|
管理服务
1
2
3
4
5
6
7
8
|
# 重启服务
docker-compose restart
# 缩放服务实例数
docker-compose up -d --scale service_name=3
# 执行命令 in 容器
docker-compose exec service_name command
|
🎯 七、故障排除与调试
1. 验证配置文件
1
2
|
# 检查配置文件语法
docker-compose config
|
2. 查看详细日志
1
2
3
4
5
|
# 查看详细日志
docker-compose logs --tail=100 -f
# 查看容器内部
docker-compose exec service_name sh
|
3. 清理资源
1
2
3
4
5
6
7
8
|
# 清理未使用的资源
docker-compose down --remove-orphans
# 清理所有停止的容器
docker container prune
# 清理未使用的镜像
docker image prune
|
📚 总结
Docker Compose 是一个强大的工具,可以大大简化多容器应用的管理和部署。通过合理的配置和最佳实践,你可以轻松管理复杂的应用环境。
关键要点:
- ✅ 使用声明式 YAML 文件定义服务
- ✅ 合理配置网络、卷和环境变量
- ✅ 利用多环境配置提高灵活性
- ✅ 实施资源限制确保系统稳定性
- ✅ 定期清理未使用的资源
快乐编排! 🚀✨
💡 提示:始终将你的 docker-compose.yml 文件纳入版本控制系统,以便跟踪更改和协作开发。定期更新 Docker 镜像以确保安全性和性能。