经过前 22 天的学习,我已掌握 Docker 容器的基础操作、镜像构建与仓库管理,但在实际项目中,单容器部署难以满足复杂应用需求。今天重点攻克Docker Compose,这款工具能通过单一配置文件定义多容器应用,轻松实现容器的编排、启动与联动,彻底解决多服务部署的繁琐问题。
一、为什么需要 Docker Compose?
在学习 Compose 前,我曾手动部署一个 "Web 服务 + 数据库" 的 Demo:先启动 MySQL 容器并配置端口映射、环境变量,记录容器 IP 后,再启动 Spring Boot 应用容器并手动注入数据库连接参数。这种方式存在三大痛点:一是容器启动顺序依赖手动控制,数据库未就绪时 Web 服务会连接失败;二是容器间网络需手动配置,跨主机部署时 IP 地址频繁变动;三是参数配置分散在多个命令中,环境一致性难以保证。而 Docker Compose 通过docker-compose.yml配置文件,可一次性定义所有服务的依赖关系、网络规则与环境变量,执行docker-compose up即可完成全栈部署,效率提升显著。
二、Docker Compose 核心功能与实战
1. 核心概念
Compose 的架构包含三个核心组件:服务(Service) 对应一个容器实例,如web、db;网络(Network) 用于服务间通信,默认创建专属桥接网络;数据卷(Volume) 实现容器数据持久化,支持跨服务共享。
2. 实战:搭建 WordPress 博客系统
以经典的 "WordPress+MySQL" 组合为例,编写docker-compose.yml文件:
version: '3.8' # 指定Compose版本
services:
db: # 数据库服务
image: mysql:8.0
volumes:
- mysql-data:/var/lib/mysql # 数据卷挂载
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=wordpress
restart: always # 容器退出后自动重启
wordpress: # Web服务
depends_on: # 声明依赖db服务
- db
image: wordpress:latest
ports:
- "8080:80" # 端口映射:主机8080→容器80
environment:
- WORDPRESS_DB_HOST=db:3306 # 直接使用服务名访问db
- WORDPRESS_DB_PASSWORD=root
restart: always
volumes:
mysql-data: # 定义数据卷,持久化MySQL数据
执行docker-compose up -d后,Compose 会自动创建网络、启动服务并挂载数据卷。访问http://localhost:8080即可完成 WordPress 安装,整个过程无需手动配置容器间连接。
三、进阶技巧与避坑指南
- 服务依赖与启动顺序:depends_on仅保证服务启动顺序,不等待服务就绪(如 MySQL 启动后需时间初始化)。可通过wait-for-it脚本或健康检查(healthcheck)确保服务可用性。
- 环境变量管理:将敏感信息(如数据库密码)写入.env文件,在docker-compose.yml中通过${变量名}引用,避免配置文件泄露敏感数据。
- 容器日志查看:使用docker-compose logs -f [服务名]实时查看指定服务日志,便于问题排查。
- 资源限制:在服务中添加deploy.resources配置,限制 CPU 与内存使用,避免单个服务占用过多资源,例如:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
四、学习总结
Day23 的学习让我深刻体会到 Docker Compose 在多容器管理中的优势,它将复杂的部署流程转化为可版本控制的配置文件,极大提升了开发与运维效率。后续计划深入学习 Compose 与 Docker Swarm 的结合使用,探索分布式应用的部署方案。如果大家在 Compose 使用中遇到问题,欢迎在评论区交流讨论!