Docker Compose 的详细使用总结、常用命令及配置示例

以下是 Docker Compose 的详细使用总结、常用命令及配置示例,帮助您快速掌握这一容器编排工具。


一、Docker Compose 核心概念

  1. 定位:用于定义和管理多容器 Docker 应用,通过 YAML 文件配置服务、网络、卷等资源。
  2. 核心概念 :
    • 服务 (Service):一个容器的定义(镜像、端口、环境变量等)。
    • 项目 (Project):一组关联服务的集合,默认以当前目录名命名。
  3. 核心文件 :docker-compose.yml(或通过 -f 指定其他文件)。

二、Docker Compose 常用命令

1. 基础操作
命令 作用 常用参数
docker compose up 创建并启动服务 -d(后台运行)、--build(强制重建镜像)
docker compose down 停止并删除所有资源 -v(同时删除卷)、--rmi all(删除镜像)
docker compose build 构建服务镜像 --no-cache(禁用缓存)
docker compose logs 查看日志 -f(实时跟踪)、service_name(过滤服务)
2. 管理服务
命令 作用
docker compose ps 查看容器状态
docker compose start 启动已停止的服务
docker compose stop 停止运行中的服务
docker compose restart 重启服务
docker compose exec <service> <cmd> 在容器内执行命令(如 exec app sh)
3. 调试与扩展
命令 作用
docker compose config 验证配置文件语法
docker compose top 显示容器内进程
docker compose pull 拉取服务的最新镜像
docker compose scale web=3 扩展服务实例数量(需删除 depends_on)

三、docker-compose.yml 配置详解

1. 基础结构
yaml 复制代码
version: '3.8'  # 推荐使用 3.8+ 版本
services:
  service1:  # 服务名称
    image: nginx:alpine  # 使用现成镜像
    # 其他配置...
  service2:
    build: .  # 基于 Dockerfile 构建镜像
    # 其他配置...
volumes:  # 声明卷
  my_volume:
networks:  # 声明网络
  my_network:
2. 完整配置示例:Web + MySQL + Redis
yaml 复制代码
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
      - static_volume:/app/static
    environment:
      - DEBUG=True
    env_file:
      - .env
    depends_on:
      - db
      - redis

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:  # 健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 5

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data
    command: redis-server --requirepass yourpassword

volumes:
  static_volume:
  mysql_data:
  redis_data:

四、关键配置项说明

1. 服务配置
  • build :构建镜像(优先于 image)

    yaml 复制代码
    build:
      context: ./dir  # Dockerfile 所在目录
      dockerfile: Dockerfile.prod
      args:  # 构建参数
        APP_VERSION: 1.0
  • ports :端口映射

    yaml 复制代码
    ports:
      - "80:80"         # 宿主机:容器
      - "443:443/tcp"   # 指定协议
      - "3000-3005:3000-3005"  # 范围映射
  • volumes :数据卷

    yaml 复制代码
    volumes:
      - /host/path:/container/path  # 绑定挂载
      - named_volume:/container/path  # 命名卷
      - config_file.conf:/app/config.conf:ro  # 只读挂载
2. 环境管理
  • environment :直接定义变量

    yaml 复制代码
    environment:
      - DB_HOST=db
      - DB_PORT=3306
  • env_file :从文件加载变量

    yaml 复制代码
    env_file:
      - .env
      - dev.env
3. 依赖与健康检查
  • depends_on :控制启动顺序

    yaml 复制代码
    depends_on:
      - db
      - redis
  • healthcheck :定义健康检查

    yaml 复制代码
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
4. 网络配置
yaml 复制代码
services:
  frontend:
    networks:
      - frontend
  backend:
    networks:
      - frontend
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

五、进阶使用技巧

1. 多环境配置
  • 开发环境:挂载代码目录,启用调试模式

  • 生产环境 :使用构建好的镜像,限制资源

    bash 复制代码
    # 合并多个配置文件
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up
2. 资源限制
yaml 复制代码
deploy:  # 需 Swarm 模式
  resources:
    limits:
      cpus: '0.5'
      memory: 512M
    reservations:
      memory: 256M
3. 扩展服务
bash 复制代码
# 启动 3 个 web 实例
docker compose up -d --scale web=3

六、常见问题与解决

  1. 容器启动顺序问题:

    • 使用 depends_on + healthcheck 确保依赖服务真正可用。
  2. 端口冲突:

    • 检查宿主机端口占用,或让 Docker 自动分配端口:

      yaml 复制代码
      ports:
        - "3000"  # 容器 3000 端口映射到宿主机随机端口
  3. 数据持久化:

    • 始终使用命名卷(named volume)保存数据库等关键数据。

通过合理配置 docker-compose.yml,您可以快速部署复杂的多容器应用。建议结合具体需求逐步完善配置,并善用 docker compose config 验证文件语法。

相关推荐
马可家的菠萝2 小时前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
Allstar_432 小时前
制造业研发管理数字化:从 Excel 到专业 APQP 系统的架构选型思考
架构·excel
ting94520003 小时前
Monid 深度技术解析:面向 AI 智能体的统一工具路由网关实现与工程实践
人工智能·架构
CAD开发小慧3 小时前
CAE软件开发:Coreform为何用ACIS处理CAD几何?
算法·架构·计算机图形学
半桶水专家3 小时前
CDN 原理详解:从底层架构到工程实践
架构·cdn
AAA代码批发商3 小时前
DAYS 57【Linux 驱动深度】I2C 子系统驱动开发全指南:从架构、核心数据结构到设备驱动实战
linux·驱动开发·架构·内核开发·i2c 子系统
Wang's Blog4 小时前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
Source.Liu4 小时前
【A11】拥有者模式平台架构笔记
windows·笔记·架构·rust
%KT%4 小时前
ubuntu系统部署docker
运维·docker·容器
霍格沃兹测试学院-小舟畅学5 小时前
Playwright MCP:AI Agent 驱动 Web 自动化测试的架构与执行机制
前端·人工智能·架构