docker-compose案例

wen java案例 1

5个生产级docker-compose实战案例,彻底告别“单机部署”焦虑

docker-compose案例

目录导读

  1. 为什么你需要docker-compose? —— 从手动docker run到声明式编排的思维跃迁
  2. LNMP(Linux+Nginx+MySQL+PHP)全栈环境一键搭建
  3. 微服务链路监控(Prometheus + Grafana + cAdvisor)
  4. 高可用Redis集群(Sentinel模式)与数据持久化
  5. CI/CD流水线(Jenkins + SonarQube + Registry)本地化模拟
  6. 多环境隔离(开发/测试/生产)Compose文件拆分策略
  7. 高频问答精粹(Q1-Q4)
  8. 总结与SEO长尾词解析

为什么你需要docker-compose?

在生产环境,你几乎不可能只运行一个容器,数据库、缓存、消息队列、反向代理、应用服务……它们之间存在网络依赖、启动顺序、共享卷、环境变量传递等复杂关系。docker-compose(现已集成进Docker CLI,命令为docker compose)允许你用一份YAML文件定义整个应用栈,实现up一键拉起、down一键销毁。

核心优势

  • 可重复性:代码即配置,不再依赖“某台机器上曾经敲过的命令”。
  • 网络自治:自动创建独立bridge网络,服务名即DNS域名。
  • 原子管理:依赖depends_on控制启动顺序,配合healthcheck实现真正的“就绪后启动”。

案例一:LNMP全栈环境一键搭建

应用场景:本地开发或小团队内部测试服务器,需要快速还原WordPress或ThinkPHP环境。

docker-compose.yml核心片段

version: '3.8'
services:
  nginx:
    image: nginx:1.24-alpine
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      php-fpm:
        condition: service_healthy
  php-fpm:
    image: php:8.2-fpm
    volumes:
      - ./www:/var/www/html
    healthcheck:
      test: ["CMD", "php-fpm", "-t"]
      interval: 10s
      timeout: 5s
      retries: 3
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: appdb
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

细节亮点condition: service_healthy确保PHP先通过配置检查,Nginx再启动,避免502。


案例二:微服务链路监控(Prometheus + Grafana + cAdvisor)

应用场景:容器化微服务的CPU、内存、磁盘IO实时监控。

关键配置

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    privileged: true
    expose: ["8080"]
  prometheus:
    image: prom/prometheus:v2.47.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prom_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    depends_on:
      - cadvisor
  grafana:
    image: grafana/grafana:10.1.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123

注意:cadvisor必须挂载宿主机根目录及docker socket,这是Linux下获取容器指标的硬性要求。


案例三:高可用Redis集群(Sentinel模式)与数据持久化

应用场景:防止缓存节点单点故障,自动主从切换。

构建思路:1个主节点 + 2个从节点 + 3个sentinel。

核心Compose配置(节选)

services:
  redis-master:
    image: redis:7-alpine
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redis_master_data:/data
  redis-slave-1:
    image: redis:7-alpine
    command: ["redis-server", "--slaveof", "redis-master", "6379"]
    depends_on:
      - redis-master
  sentinel-1:
    image: redis:7-alpine
    command: >
      sh -c "echo 'sentinel monitor mymaster redis-master 6379 2' > /etc/redis/sentinel.conf
      && redis-sentinel /etc/redis/sentinel.conf"
    depends_on:
      - redis-master

注意:生产环境需将sentinel的quorum设为2,故障转移由sentinel选举完成,应用侧使用Sentinel客户端获取最新master地址。


案例四:CI/CD流水线本地化模拟(Jenkins + SonarQube + Registry)

应用场景:在开发机模拟Docker里跑Docker(DinD)的构建、静态扫描、镜像推送。

关键服务

services:
  jenkins:
    image: jenkins/jenkins:lts-jdk17
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock  # 让Jenkins调用宿主Docker
    ports:
      - "8080:8080"
  sonarqube:
    image: sonarqube:10.1-community
    environment:
      - SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar
    depends_on:
      - db
  registry:
    image: registry:2
    ports:
      - "5000:5000"

避坑指南:Jenkins容器内要装docker-clidocker-compose插件,且需将宿主socket映射进去,但生产环境建议使用docker:latest作为agent镜像(DinD)。


案例五:多环境隔离(开发/测试/生产)Compose文件拆分策略

不推荐用三个完全不同的YAML,推荐用基准文件 + 覆盖文件

  • docker-compose.yml:基础服务,含镜像版本、端口、卷。
  • docker-compose.dev.yml:开启调试模式,挂载源码热更新,使用本地MySQL。
  • docker-compose.prod.yml:关闭端口映射(走内部负载均衡),使用外部持久卷,启用restart: always

执行方式

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

高频问答精粹

Q1:depends_on能保证服务完全就绪吗? A:不能,它只保证启动顺序(先启动依赖服务容器),但MySQL可能还在初始化,必须配合healthcheck,或者使用depends_on: condition: service_healthy(Compose v2.20+)。

Q2:如何在多个项目间复用公共网络? A:在docker-compose.yml中定义networks: default: { external: true, name: shared_net },让不同项目接入同一bridge网络,实现服务名互访。

Q3:Compose文件中的version字段还有必要吗? A:自Compose v2.20.0+,version已废弃并忽略,建议删除,不要使用version: '3.8'之类,避免新手困惑。

Q4:数据卷挂载目录权限导致访问拒绝(Permission denied)怎么办? A:通常在容器内部以root运行服务,但挂载了宿主文件,解决方案:在Compose中指定user: "1000:1000"(宿主机用户ID),或先chown目录为容器内用户ID。


总结与SEO长尾词解析

通过以上5个案例,你已掌握Compose的高级用法:健康检查、环境覆盖、卷持久化、跨项目网络、DinD调度。动手写一遍胜过看十篇,请务必打开终端,将案例一跑通,再逐层叠加复杂度。

本文核心收录的长尾搜索词

  • docker-compose 生产环境 高可用
  • docker compose depends_on healthcheck 用法
  • docker-compose prometheus grafana 监控
  • docker compose redis集群 sentinel 配置
  • docker-compose 多环境 配置文件拆分

建议:将本文收藏为手册,遇到部署瓶颈时快速查询,后续如需了解Docker SwarmK8s对Compose文件的兼容性,可参考官方kompose工具转换指南。

抱歉,评论功能暂时关闭!