Docker Compose使用指南:从入门到实践
引言
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。本文将详细介绍Docker Compose的使用方法和最佳实践。
基础概念
什么是Docker Compose
Docker Compose通过一个YAML文件配置应用程序的服务,然后使用一个命令创建并启动所有服务。
主要特性
- 单主机上的多个隔离环境
- 保持容器创建时的数据卷
- 仅重新创建已更改的容器
- 支持环境变量和变量替换
基本配置
docker-compose.yml
yaml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./www:/usr/share/nginx/html
depends_on:
- php
- mysql
php:
build: ./php
volumes:
- ./www:/var/www/html
environment:
- DB_HOST=mysql
- DB_DATABASE=app
- DB_USERNAME=root
- DB_PASSWORD=secret
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=app
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
常用命令
基本操作
bash
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs -f
# 进入容器
docker-compose exec php bash
网络配置
自定义网络
yaml
version: '3.8'
networks:
frontend:
driver: bridge
backend:
driver: bridge
services:
nginx:
networks:
- frontend
- backend
# ...
php:
networks:
- backend
# ...
mysql:
networks:
- backend
# ...
数据持久化
数据卷配置
yaml
version: '3.8'
volumes:
db_data:
driver: local
redis_data:
driver: local
services:
mysql:
volumes:
- db_data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
redis:
volumes:
- redis_data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
环境变量
使用.env文件
env
# .env
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=app
REDIS_PASSWORD=secret
yaml
# docker-compose.yml
version: '3.8'
services:
mysql:
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
redis:
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
构建配置
Dockerfile
dockerfile
# php/Dockerfile
FROM php:8.1-fpm
# 安装扩展
RUN apt-get update && apt-get install -y \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
CMD ["php-fpm"]
构建配置
yaml
version: '3.8'
services:
php:
build:
context: ./php
dockerfile: Dockerfile
args:
PHP_VERSION: '8.1'
服务扩展
服务依赖
yaml
version: '3.8'
services:
web:
depends_on:
- api
- redis
api:
depends_on:
- mysql
- redis
worker:
depends_on:
- redis
- mysql
健康检查
yaml
version: '3.8'
services:
mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
生产环境配置
多环境配置
yaml
# docker-compose.prod.yml
version: '3.8'
services:
web:
restart: always
environment:
- VIRTUAL_HOST=example.com
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
mysql:
restart: always
volumes:
- /data/mysql:/var/lib/mysql
使用命令
bash
# 使用生产配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
常见问题处理
容器启动顺序
yaml
version: '3.8'
services:
web:
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
redis:
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
日志管理
yaml
version: '3.8'
services:
web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
实战案例
LNMP环境
yaml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/var/www/html
depends_on:
- php
php:
build: ./php
volumes:
- ./www:/var/www/html
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DB_DATABASE}
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql_data:
最佳实践
- 使用版本控制管理配置文件
- 合理使用环境变量
- 实现健康检查
- 配置日志轮转
- 使用数据卷持久化数据
总结
Docker Compose是一个强大的容器编排工具,通过合理的配置和使用,可以大大简化开发和部署流程。
参考资料
- Docker Compose官方文档
- Docker实战(第2版)
- Docker Compose实战指南