Docker Compose 入门指南
用简单的配置管理多个 Docker 容器
Docker Compose 是什么?
想象一下,你的项目需要同时运行:
- 一个 Java 应用
- 一个 MySQL 数据库
- 一个 Redis 缓存
以前你要手动一条一条执行 docker run 命令,还要注意启动顺序,很麻烦。
有了 Docker Compose,你只需要写一个配置文件,然后一条命令就能全部启动。
快速开始
1. 准备 docker-compose.yml 文件
在项目根目录创建 docker-compose.yml 文件:
yaml
version: '3.8'
services:
# 你的 Java 应用
app:
build: .
ports:
- "8080:8080"
# MySQL 数据库
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=myapp
# Redis 缓存
redis:
image: redis:7-alpine
ports:
- "6379:6379"2. 常用命令
bash
# 启动所有服务(后台运行)
docker-compose up -d
# 启动并重新构建镜像
docker-compose up -d --build
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 进入某个服务终端
docker-compose exec app sh常见配置说明
image - 使用现成的镜像
yaml
services:
mysql:
image: mysql:8.0 # 直接使用官方镜像build - 用 Dockerfile 构建
yaml
services:
app:
build: . # 用当前目录的 Dockerfile 构建ports - 端口映射
yaml
services:
app:
ports:
- "8080:8080" # 宿主机端口:容器端口environment - 环境变量
yaml
services:
mysql:
environment:
- MYSQL_ROOT_PASSWORD=123456volumes - 数据挂载
yaml
services:
mysql:
volumes:
- mysql_data:/var/lib/mysql # 数据卷(数据不会丢失)
- ./config:/etc/mysql/conf.d # 本地目录挂载depends_on - 依赖关系
yaml
services:
app:
depends_on:
- mysql # 先启动 MySQL,再启动 app
- redis完整示例
假设你有一个 Spring Boot 项目,需要 MySQL 和 Redis:
yaml
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- MYSQL_HOST=mysql
- REDIS_HOST=redis
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root123
- MYSQL_DATABASE=drone
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
mysql_data:
redis_data:开发环境热重载
yaml
version: '3.8'
services:
app:
build: .
volumes:
- .:/app # 挂载源码,修改代码后自动生效
- maven_cache:/root/.m2 # 缓存 Maven 依赖,加速构建
environment:
- SPRING_PROFILES_ACTIVE=dev
working_dir: /app
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=dev123
- MYSQL_DATABASE=drone_dev
volumes:
maven_cache:常见问题
1. 容器启动顺序怎么控制?
用 depends_on 控制启动顺序:
yaml
services:
app:
depends_on:
- mysql
- redis2. 数据会丢失吗?
不会,只要用了数据卷:
yaml
volumes:
- mysql_data:/var/lib/mysql # 这个数据卷不会随容器删除而丢失3. 怎么查看服务日志?
bash
docker-compose logs -f # 查看所有日志
docker-compose logs app # 只看 app 的日志4. 怎么进入容器查看?
bash
docker-compose exec app sh # 进入 app 容器
docker-compose exec mysql mysql -uroot -p # 进入 MySQL一张图理解结构
docker-compose.yml
├── services(服务)
│ ├── app(你的应用)
│ │ ├── build: 用 Dockerfile 构建
│ │ ├── ports: 8080:8080
│ │ └── depends_on: mysql, redis
│ ├── mysql(数据库)
│ │ └── image: mysql:8.0
│ └── redis(缓存)
│ └── image: redis:7-alpine
└── volumes(数据卷)
├── mysql_data
└── redis_data常用命令速查
| 命令 | 说明 |
|---|---|
docker-compose up -d | 启动所有服务 |
docker-compose down | 停止并删除所有服务 |
docker-compose ps | 查看服务状态 |
docker-compose logs -f | 查看实时日志 |
docker-compose exec app sh | 进入容器 |
docker-compose restart app | 重启某个服务 |
docker-compose stop | 停止所有服务 |
docker-compose start | 启动所有服务 |