Docker Compose 使用实例
文章目录
- 一、Docker Compose 简介
- 二、安装 Docker Compose
- 三、基础配置文件示例(docker-compose.yml)
- 四、关键配置解析
- 五、常用命令
- 六、完整项目示例(Node.js + MySQL + Nginx)
- 七、高级功能
- 八、最佳实践
- 九、调试技巧
一、Docker Compose 简介
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具,通过 YAML 文件配置应用程序服务,一键启动所有关联容器。
二、安装 Docker Compose
- Linux:
sudo curl -L "https://mirrors.tuna.tsinghua.edu.cn/docker/compose/releases/download/v2.32.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- Windows/macOS:
通过 Docker Desktop 安装(已内置 Compose)
验证安装:
docker-compose --version
三、基础配置文件示例(docker-compose.yml)
version: '3.8' # Compose文件格式版本services:web:build: . # 使用当前目录的Dockerfile构建ports:- "8000:80" # 主机端口:容器端口depends_on:- dbenvironment:- DB_HOST=dbnetworks:- mynetworkdb:image: mysql:8.0volumes:- db_data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: exampleMYSQL_DATABASE: myappnetworks:- mynetworkhealthcheck:test: ["CMD-SHELL", "mysqladmin ping -h localhost"]interval: 30stimeout: 10sretries: 3volumes:db_data:networks:mynetwork:driver: bridge
四、关键配置解析
- version:指定Compose文件格式版本(常用3.x)
- services:定义服务(容器)
build
:指定构建上下文路径(含Dockerfile)image
:直接使用官方镜像ports
:端口映射depends_on
:服务依赖关系environment
:环境变量设置
- volumes:数据卷定义(持久化存储)
- networks:自定义网络配置
- healthcheck:容器健康检查
五、常用命令
- 启动服务:
docker-compose up -d # 后台启动
docker-compose up --build # 重新构建后启动
- 停止服务:
docker-compose down # 停止并删除容器、网络等
docker-compose stop # 仅停止容器
- 查看日志:
docker-compose logs -f # 实时查看日志
docker-compose logs web # 查看指定服务日志
- 进入容器:
docker-compose exec web bash # 进入web容器
- 构建镜像:
docker-compose build # 构建所有服务镜像
docker-compose build web # 仅构建web服务镜像
六、完整项目示例(Node.js + MySQL + Nginx)
- 项目结构:
myapp/
├── docker-compose.yml
├── nginx/
│ ├── nginx.conf
│ └── Dockerfile
├── app/
│ ├── package.json
│ ├── server.js
│ └── Dockerfile
└── .env
- docker-compose.yml:
version: '3.8'services:nginx:build: ./nginxports:- "80:80"depends_on:- appnetworks:- frontend- backendapp:build: ./appenvironment:- NODE_ENV=production- DB_HOST=dbnetworks:- backenddepends_on:db:condition: service_healthydb:image: mysql:8.0volumes:- db_data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_passwordMYSQL_DATABASE: myappsecrets:- db_root_passwordnetworks:- backendhealthcheck:test: ["CMD-SHELL", "mysqladmin ping -h localhost"]interval: 30stimeout: 10sretries: 3volumes:db_data:networks:frontend:backend:secrets:db_root_password:file: .env
- app/Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["npm", "start"]
- nginx/Dockerfile:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
- nginx/nginx.conf:
server {listen 80;location / {proxy_pass http://app:3000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
- .env:
DB_ROOT_PASSWORD=supersecret
七、高级功能
- 扩展配置:
# 扩展服务实例
app:deploy:replicas: 3resources:limits:cpus: '0.5'memory: 512M
- 多环境配置:
# docker-compose.override.yml(开发环境)
version: '3.8'
services:app:build: ./appvolumes:- ./app:/app # 挂载代码目录实现热更新environment:- NODE_ENV=development
- 使用模板文件:
# docker-compose.yml
services:app:image: myapp:${TAG}
八、最佳实践
- 使用
.env
文件管理敏感信息 - 为不同环境创建独立的Compose文件(如docker-compose.prod.yml)
- 使用健康检查确保服务启动顺序
- 对持久化数据使用命名卷
- 定期清理未使用的镜像和卷:
docker system prune -a
九、调试技巧
- 查看容器状态:
docker-compose ps
- 检查网络配置:
docker network inspect mynetwork
- 验证配置文件:
docker-compose config