文章目录
作为摸爬滚打多年的DevOps工程师,今天必须给大家安利这个容器编排神器——Docker Compose!(用过都说香!)相信不少小伙伴在单容器部署时都得心应手,但遇到多容器联动就头大?别慌!这篇保姆级教程带你轻松搞定!
一、为什么说Docker Compose是必备技能?(新人必看)
传统部署方式有多酸爽咱们都懂😭:手动启动十几个容器、逐个配置网络、环境变量…(想想就头秃!)Docker Compose直接把这些操作写进YAML配置文件,一行命令启动整个应用栈!!!(省时省力第一名)
实测对比:
- 传统方式部署WordPress+MySQL:至少15分钟
- 使用Compose部署:只要2分38秒!(亲测有效)
二、超详细安装指南(Windows/Mac/Linux全适配)
2.1 先决条件检查
docker --version # 确认Docker版本≥1.13
docker-compose --version # 已有旧版本建议先卸载
2.2 各平台安装姿势
Linux用户看这里👇:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Windows/Mac用户:
直接安装Docker Desktop时就会自带!(最新版默认包含)
(⚠️重要提醒:安装完成后一定要验证!)
docker-compose --version
# 看到类似 docker-compose version 2.20.0 就稳了!
三、编写你的第一个docker-compose.yml(手把手教学)
3.1 文件结构大揭秘
version: "3.9" # 版本号不能乱写!
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
(划重点!!)YAML文件必须注意:
- 缩进必须用空格(不能用Tab键!)
- 冒号后必须跟空格
- 字符串值建议用双引号包裹
3.2 常用配置参数详解
- depends_on:服务启动顺序控制(但不会等待依赖服务完全就绪!)
- restart: 自动重启策略(建议设为always)
- environment VS env_file:敏感信息记得用.env文件!
- healthcheck:服务健康检查(避免服务假死)
四、实战!部署一个SpringBoot+Redis+Mysql项目(含避坑指南)
4.1 项目结构
├── docker-compose.yml
├── backend
│ ├── Dockerfile
│ └── target/app.jar
├── mysql
│ └── init.sql
└── redis
└── redis.conf
4.2 完整compose文件
version: "3.9"
services:
app:
build: ./backend
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/app_db
SPRING_REDIS_HOST: cache
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
db:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 5
cache:
image: redis:6
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
mysql_data:
(🚨血泪教训)几个必坑点:
- MySQL初始化脚本必须放在/docker-entrypoint-initdb.d目录
- 服务间通信必须使用服务名(如db/cache)
- 健康检查配置不当会导致依赖服务未就绪就启动
五、常用命令大全(赶紧收藏!)
命令 | 作用 | 常用参数 |
---|---|---|
docker-compose up | 启动所有服务 | -d 后台运行 |
docker-compose down | 停止并删除容器 | -v 删除关联volume |
docker-compose logs | 查看日志 | -f 实时跟踪 |
docker-compose ps | 查看运行状态 | -a 显示所有容器 |
docker-compose exec | 进入容器 | 例如 exec app sh |
docker-compose build | 重新构建镜像 | –no-cache 禁用缓存 |
(💡小技巧)组合使用更高效:
docker-compose up -d --build # 重新构建镜像并后台启动
docker-compose logs -f app # 实时追踪某个服务的日志
六、高级玩法解锁(老鸟必备)
6.1 多环境配置管理
# docker-compose.yml
services:
app:
env_file:
- .env.${APP_ENV}
启动时指定环境:
APP_ENV=prod docker-compose up
6.2 水平扩展服务
docker-compose up -d --scale app=3 # 启动3个app实例
6.3 使用Profile控制服务
services:
monitor:
profiles: ["monitoring"]
image: prom/prometheus
启动时指定profile:
docker-compose --profile monitoring up
七、常见报错解决方案(救急必备)
❌ 错误1:版本不兼容
ERROR: Version in "./docker-compose.yml" is unsupported
✅ 解决方案:查看官方兼容性矩阵,修改version字段
❌ 错误2:端口冲突
Bind for 0.0.0.0:80 failed: port is already allocated
✅ 解决方案:修改ports配置或停止占用端口的进程
❌ 错误3:卷挂载权限问题
Permission denied while trying to connect to the Docker daemon
✅ 解决方案:使用绝对路径或调整目录权限
看完这篇还不会用Docker Compose?不存在的!(拍胸脯保证)赶紧动手试试,遇到问题评论区见!下期预告:《Docker网络深度解析:容器通信的九种姿势》🚀