news 2026/2/10 7:10:32

手把手教你玩转 Docker Compose:告别一条条敲命令,一键编排微服务!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你玩转 Docker Compose:告别一条条敲命令,一键编排微服务!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


🧩 一、为什么你需要 Docker Compose?

你是不是经常干这些事:

  • 每次开发都要手动启动 MySQL、Redis、RabbitMQ、Nginx、Spring Boot……
  • 一个项目要敲 5 条docker run命令,还容易漏参数?
  • 想把整套环境分享给同事,结果他配了三天还没跑起来?
  • 测试完想清理环境,结果忘了删哪个 volume?

Docker Compose 就是你的“一键部署神器”!

它用一个docker-compose.yml文件,定义所有服务、网络、卷、依赖关系,
然后一条命令:docker-compose up,全部搞定!


🎯 二、需求场景:Spring Boot + MySQL + Redis + Nginx 一键启动

假设你有一个典型的 Java 微服务项目,包含:

  • 后端:Spring Boot(监听 8080)
  • 数据库:MySQL
  • 缓存:Redis
  • 网关:Nginx(反向代理到后端)

现在,你要在本地快速搭建这套环境,并且能随时启动/停止/重建。


✅ 三、正确姿势:编写 docker-compose.yml

步骤 1:创建项目目录结构

mkdir myapp-compose cd myapp-compose touch docker-compose.yml mkdir -p nginx/conf.d

步骤 2:编写docker-compose.yml

version: '3.8' services: # MySQL 服务 mysql-db: image: mysql:8.0 container_name: mysql-db environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: myapp_db volumes: - mysql_data:/var/lib/mysql ports: - "3306:3306" networks: - app-network restart: always # Redis 服务 redis-cache: image: redis:7.0 container_name: redis-cache command: redis-server --appendonly yes --requirepass "mypassword123" volumes: - redis_data:/data ports: - "6379:6379" networks: - app-network restart: always # Spring Boot 应用(假设你已构建好镜像 my-spring-app:1.0) app: image: my-spring-app:1.0 container_name: my-spring-app depends_on: - mysql-db - redis-cache ports: - "8080:8080" networks: - app-network restart: always # Nginx 反向代理 nginx-proxy: image: nginx:1.25 container_name: nginx-proxy ports: - "80:80" volumes: - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - app networks: - app-network restart: always # 定义自定义网络(自动创建) networks: app-network: driver: bridge # 定义持久化卷(数据不会丢) volumes: mysql_data: redis_data:

💡 注意:

  • 所有服务都在同一个app-network,可以直接用服务名作为域名通信!
  • depends_on表示启动顺序(但不等服务真正 ready,需配合健康检查)
  • volumes实现数据持久化
  • ports用于对外暴露端口

步骤 3:配置 Nginx(nginx/conf.d/default.conf

server { listen 80; server_name localhost; location /api/ { proxy_pass http://app:8080/; # ← 关键!直接用服务名 "app" proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/html; index index.html; } }

✅ 因为 Nginx 和 app 在同一个 Docker 网络,所以http://app:8080能直接解析!


步骤 4:Spring Boot 配置(application.yml

spring: datasource: url: jdbc:mysql://mysql-db:3306/myapp_db?useSSL=false&serverTimezone=UTC username: root password: 123456 redis: host: redis-cache port: 6379 password: mypassword123

✅ 数据库地址写mysql-db(服务名),不是localhost


🚀 四、一键启动 & 管理

启动所有服务(后台运行)

docker-compose up -d

查看日志

# 查看所有服务日志 docker-compose logs -f # 只看 app 日志 docker-compose logs -f app

停止 & 删除

# 停止 docker-compose down # 停止 + 删除卷(⚠️ 数据会丢!) docker-compose down -v

重建某个服务(比如更新了 Spring Boot 镜像)

docker-compose up -d --build app

❌ 五、反例:新手常犯的错误

反例 1:没用自定义网络,靠 IP 或 localhost 通信

# 错误!默认网络无法用服务名解析 services: app: image: myapp db: image: mysql

→ 结果:UnknownHostException: db

✅ 正确:显式定义networks并让所有服务加入。


反例 2:忘记挂载配置文件,Nginx 用默认配置

  • Nginx 启动了,但没代理后端
  • 白跑!

✅ 正确:用volumes挂载自定义default.conf


反例 3:把敏感信息写死在 yml 里(生产大忌!)

environment: MYSQL_ROOT_PASSWORD: 123456 # ← 明文密码!

✅ 正确做法(开发可用,生产用 secrets):

environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_password secrets: - mysql_password

⚠️ 六、注意事项(避坑指南)

  1. depends_on不等于“等服务就绪”
    它只控制容器启动顺序,不等待 MySQL 真正可连接
    解决方案:在 Spring Boot 中加连接重试,或使用healthcheck(Compose v2.1+ 支持)。

  2. Windows 路径挂载注意
    如果用 Windows,路径写成:

    volumes: - ./nginx/conf.d:/etc/nginx/conf.d

    确保 Docker Desktop 已授权该目录共享。

  3. 镜像版本固定
    mysql:8.0而不是mysql:latest,避免自动升级导致兼容问题。

  4. 不要在生产直接用docker-compose
    生产建议用 Kubernetes 或 Swarm。Compose 适合开发/测试。


🧪 七、进阶技巧

技巧 1:多环境配置(dev / prod)

# 开发环境 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d # 生产环境 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

技巧 2:变量替换(.env文件)

创建.env

DB_PASSWORD=supersecret123 REDIS_PASSWORD=cache123

docker-compose.yml中引用:

environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

✅ 八、总结:Compose 的核心优势

传统方式Docker Compose
多条docker run命令一个docker-compose.yml
手动管理网络/volume自动创建和清理
配置分散,难维护配置集中,版本可控
分享环境靠口头描述git clone+docker-compose up

🌟一句话记住
“一个文件定义一切,一条命令启动全家!”


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 17:13:31

ChromeDriver下载地址汇总+AI编程助手搭配使用技巧

ChromeDriver 与 AI 编程助手的协同开发实践 在智能开发日益普及的今天,一个明显的趋势正在浮现:自动化工具不再只是“执行者”,而正逐步演变为具备“思考能力”的协作伙伴。以浏览器自动化为例,过去我们依赖手动编写 Selenium 脚…

作者头像 李华
网站建设 2026/1/30 20:46:10

揭秘Docker容器安全漏洞:Cilium Network Policy如何构建坚不可摧的防护墙?

第一章:Docker容器安全威胁全景洞察Docker 作为主流的容器化技术,极大提升了应用部署效率与资源利用率。然而,其共享内核、动态编排和镜像分发机制也引入了新的攻击面。理解这些潜在威胁是构建安全容器环境的前提。镜像来源不可信 使用未经验…

作者头像 李华
网站建设 2026/2/5 1:12:02

AIME24得分80.3!这款15亿参数模型正在改写数学推理格局

VibeThinker-1.5B:小模型如何在数学推理中实现“降维打击”? 在AIME24(美国数学邀请赛2024)的模拟评测中,一款仅含15亿参数的模型拿下了80.3分——这个数字不仅超过了初始版DeepSeek R1(79.8)&…

作者头像 李华
网站建设 2026/2/4 23:15:09

Baidu PaddlePaddle模型部署:VibeThinker生成Serving服务脚本

Baidu PaddlePaddle模型部署:VibeThinker生成Serving服务脚本 在AI工程落地的实践中,一个训练好的模型若无法高效服务于真实业务场景,其价值将大打折扣。尤其是在数学推理、算法编程等专业领域,开发者往往面临这样的困境&#xff…

作者头像 李华