当前位置: 首页 > news >正文

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.819.03.0+
3.718.06.0+
3.618.02.0+
3.0-3.517.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:- 

相关文章:

  • 【Chipyard】 conda 环境安装与使用
  • 黑马python(四)
  • 正则表达式:开启文本处理的魔法之门
  • Git不能更新以及提交代码,提示链接超时,本地凭证无问题
  • Binder
  • ONLYOFFICE 协作空间 企业版使用秘籍-1.如何使用外部存储
  • 达梦数据库部署veri数据对比工具
  • 3.3.2 纠错编码(海明校验码)
  • 板凳-------Mysql cookbook学习 (十--5)
  • 鸿蒙Next仓颉语言开发实战教程:订单列表
  • Spring Cloud与Alibaba微服务架构全解析
  • Android GreenDAO 通过 Key 查询数据库数据慢问题优化
  • 力扣hot100--反转链表
  • 多线程应用
  • 详细解释aruco::markdetection _detectInitialCandidates函数
  • Java八股文——Spring「MyBatis篇」
  • Linux开发工具之VsCode(Filezila、MobaXterm、Vim三合一)
  • git的常用方法
  • 【Unity优化】提高热更新和打包速度
  • 架空线路智能监控系统的应用与优势剖析
  • 巢湖网 网站/正规电商平台有哪些
  • wordpress 插件漏洞/宁波seo外包快速推广
  • 东城建设网站/seo引流什么意思
  • 用asp.net做购物网站/廊坊优化外包
  • 主流网站开发技术/适合发表个人文章的平台
  • 系部网站开发计划/营销系统