Docker Compose 使用
docker-compose,可以使用 YML 文件来配置应用程序需要的所有服务。
使用一个命令,就可以从 YML 文件配置中创建并启动所有服务,能快速部署应用。
大大简化了docker的使用难度
# 安装/升级
# 查看 releases 版本
# 安装
# 下载
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 给可执行权限
chmod +x /usr/local/bin/docker-compose
# 建立软链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本
docker-compose version
# 命令
# 1. 基本操作
命令 | 说明 |
---|---|
docker-compose up | 启动所有服务(前台运行) |
docker-compose up -d | 后台启动所有服务(守护进程模式) |
docker-compose down | 停止并移除所有容器、网络、卷 |
docker-compose down -v | 额外删除数据卷(volumes ) |
docker-compose start | 启动已存在的容器 |
docker-compose stop | 停止容器(不删除) |
docker-compose restart | 重启服务 |
# 2. 容器管理
命令 | 说明 |
---|---|
docker-compose ps | 查看容器状态 |
docker-compose logs | 查看所有容器日志 |
docker-compose logs -f <service> | 实时跟踪日志 |
docker-compose exec <service> sh | 进入容器 Shell |
docker-compose run <service> <cmd> | 运行一次性命令(如测试) |
docker-compose pause/unpause | 暂停/恢复容器 |
# 3. 镜像与构建
命令 | 说明 |
---|---|
docker-compose build | 重新构建镜像 |
docker-compose build --no-cache | 无视缓存构建 |
docker-compose pull | 拉取最新镜像 |
docker-compose images | 列出服务镜像 |
# 4. 网络与卷
命令 | 说明 |
---|---|
docker-compose network ls | 查看项目网络 |
docker-compose volume ls | 查看数据卷 |
docker-compose port <service> <port> | 查看端口映射 |
# 5. 调试与清理
命令 | 说明 |
---|---|
docker-compose config | 验证配置文件 |
docker-compose top | 显示容器进程 |
docker-compose kill | 强制停止容器 |
docker-compose rm | 删除已停止的容器 |
# 常用命令示例
# 启动并查看日志
docker-compose up -d && docker-compose logs -f
# ps
#列出 docker-compose.yaml 当前运行容器
docker-compose ps
#列出 docker-compose.yaml 所有容器
docker-compose ps -a
# 清理所有资源
docker-compose down -v --rmi all
# up
# 重新构建镜像并启动:
docker-compose build --no-cache && docker-compose up -d
# 自动构建镜像,创建服务,启动服务
docker-compose up
# 根据docker-compose.yaml的 build配置 生成新镜像镜像,创建服务,启动服务
docker-compose up --build
# 强制重建服务
docker-compose up -d --force-recreate
# exec
# 交互式方式进入容器
docker-compose exec name /bin/bash
# 执行容器命令
docker-compose exec name ls /
# logs
# 查看容器日志
docker-compose logs
# 查看容器日志 持续输出 (时间长了会堆积大量日志,不推荐)
docker-compose logs -f
# 查看容器日志 输出最近100行
docker-compose logs -f --tail=100
# YAMl 示例
# 基础配置
点击查看
# docker-compose.yaml 示例 (Compose v3)
version: '3.8' # 指定 Compose 文件版本(推荐 3.8+)
services:
# --- 服务 1: Web 应用 ---
webapp:
image: nginx:latest
container_name: my_web
hostname: web-host
restart: unless-stopped
ports:
- "80:80"
- "443:443"
expose:
- "8080"
environment:
- NGINX_ENV=production
- DB_HOST=db
env_file:
- ./config.env
volumes:
- ./html:/usr/share/nginx/html
- nginx_logs:/var/log/nginx
networks:
- frontend
- backend
depends_on:
- db
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
deploy:
replicas: 2
resources:
limits:
cpus: "0.5"
memory: 512M
command: ["nginx", "-g", "daemon off;"]
labels:
- "com.example.description=Web Server"
# --- 服务 2: 数据库 ---
db:
image: postgres:13
build:
context: ./db
dockerfile: Dockerfile-postgres
args:
PG_VERSION: 13
environment:
POSTGRES_PASSWORD: mysecretpassword
volumes:
- pg_data:/var/lib/postgresql/data
networks:
- backend
sysctls:
- net.core.somaxconn=1024
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
# --- 服务 3: Redis ---
redis:
build: ./redis
image: custom_redis
networks:
- backend
# --- 服务 4: Worker (已补全) ---
worker:
image: worker:1.0
container_name: app_worker
hostname: worker-node
restart: on-failure
networks:
- backend
depends_on:
- db
- redis
environment:
<<: *common-env # <<: *common-env # 合并锚点中的环境变量
WORKER_QUEUE: "high_priority"
volumes:
- ./worker/logs:/var/log/worker
deploy:
replicas: 3
resources:
limits:
cpus: "0.3"
memory: 256M
healthcheck:
test: ["CMD-SHELL", "pgrep worker_process || exit 1"]
interval: 60s
timeout: 10s
retries: 3
# --- 全局配置 ---
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
backend:
driver: bridge
internal: true
volumes:
nginx_logs:
driver: local
pg_data:
driver: local
driver_opts:
type: none
device: ./pgdata
o: bind
# --- 扩展配置 ---
x-common-env: &common-env # 定义一组公共环境变量(命名为 common-env),可被多个服务复用 (*common-env)。
TZ: Asia/Shanghai
LOG_LEVEL: info
REDIS_HOST: redis
DB_HOST: db
# 网络示例
创建网络
version: "3.8"
services:
nginx:
image: nginx
networks:
global_network:
ipv4_address: "172.18.0.100"
mysql:
image: mysql:5.7
networks:
global_network:
ipv4_address: "172.18.0.101"
networks:
global_network:
name: global_network # 显式指定网络名称(避免自动添加项目前缀)
driver: bridge # bridge/host/none
ipam:
config:
- subnet: "172.18.0.0/24"
gateway: "172.18.0.1"
项目B: 引用 global_network 并分配IP
services:
api:
networks:
shared_net:
ipv4_address: "172.18.0.102"
networks:
shared_net:
external: true
name: global_network # 必须与项目A中定义的name完全一致
上次更新: 2025/04/25, 10:46:05