Docker Compose
Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。它可以管理多个 Docker 容器组成一个应用,只需要编写一个 YAML 格式的配置文件 docker-compose.yml,定义好多个容器之间的调用关系,然后通过简单的命令即可管理这些容器。
简单来说,Docker Compose 就像是一个"后厨团队管理工具",通过一个"菜单文件"(docker-compose.yml)就能一键启动整套服务,而无需手动逐个启动和配置每个容器
Docker Compose 的优势
Docker Compose 提供了多项显著优势:
- 简化管理:通过一个文件管理所有服务,而不是分别处理每个容器
- 易于版本控制:YAML 文件可以方便地与代码一起进行版本控制
- 快速启动与停止:使用简单的命令即可启动或停止所有服务
- 环境一致性:确保开发、测试和生产环境的一致性
- 依赖管理:内置服务依赖顺序控制(通过 depends_on)
- 资源效率:相比传统虚拟机,容器更加轻量级,启动更快
Docker Compose 文件结构
yaml
version: '3.8'
services:
web:
container_name: web # 容器名
image: nginx:latest # 使用最新版 Nginx 镜像
restart: ralways # 重启策略
ports:
- "80:80" # 映射主机的 80 端口到容器的 80 端口
volumes:
- ./html:/usr/share/nginx/html # 挂载本地 html 目录
networks:
- webnet # 连接到自定义网络
networks:
webnet: # 自定义网络定义
volumes:
db_data: # 定义持久化数据卷常用服务配置
| 配置项 | 描述 | 示例 |
|---|---|---|
container_name | 指定容器名称 | container_name: my-web |
restart | 重启策略 | restart: unless-stopped |
command | 覆盖默认命令 | command: ["python", "app.py"] |
entrypoint | 覆盖入口点 | entrypoint: /app/start.sh |
user | 指定运行用户 | user: "1000:1000" |
working_dir | 设置工作目录 | working_dir: /app |
labels | 添加元数据 | labels: ["com.example.foo=bar"] |
security_opt | 安全选项 | security_opt: ["no-new-privileges:true"] |
read_only | 只读文件系统 | read_only: true |
tmpfs | 内存文件系统挂载 | tmpfs: /run |
build 构建
yaml
services:
webapp:
build:
context: ./dir # Dockerfile 所在目录
dockerfile: Dockerfile.dev # 可选,指定 Dockerfile 文件名
args:
NODE_ENV: development # 构建参数
image: my-webapp:1.0 # 指定构建后的镜像名称和标签- context:指定包含 Dockerfile 的目录路径或 git 仓库 URL
- dockerfile:指定 Dockerfile 文件名
- args:添加构建参数,这些只能在构建过程中访问的环境变量
- cache_from:指定缓存解析镜像列表(3.2+)
- labels:将元数据以标签的形式添加到生成的镜像中(3.3+)
- network:设置容器网络连接以获取构建过程中的 run 指令(3.4+)
- shm_size:指定容器的 /dev/shm 分区大小(3.5+)
ports 端口映射
yaml
services:
web:
ports:
- "80:80" # 主机端口:容器端口
- "443:443/tcp" # 指定协议
- "3000-3005:3000-3005" # 端口范围
- "9090" # 仅暴露容器端口环境变量
直接指定
yaml
services:
db:
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret使用 .env 文件
.env 文件内容:
ini
DB_USER=admin
DB_PASS=secretCompose 文件引用:
yaml
services:
db:
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
env_file:
- ./db.env优先级规则:
environment显式定义env_file文件定义- 容器内已有环境变量
volumes 存储卷
yaml
services:
database:
volumes:
- db_data:/var/lib/postgresql/data # 命名卷
- ./logs:/app/logs # 主机路径
volumes:
db_data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: './data'
cache:
external: true # 使用外部已存在的卷
name: app_cachenetworks 网络
yaml
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
networks:
frontend:
backend:
driver: bridge自定义网络配置
yaml
networks:
app-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1
attachable: true
internal: true # 创建隔离网络
enable_ipv6: true # 启用 IPv6
labels:
com.example.version: "1.0"
backend:
external: true # 使用外部已存在的网络
name: existing_networkdepends_on 服务依赖
yaml
services:
web:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5依赖条件类型:
service_started:服务容器启动service_healthy:通过健康检查service_completed_successfully:一次性任务成功
healthcheck 健康检查配置
yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s检查方式:
CMD:直接执行命令CMD-SHELL:通过 shell 执行- 禁用:
disable: tru
ulimits 优化
yaml
version: '3.8'
services:
webapp:
image: nginx:latest
ulimits:
nofile: # 文件描述符限制
soft: 10240
hard: 20480
nproc: # 进程数限制
soft: 1024
hard: 2048
locks: # 文件锁限制
soft: 1024
hard: 2048关键参数说明:
soft limit:当前进程实际应用的限制值,进程可自行降低但需要特权才能提高hard limit:soft limit 可调整的上限,只有 root 用户可修改
| 限制类型 | 参数名 | 优化场景 | 典型生产值 |
|---|---|---|---|
| 打开文件数 | nofile | 高并发Web服务 | 65535+ |
| 用户进程数 | nproc | 防止fork炸弹 | 1024-4096 |
| 核心文件大小 | core | 调试环境 | unlimited |
| 栈大小 | stack | 递归深度大的应用 | 8192KB+ |
| CPU时间 | cpu | 计算密集型任务 | 按需设置 |
deploy 资源约束
yaml
services:
worker:
deploy:
resources:
limits:
# 限制CPU
cpus: '0.5'
# 限制内存
memory: 512M
reservations:
memory: 256M
restart_policy:
condition: on-failure
max_attempts: 3日志配置
yaml
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"使用配置文件
yaml
configs:
nginx-config:
file: ./nginx.confprofiles
定义一个服务属于特定的 profile(配置文件组)
默认情况下,不带
--profile参数启动时,标记了 profile 的服务不会自动启动yamlnginx-builder: profiles: ["build-only"] deploy: replicas: 0- replicas:指定服务运行的容器实例数量
安装
yum安装
bash
dnf -y docker-compose-plugin二进制包
bash
curl -SL https://github.com/docker/compose/releases/download/v2.37.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-composeDocker Compose 命令
语法格式
bash
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-f | 指定 compose 文件路径 | docker-compose -f prod.yml up |
-p | 指定项目名称 | docker-compose -p myproject down |
--env-file | 指定环境变量文件 | docker-compose --env-file .env.dev up |
--verbose | 显示详细输出 | docker-compose --verbose logs |
--no-ansi | 禁用 ANSI 控制字符 | docker-compose --no-ansi up |
COMMAND 命令
| 命令 | 描述 | 示例 |
|---|---|---|
docker-compose up | 启动服务,根据 docker-compose.yml 文件创建并启动容器 | docker-compose up -d(后台运行) |
docker-compose down | 停止并删除所有服务和网络 | docker-compose down -v(删除数据卷) |
docker-compose ps | 列出当前活动的服务和容器 | docker-compose ps |
docker-compose build | 根据配置构建服务镜像 | docker-compose build |
docker-compose logs | 查看服务的日志 | docker-compose logs -f(实时日志) |
docker-compose exec | 在容器中执行命令 | docker-compose exec db bash |
docker-compose stop | 停止正在运行的服务 | docker-compose stop web |
docker-compose start | 启动已停止的服务 | docker-compose start db |
docker-compose restart | 重启指定的服务 | docker-compose restart |
经典案例
构建自定义镜像
compose.yaml
yaml
version: '3.8' # 明确指定版本
services:
# 最终运行容器
web:
build:
context: ./
dockerfile: Dockerfile
image: nginx-web:1.0.0 # 使用nginx-web构建的镜像
container_name: web
restart: unless-stopped
ports:
- "80:80"
- "443:443"
networks:
- web
volumes:
- /data/nginx/html/:/data/wwwroot/www/
- /data/nginx/conf/:/etc/nginx/conf/
- /data/nginx/ssl/:/etc/nginx/ssl/
deploy:
resources:
limits:
# 限制CPU
cpus: '0.5'
# 限制内存
memory: 512M
reservations:
memory: 256M
networks:
web:
driver: bridge构建启动
bash
docker-compose build
docker-compose up -d