Docker Compose完整教程
目录
1. Docker Compose是什么?
2. 为什么需要Docker Compose?
3. 安装Docker Compose
4. YAML语法基础
5. docker-compose.yml文件详解
6. Docker Compose常用命令
7. 实战案例:从简单到复杂
8. 服务间通信
9. 数据持久化
10. 环境变量管理
11. 多环境部署
12. 最佳实践
13. 常见问题与解决方案
总结
1. Docker Compose是什么?
简单理解
Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。
形象比喻:
- 如果Docker是"单个房间",那么Docker Compose就是"整栋房子的建筑图纸"
- 如果Docker容器是"单个演员",那么Docker Compose就是"整部戏的导演脚本"
核心概念
- 服务(Service):一个应用程序的组件,比如web服务器、数据库等
- 项目(Project):由一组关联的服务组成的完整应用
- 容器(Container):服务的运行实例
Docker Compose的作用
# 一个命令启动整个应用栈
docker-compose up# 而不是一个个地启动:
docker run -d --name db mysql:8.0
docker run -d --name web --link db nginx
docker run -d --name app --link db --link web myapp
2. 为什么需要Docker Compose?
传统方式的问题
单独启动多个容器的麻烦
# 启动数据库
docker run -d \--name mysql_db \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_DATABASE=myapp \-v mysql_data:/var/lib/mysql \-p 3306:3306 \mysql:8.0# 启动Redis
docker run -d \--name redis_cache \-p 6379:6379 \redis:7-alpine# 启动应用
docker run -d \--name my_app \--link mysql_db:db \--link redis_cache:redis \-e DATABASE_URL=mysql://root:123456@db:3306/myapp \-e REDIS_URL=redis://redis:6379 \-p 8080:8080 \my-spring-app:latest
Docker Compose的优势
简化的方式
# docker-compose.yml
version: '3.8'
services:db:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: myappvolumes:- mysql_data:/var/lib/mysqlredis:image: redis:7-alpineapp:image: my-spring-app:latestports:- "8080:8080"environment:DATABASE_URL: mysql://root:123456@db:3306/myappREDIS_URL: redis://redis:6379depends_on:- db- redisvolumes:mysql_data:
一个命令搞定:
docker-compose up -d
主要优势对比
特性 | 传统Docker命令 | Docker Compose |
---|---|---|
启动复杂度 | 需要多个长命令 | 一个命令 |
配置管理 | 分散在各个命令中 | 集中在YAML文件 |
服务依赖 | 手动管理启动顺序 | 自动处理依赖 |
网络配置 | 手动创建和连接 | 自动创建 |
数据卷管理 | 分别创建 | 统一管理 |
环境一致性 | 容易出错 | 配置文件保证一致性 |
3. 安装Docker Compose
检查是否已安装
docker-compose --version
# 或者新版本语法
docker compose version
Windows/macOS
Docker Desktop已经包含了Docker Compose,无需单独安装。
Linux安装
方法1:使用pip安装
# 安装pip
sudo apt update
sudo apt install python3-pip# 安装docker-compose
pip3 install docker-compose# 验证安装
docker-compose --version
方法2:下载二进制文件
# 下载最新版本
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
方法3:使用包管理器
# Ubuntu/Debian
sudo apt update
sudo apt install docker-compose# CentOS/RHEL
sudo yum install docker-compose
4. YAML语法基础
YAML简介
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化标准。
基本语法规则
1. 缩进表示层级关系
# 正确的缩进(使用空格,不要用Tab)
services:web:image: nginxports:- "80:80"# 错误的缩进
services:
web:image: nginxports:- "80:80"
2. 冒号后面必须有空格
# 正确
key: value# 错误
key:value
3. 列表使用短横线
# 列表语法
fruits:- apple- banana- orange# 或者内联形式
fruits: [apple, banana, orange]
4. 字符串可以有引号或无引号
# 这些都是有效的
name: John
name: "John"
name: 'John'# 特殊字符需要引号
message: "Hello: World"
path: "C:\\Users\\Name"
5. 布尔值和数字
# 布尔值
enabled: true
disabled: false# 数字
port: 8080
pi: 3.14
YAML在Docker Compose中的应用
基本结构
version: '3.8' # 版本号
services: # 服务定义service1: # 服务1配置service2:# 服务2配置
volumes: # 数据卷定义volume1:
networks: # 网络定义network1:
5. docker-compose.yml文件详解
5.1 文件结构概览
version: '3.8' # Compose文件格式版本services: # 定义服务web: # 服务名称# 服务配置db:# 数据库配置volumes: # 定义数据卷data: # 数据卷名称networks: # 定义网络frontend: # 网络名称backend:configs: # 定义配置文件(可选)
secrets: # 定义敏感数据(可选)
5.2 版本说明
版本对应关系
Compose文件版本 | Docker Engine版本 |
---|---|
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.0-3.5 | 17.06.0+ |
推荐使用最新版本
version: '3.8' # 推荐
5.3 Services详解
基本配置
services:web:image: nginx:latest # 使用的镜像container_name: my-nginx # 容器名称(可选)ports: # 端口映射- "8080:80" # 主机端口:容器端口- "8443:443"environment: # 环境变量- ENV=production- DEBUG=falsevolumes: # 数据卷挂载- ./html:/usr/share/nginx/html- ./config:/etc/nginx/conf.dnetworks: # 网络配置- frontenddepends_on: # 依赖关系- dbrestart: unless-stopped # 重启策略
构建配置
services:app:build: # 构建配置context: . # 构建上下文路径dockerfile: Dockerfile # Dockerfile文件名args: # 构建参数JAR_FILE: app.jarVERSION: 1.0.0image: my-app:latest # 构建后的镜像名
高级配置
services:app:image: my-app:latestdeploy: # 部署配置(Swarm模式)replicas: 3resources:limits:cpus: '0.5'memory: 512Mreservations:cpus: '0.25'memory: 256Mhealthcheck: # 健康检查test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 10sretries: 3start_period: 40slogging: # 日志配置driver: "json-file"options:max-size: "10m"max-file: "3"
5.4 数据卷(Volumes)详解
命名卷
services:db:image: mysql:8.0volumes:- mysql_data:/var/lib/mysql # 使用命名卷volumes:mysql_data: # 定义命名卷driver: local # 卷驱动
绑定挂载
services:web:image: nginxvolumes:- ./html:/usr/share/nginx/html:ro # 只读挂载- ./logs:/var/log/nginx # 读写挂载- /etc/localtime:/etc/localtime:ro # 同步时间
卷配置选项
volumes:mysql_data:driver: localdriver_opts:type: nfso: addr=192.168.1.100,rwdevice: ":/path/to/dir"app_data:external: true # 使用外部卷name: my-app-data # 外部卷名称
5.5 网络(Networks)详解
自定义网络
services:web:networks:- frontendapp:networks:- frontend- backenddb:networks:- backendnetworks:frontend:driver: bridge # 网络驱动backend:driver: bridgeinternal: true # 内部网络,不能访问外网
网络配置选项
networks:custom:driver: bridgeipam: # IP地址管理config:-