当前位置: 首页 > backend >正文

Docker Compose 完全指南:从入门到生产实践

Docker Compose 完全指南:从入门到生产实践

1. Docker Compose 简介与核心价值

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务。

核心优势

  • 简化多容器管理:通过单一文件管理多个关联容器
  • 开发环境标准化:团队共享相同的环境配置
  • 快速环境搭建:一条命令启动复杂应用栈
  • 服务依赖管理:自动处理服务间的依赖关系
  • 配置即代码:版本控制环境配置

典型应用场景

  • 开发环境搭建
  • 自动化测试环境
  • 单主机部署
  • 微服务应用演示

2. Compose 文件结构与版本

2.1 基本文件结构

version: "3.8"  # 指定Compose文件格式版本services:  # 容器服务定义webapp:image: nginx:alpineports:- "80:80"database:image: postgres:13environment:POSTGRES_PASSWORD: examplevolumes:  # 持久化卷定义db-data:

版本选择建议

  • 新项目使用 3.8+ 版本
  • 需要 swarm 部署时使用 3.x 版本
  • 旧系统兼容考虑 2.4 版本

2.2 版本演进对比

特性2.x 系列3.x 系列
Swarm 模式支持有限支持完整支持
GPU 支持不支持3.7+ 支持
扩展字段不支持3.4+ 支持
服务依赖depends_on 基本增强的健康检查依赖

3. 核心服务配置详解

3.1 镜像与构建

使用现有镜像

services:redis:image: redis:6.2-alpine

基于 Dockerfile 构建

services:webapp:build:context: ./dirdockerfile: Dockerfile.devargs:NODE_ENV: developmentimage: my-webapp:1.0

参数说明

  • context:构建上下文路径
  • dockerfile:指定 Dockerfile 文件名
  • args:构建时变量传递

3.2 端口映射

services:web:ports:- "80:80"           # 主机端口:容器端口- "443:443/tcp"      # 指定协议- "3000-3005:3000-3005"  # 端口范围- "9090"            # 仅暴露容器端口

最佳实践

  • 开发环境使用明确端口映射
  • 生产环境谨慎暴露端口
  • 考虑使用反向代理管理入口

3.3 环境变量配置

.env 文件

DB_USER=admin
DB_PASS=secret

Compose 文件引用

services:db:environment:POSTGRES_USER: ${DB_USER}POSTGRES_PASSWORD: ${DB_PASS}env_file:- ./db.env

优先级规则

  1. environment 显式定义
  2. env_file 文件定义
  3. 容器内已有环境变量

3.4 数据持久化

services:database:volumes:- db-data:/var/lib/postgresql/data- ./logs:/app/logsvolumes:db-data:driver: local

挂载类型对比

  • 命名卷:docker 管理,适合生产数据
  • 主机路径:开发调试方便
  • 临时卷:内存存储,高性能临时数据

4. 网络配置策略

4.1 默认网络行为

services:web:networks:- frontendapi:networks:- frontend- backendnetworks:frontend:backend:driver: bridge

自动生成规则

  • 默认创建 项目名_default 网络
  • 相同网络内的服务可通过服务名互访
  • 隔离不同项目的网络环境

4.2 自定义网络配置

networks:app-net:driver: bridgeipam:config:- subnet: 172.20.0.0/24gateway: 172.20.0.1attachable: true

高级选项

  • internal: true 创建隔离网络
  • enable_ipv6: true 启用 IPv6
  • labels 添加元数据

5. 服务依赖与健康检查

5.1 依赖控制

services:web:depends_on:db:condition: service_healthyredis:condition: service_starteddb:healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 3sretries: 5

依赖条件类型

  • service_started:服务容器启动
  • service_healthy:通过健康检查
  • service_completed_successfully:一次性任务成功

5.2 健康检查配置

healthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 10sretries: 3start_period: 5s

检查方式

  • CMD:直接执行命令
  • CMD-SHELL:通过 shell 执行
  • 禁用disable: true

6. 常用命令实战

6.1 基础命令

# 启动所有服务(后台模式)
docker-compose up -d# 查看运行状态
docker-compose ps# 停止服务
docker-compose stop# 停止并删除容器
docker-compose down# 重建服务
docker-compose up -d --build

6.2 调试命令

# 查看服务日志
docker-compose logs -f web# 执行一次性命令
docker-compose run --rm web python manage.py migrate# 进入运行中容器
docker-compose exec db psql -U postgres

6.3 扩展操作

# 水平扩展服务实例
docker-compose up -d --scale web=3# 查看服务资源使用
docker-compose top# 验证配置文件
docker-compose config

7. 生产环境最佳实践

7.1 安全配置

services:db:read_only: truetmpfs: /runsecurity_opt:- no-new-privileges:trueuser: "1000:1000"

安全建议

  • 避免使用 root 用户
  • 限制内存和 CPU
  • 设置只读文件系统
  • 禁用特权升级

7.2 资源约束

services:worker:deploy:resources:limits:cpus: '0.5'memory: 512Mreservations:memory: 256Mrestart_policy:condition: on-failuremax_attempts: 3

关键配置

  • CPU 限制 (cpus)
  • 内存限制 (memory)
  • 重启策略
  • 容器更新顺序

7.3 多环境配置

base.yml:

services:app:image: my-appenv_file: .env

override.yml:

services:app:environment:DEBUG: "true"ports:- "8080:80"

启动命令

docker-compose -f base.yml -f override.yml up

8. 完整示例分析

8.1 微服务应用示例

version: "3.8"services:frontend:build: ./frontendports:- "3000:3000"depends_on:- apinetworks:- app-netapi:build: ./backendenvironment:DB_URL: postgres://user:pass@db:5432/appvolumes:- ./backend:/appnetworks:- app-net- db-netdb:image: postgres:13environment:POSTGRES_PASSWORD: passPOSTGRES_USER: userPOSTGRES_DB: appvolumes:- db-data:/var/lib/postgresql/datanetworks:- db-nethealthcheck:test: ["CMD-SHELL", "pg_isready -U user -d app"]interval: 5snetworks:app-net:db-net:internal: truevolumes:db-data:

架构特点

  1. 前端服务暴露 3000 端口
  2. API 服务连接数据库
  3. 数据库使用独立内部网络
  4. 数据持久化存储
  5. 健康检查确保依赖顺序

9. 总结与进阶建议

9.1 核心要点回顾

  1. 编排能力:Compose 简化了多容器应用的管理
  2. 声明式配置:YAML 文件定义完整应用栈
  3. 环境一致性:实现开发-测试-生产环境一致
  4. 资源控制:精确管理服务资源分配
  5. 服务发现:内置 DNS 解析简化服务通信

9.2 进阶学习建议

  1. 与 Swarm/K8s 集成

    docker stack deploy -c compose.yml myapp
    
  2. 使用扩展字段

    x-logging: &default-loggingoptions:max-size: "10m"max-file: "3"
    
  3. 性能调优

    • 合理设置 ulimits
    • 优化卷驱动选择
    • 配置 OOM 杀手策略
  4. 监控方案

    services:prometheus:image: prom/prometheusports:- "9090:9090"
    

通过掌握 Docker Compose,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。

http://www.xdnf.cn/news/5400.html

相关文章:

  • java的Stream流处理
  • 数据库事务以及JDBC实现事务
  • 模型欠拟合是什么?
  • 基于VSCode + PlatformIO平台的ESP8266的DS1302实时时钟
  • AI日报 · 2025年05月11日|传闻 OpenAI 考虑推出 ChatGPT “永久”订阅模式
  • Linux中常见开发工具简单介绍
  • 05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik
  • Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
  • MySql(进阶)
  • 【大模型】AI智能体Coze 知识库从使用到实战详解
  • 基于Dify实现对Excel的数据分析
  • 嵌入式硬件篇---陀螺仪|PID
  • Linux之进程概念
  • 电源架构与太阳能充电器电路设计分析
  • OpenWrt开发第8篇:树莓派开发板做无线接入点
  • langchain 接入国内搜索api——百度AI搜索
  • Qt 样式表:全面解析与应用指南
  • LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?
  • 理解 Token 索引 vs 字符位置
  • C++23 新特性:深入解析 std::views::join_with(P2441R2)
  • 深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用
  • 效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验
  • NHANES稀有指标推荐:MedHi
  • M. Moving Both Hands(反向图+Dijkstra)
  • 视频编解码学习10之成像技术原理
  • 华为配置篇-RSTP/MSTP实验
  • 股指期货的保证金交易和资金门槛是多少?
  • 《Go小技巧易错点100例》第三十三篇
  • Redis--常见数据类型List列表
  • 思维链框架:LLMChain,OpenAI,PromptTemplate