Docker Compose简介
Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过YAML文件配置应用程序的服务,然后使用单个命令创建并启动所有服务。
什么是Docker Compose?
Docker Compose是一个用于定义和管理多容器Docker应用的工具。它使用YAML文件来配置应用程序的服务,网络和数据卷。
为什么使用Docker Compose?
- 简化多容器管理:一个命令管理多个容器
- 环境一致性:开发、测试、生产环境保持一致
- 服务编排:定义服务间的依赖关系
- 配置管理:集中管理容器配置
安装Docker Compose
Linux安装
# 下载Docker Compose
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
# 验证安装
docker-compose --version
使用pip安装
# 使用pip安装
pip install docker-compose
# 验证安装
docker-compose --version
docker-compose.yml文件结构
基本结构
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
networks:
default:
driver: bridge
volumes:
data:
driver: local
版本说明
version: '3.8'
:Compose文件格式版本- 不同版本支持不同的功能特性
- 建议使用最新稳定版本
服务配置详解
基本服务配置
version: '3.8'
services:
web:
# 使用现有镜像
image: nginx:alpine
# 或者构建镜像
build: .
# 端口映射
ports:
- "80:80"
- "443:443"
# 环境变量
environment:
- NODE_ENV=production
- DEBUG=false
# 数据卷挂载
volumes:
- ./html:/usr/share/nginx/html
- ./config:/etc/nginx/conf.d
# 依赖关系
depends_on:
- database
# 重启策略
restart: unless-stopped
构建配置
services:
app:
build:
# 构建上下文
context: .
# Dockerfile路径
dockerfile: Dockerfile.prod
# 构建参数
args:
- NODE_ENV=production
- BUILD_VERSION=1.0.0
# 目标阶段(多阶段构建)
target: production
网络配置
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
- backend
api:
image: node:16
networks:
- backend
database:
image: mysql:8.0
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
实际应用示例
Web应用栈(LAMP)
version: '3.8'
services:
# Web服务器
web:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/var/www/html
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- php
networks:
- frontend
# PHP处理器
php:
image: php:8.1-fpm
volumes:
- ./html:/var/www/html
networks:
- frontend
- backend
# 数据库
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppassword
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
# 缓存
redis:
image: redis:alpine
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes:
mysql_data:
driver: local
Node.js + MongoDB应用
version: '3.8'
services:
# Node.js应用
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- MONGODB_URI=mongodb://database:27017/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- database
- redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
# MongoDB数据库
database:
image: mongo:5.0
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: myapp
volumes:
- mongo_data:/data/db
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js
restart: unless-stopped
# Redis缓存
redis:
image: redis:alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
restart: unless-stopped
# Nginx反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
restart: unless-stopped
volumes:
mongo_data:
redis_data:
微服务架构示例
version: '3.8'
services:
# API网关
gateway:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./gateway.conf:/etc/nginx/nginx.conf
depends_on:
- user-service
- order-service
- product-service
# 用户服务
user-service:
build: ./services/user
environment:
- DATABASE_URL=postgresql://user:password@user-db:5432/users
depends_on:
- user-db
# 订单服务
order-service:
build: ./services/order
environment:
- DATABASE_URL=postgresql://user:password@order-db:5432/orders
- USER_SERVICE_URL=http://user-service:3000
depends_on:
- order-db
# 产品服务
product-service:
build: ./services/product
environment:
- DATABASE_URL=postgresql://user:password@product-db:5432/products
depends_on:
- product-db
# 用户数据库
user-db:
image: postgres:13
environment:
POSTGRES_DB: users
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- user_data:/var/lib/postgresql/data
# 订单数据库
order-db:
image: postgres:13
environment:
POSTGRES_DB: orders
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- order_data:/var/lib/postgresql/data
# 产品数据库
product-db:
image: postgres:13
environment:
POSTGRES_DB: products
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- product_data:/var/lib/postgresql/data
volumes:
user_data:
order_data:
product_data:
常用命令
基本命令
# 启动所有服务
docker-compose up
# 后台启动
docker-compose up -d
# 启动指定服务
docker-compose up web database
# 停止所有服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
# 重启服务
docker-compose restart
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs
# 查看指定服务日志
docker-compose logs web
# 实时查看日志
docker-compose logs -f
构建和更新
# 构建服务
docker-compose build
# 强制重新构建
docker-compose build --no-cache
# 拉取最新镜像
docker-compose pull
# 重新创建容器
docker-compose up --force-recreate
扩展和管理
# 扩展服务实例
docker-compose up --scale web=3
# 执行命令
docker-compose exec web bash
# 运行一次性命令
docker-compose run web npm install
# 查看配置
docker-compose config
# 验证配置文件
docker-compose config --quiet
环境变量管理
.env文件
# .env文件
NODE_ENV=production
DATABASE_URL=postgresql://user:password@localhost:5432/myapp
REDIS_URL=redis://localhost:6379
API_KEY=your-api-key
# docker-compose.yml
version: '3.8'
services:
app:
image: node:16
environment:
- NODE_ENV=${NODE_ENV}
- DATABASE_URL=${DATABASE_URL}
- REDIS_URL=${REDIS_URL}
- API_KEY=${API_KEY}
多环境配置
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
最佳实践
1. 文件组织
project/
├── docker-compose.yml
├── docker-compose.dev.yml
├── docker-compose.prod.yml
├── .env
├── .env.example
├── services/
│ ├── web/
│ │ └── Dockerfile
│ └── api/
│ └── Dockerfile
└── config/
├── nginx.conf
└── mysql.cnf
2. 安全配置
services:
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
secrets:
- mysql_root_password
secrets:
mysql_root_password:
file: ./secrets/mysql_root_password.txt
3. 健康检查
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
小结
本课学习了Docker Compose的核心内容:
- Docker Compose的安装和基本概念
- docker-compose.yml文件的编写
- 实际应用场景的配置示例
- 常用命令和操作技巧
- 环境变量管理和最佳实践
Docker Compose是管理多容器应用的强大工具,掌握它对于构建复杂的Docker应用至关重要。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议