Docker Compose使用教程
1. 引言
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个简单的YAML文件,您可以配置应用程序的所有服务,然后使用单个命令创建并启动所有服务。本教程将详细介绍Docker Compose的安装、配置文件编写、常用命令、网络和卷管理、环境变量处理以及生产环境部署等各个方面,帮助您全面掌握Docker Compose的使用。
2. 安装Docker Compose
在开始使用Docker Compose之前,您需要先安装它。Docker Compose是一个独立的工具,与Docker引擎一起工作。以下是不同操作系统上的安装步骤:
2.1. Linux系统安装
下载最新版本的Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
为二进制文件添加可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
创建软链接(可选):
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证安装:
docker-compose --version
2.2. macOS系统安装
在macOS上,Docker Compose已包含在Docker Desktop中。只需安装Docker Desktop即可自动包含Docker Compose。
2.3. Windows系统安装
在Windows上,同样需要安装Docker Desktop,Docker Compose会自动安装并包含在Docker环境中。
3. Docker Compose基本概念
Docker Compose的核心概念包括:
服务(Service):一个服务代表一个容器,例如Web服务器、数据库等。在docker-compose.yml文件中定义。
项目(Project):由一组关联的服务组成,由docker-compose.yml文件定义。
容器(Container):由服务创建的运行实例。
网络(Network):用于服务之间的通信。Docker Compose会自动创建一个默认网络。
卷(Volume):用于持久化数据,即使容器被删除,数据仍然保留。
4. 编写docker-compose.yml文件
docker-compose.yml是Docker Compose的核心配置文件,使用YAML格式编写。以下是一个典型的多服务应用程序的docker-compose.yml文件示例:
version: '3.8' # 指定Compose文件版本
services: # 定义服务
web: # 服务名称
image: nginx:latest # 使用的镜像
ports: # 端口映射
- "8080:80"
volumes: # 卷挂载
- ./html:/usr/share/nginx/html
networks: # 连接的网络
- app-network
environment: # 环境变量
- NGINX_HOST=example.com
depends_on: # 服务依赖
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
healthcheck: # 健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
networks: # 定义网络
app-network:
driver: bridge
volumes: # 定义卷
db-data:
4.1. 文件结构详解
version: 指定Compose文件版本格式,不同版本支持不同的功能。
services: 定义所有服务,每个服务由名称、镜像、端口、卷等属性组成。
image: 指定服务使用的Docker镜像。
ports: 将容器端口映射到主机端口,格式为"主机端口:容器端口"。
volumes: 挂载卷到容器,格式为"主机路径:容器路径"。也可以使用命名卷(如db-data)。
networks: 指定服务连接的网络。可以自定义网络,如app-network。
environment: 设置环境变量。
depends_on: 指定服务依赖关系,确保依赖的服务先启动。
healthcheck: 定义健康检查命令,用于监控服务状态。
networks (顶级): 定义网络配置。
volumes (顶级): 定义命名卷。
5. 使用docker-compose命令
Docker Compose提供了一套命令来管理应用程序的生命周期。以下是最常用的命令:
5.1. 启动服务
docker-compose up -d
-d 参数表示在后台运行服务。
5.2. 停止服务
docker-compose down
停止并删除容器、网络、卷和镜像(由--rmi选项控制)。
5.3. 查看服务状态
docker-compose ps
显示所有服务的运行状态。
5.4. 查看服务日志
docker-compose logs -f web
-f 参数表示实时跟踪日志,web 是服务名称。
5.5. 进入容器执行命令
docker-compose exec web bash
在web服务中启动bash终端。
5.6. 构建镜像
docker-compose build
构建或重建服务使用的镜像。
5.7. 扩展服务
docker-compose up -d --scale web=3
将web服务扩展为3个实例。
6. 网络配置
Docker Compose默认创建一个名为<项目名>_default的网络。所有服务都连接到这个网络,可以使用服务名称作为主机名相互访问。
6.1. 自定义网络
在docker-compose.yml中定义自定义网络:
networks:
app-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
6.2. 外部网络
连接到已存在的Docker网络:
networks:
default:
external:
name: my_existing_network
7. 卷配置
卷用于持久化数据,有三种类型:
命名卷:在顶级volumes中定义,由Docker管理。
绑定挂载:挂载主机目录到容器。
临时卷:仅容器生命周期内存在。
7.1. 示例配置
services:
web:
volumes:
- html:/usr/share/nginx/html # 命名卷
- ./config:/etc/nginx/conf.d # 绑定挂载
- /tmp # 临时卷
volumes:
html: # 命名卷定义
8. 环境变量处理
Docker Compose支持多种方式处理环境变量:
8.1. 在docker-compose.yml中设置
environment:
- DEBUG=1
- DATABASE_URL=mysql://root:secret@db/mydb
8.2. 使用.env文件
创建.env文件:
DEBUG=1
DATABASE_URL=mysql://root:secret@db/mydb
然后在docker-compose.yml中引用:
environment:
- DEBUG=${DEBUG}
- DATABASE_URL=${DATABASE_URL}
8.3. 命令行覆盖
docker-compose up -e DEBUG=0
9. 生产环境部署
在生产环境中使用Docker Compose需要考虑以下因素:
9.1. 使用非root用户
在Dockerfile中创建非root用户:
FROM node:14
RUN useradd -m appuser
USER appuser
9.2. 安全配置
services:
web:
cap_drop:
- ALL
cap_add:
- CHOWN
- NET_BIND_SERVICE
read_only: true
tmpfs:
- /tmp:rw,size=100m
9.3. 日志管理
services:
web:
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
9.4. 反向代理
使用Nginx作为反向代理:
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
9.5. 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
9.6. 资源限制
services:
web:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
10. 高级特性
10.1. 依赖管理
depends_on:
db:
condition: service_healthy # 依赖服务的健康状态
10.2. 配置文件
services:
app:
configs:
- source: app_config
target: /etc/app/config.json
configs:
app_config:
file: ./config.json
10.3. 密钥管理
services:
db:
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
11. 总结
Docker Compose是一个强大的工具,极大地简化了多容器应用程序的开发、测试和部署流程。通过本文的详细介绍,您应该能够:
安装并配置Docker Compose环境
编写复杂的docker-compose.yml文件,定义多服务应用程序
使用docker-compose命令管理容器生命周期
配置网络和卷实现服务通信和数据持久化
处理环境变量以适应不同环境
实施生产环境最佳实践,包括安全、日志和资源管理
利用高级特性如健康检查、依赖管理和密钥管理
Docker Compose特别适合开发环境和小规模生产环境,但对于大规模生产部署,建议结合使用Docker Swarm或Kubernetes等容器编排平台。继续实践和探索Docker Compose的各种功能,将帮助您构建更健壮、更高效的容器化应用程序。







