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.0docker run -d --name web --link db nginxdocker 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# 启动Redisdocker 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.ymlversion: \'3.8\'services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: myapp volumes: - mysql_data:/var/lib/mysql redis: image: redis:7-alpine app: image: my-spring-app:latest ports: - \"8080:8080\" environment: DATABASE_URL: mysql://root:123456@db:3306/myapp REDIS_URL: redis://redis:6379 depends_on: - db - redisvolumes: mysql_data:
一个命令搞定:
docker-compose up -d
主要优势对比
3. 安装Docker Compose
检查是否已安装
docker-compose --version# 或者新版本语法docker compose version
Windows/macOS
Docker Desktop已经包含了Docker Compose,无需单独安装。
Linux安装
方法1:使用pip安装
# 安装pipsudo apt updatesudo apt install python3-pip# 安装docker-composepip3 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/Debiansudo apt updatesudo apt install docker-compose# CentOS/RHELsudo yum install docker-compose
4. YAML语法基础
YAML简介
YAML(YAML Ain\'t Markup Language)是一种人类可读的数据序列化标准。
基本语法规则
1. 缩进表示层级关系
# 正确的缩进(使用空格,不要用Tab)services: web: image: nginx ports: - \"80:80\" # 错误的缩进services:web: image: nginx ports: - \"80:80\"
2. 冒号后面必须有空格
# 正确key: value# 错误key:value
3. 列表使用短横线
# 列表语法fruits: - apple - banana - orange# 或者内联形式fruits: [apple, banana, orange]
4. 字符串可以有引号或无引号
# 这些都是有效的name: Johnname: \"John\"name: \'John\'# 特殊字符需要引号message: \"Hello: World\"path: \"C:\\\\Users\\\\Name\"
5. 布尔值和数字
# 布尔值enabled: truedisabled: false# 数字port: 8080pi: 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 版本说明
版本对应关系
推荐使用最新版本
version: \'3.8\' # 推荐
5.3 Services详解
基本配置
services: web: image: nginx:latest # 使用的镜像 container_name: my-nginx # 容器名称(可选) ports: # 端口映射 - \"8080:80\" # 主机端口:容器端口 - \"8443:443\" environment: # 环境变量 - ENV=production - DEBUG=false volumes: # 数据卷挂载 - ./html:/usr/share/nginx/html - ./config:/etc/nginx/conf.d networks: # 网络配置 - frontend depends_on: # 依赖关系 - db restart: unless-stopped # 重启策略
构建配置
services: app: build: # 构建配置 context: . # 构建上下文路径 dockerfile: Dockerfile # Dockerfile文件名 args: # 构建参数 JAR_FILE: app.jar VERSION: 1.0.0 image: my-app:latest # 构建后的镜像名
高级配置
services: app: image: my-app:latest deploy: # 部署配置(Swarm模式) replicas: 3 resources: limits: cpus: \'0.5\' memory: 512M reservations: cpus: \'0.25\' memory: 256M healthcheck: # 健康检查 test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8080/health\"] interval: 30s timeout: 10s retries: 3 start_period: 40s logging: # 日志配置 driver: \"json-file\" options: max-size: \"10m\" max-file: \"3\"
5.4 数据卷(Volumes)详解
命名卷
services: db: image: mysql:8.0 volumes: - mysql_data:/var/lib/mysql # 使用命名卷volumes: mysql_data: # 定义命名卷 driver: local # 卷驱动
绑定挂载
services: web: image: nginx volumes: - ./html:/usr/share/nginx/html:ro # 只读挂载 - ./logs:/var/log/nginx # 读写挂载 - /etc/localtime:/etc/localtime:ro # 同步时间
卷配置选项
volumes: mysql_data: driver: local driver_opts: type: nfs o: addr=192.168.1.100,rw device: \":/path/to/dir\" app_data: external: true # 使用外部卷 name: my-app-data # 外部卷名称
5.5 网络(Networks)详解
自定义网络
services: web: networks: - frontend app: networks: - frontend - backend db: networks: - backendnetworks: frontend: driver: bridge # 网络驱动 backend: driver: bridge internal: true # 内部网络,不能访问外网