一、简介
Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。它允许用户使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令来从 YAML 文件配置中创建并启动所有服务。其主要目的是为了简化了多容器 Docker 应用程序的部署和管理过程。
二、安装
Docker Compose可以在大多数Linux发行版上安装,包括Ubuntu、CentOS等。安装方法可能包括通过包管理器安装或直接下载二进制文件。在Windows系统上,Docker Compose通常随Docker Desktop一起安装,不需要单独安装。Linux系统上安装步骤如下:
- 下载当前稳定的Compose版本:
curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 给予Docker Compose可执行权限:
chmod +x /usr/local/bin/docker-compose
- 验证安装是否成功:
docker-compose --version
三、Docker Compose使用
3.1 编写 docker-compose.yml 配置文件
创建一个名为docker-compose.yml
的YAML文件,在其中定义要启动的服务、网络、卷等配置。下面是一个简单的 docker-compose.yml
配置文件示例:
bash
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
depends_on:
- redis
redis:
image: redis
volumes:
logvolume01: {}
这个配置文件定义了两个服务:web 和 redis,web服务是依赖redis服务的,先启动 redis服务,再启动 web。web 服务使用从当前目录中构建的镜像,并将容器的 5000 端口映射到主机的 5000 端口。redis 服务使用 Docker Hub 上的官方 Redis 镜像。
3.2 启动 docker-compose
执行 docker-compose up -d
命令来启动并运行整个应用程序。
四、Docker Compose常用命令
Docker Compose命令基本上和Docker相差不多,主要就是对Docker Compose生命周期控制、日志格式等相关命令。常用的命令如下:
- docker-compose up:启动所有服务。
- docker-compose up -d:在后台启动所有服务。
- docker-compose down:停止并删除所有容器、网络、卷和镜像。
- docker-compose ps:列出所有运行的容器。
- docker-compose logs:查看容器输出日志。
- docker-compose exec:在容器内部执行命令。
- docker-compose build:构建服务的镜像。
- docker-compose restart:重启服务。
- docker-compose start:启动服务。
- docker-compose stop:停止服务。
- docker-compose config:检查Docker Compose配置文件的语法。
- docker-compose push:推送服务镜像到仓库。
- docker-compose pull:从仓库拉取服务镜像。
- docker-compose top:显示由 Docker Compose 管理的所有容器的进程信息。
五、docker-compose.yml 配置文件解析
docker-compose.yml
文件是用于定义和运行多个 Docker 容器的 YAML 文件。它的通常组成部分有:服务定义、网络定义和数据卷定义等。以下是一个基本的 docker-compose.yml
文件示例:
bash
# 指定Docker Compose 文件的版本
version: '3'
# 必填部分,定义服务
services:
web:
image: nginx
ports:
- "80:80"
networks:
- mynetwork
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
networks:
- mynetwork
# 可选部分,定义网络
networks:
network_name:
driver: bridge # 网络类型,默认为桥接网络
# 可选部分,定义数据卷
volumes:
volume_name:
driver: local # 数据卷驱动,默认为本地存储
5.1 version
指定Docker Compose文件的版本信息,定义关乎于docker的兼容性。随着 Docker Compose 的发展,出现了多个版本,每个版本都带来了新的特性和改进。以下是一些常见的 Docker Compose 文件版本号:
- Version 1: 这是最早的版本,不支持数据卷、网络和构建参数配置。它不会利用 Docker 网络的优势,每个容器都位于默认的桥接网络上,并且需要使用 links 来启用容器之间的发现。
- Version 2.x: 引入了对 Swarm 模式的支持,可以通过 docker stack 命令将 Compose 文件部署到 Swarm 集群中。它支持数据卷和网络的配置,默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。
- Version 3.x: 这是最新的版本,也是推荐使用的版本。它与 Docker Engine 的 Swarm 模式形成交叉兼容,并引入了一些新特性,例如配置命名空间、健康检查、秘密管理等。
5.2 services
services
是一个顶级元素,docker-compose.yml
文件中的核心部分,它定义了应用程序中的各个服务及其配置。每个服务都是一个独立的容器,可以运行在不同的主机上。以下是 services 元素中常见的配置选项:
- image: 指定服务使用的 Docker 镜像名称,可以是公共 Docker Hub 中的镜像,也可以是本地的自定义镜像。
- build: 指定 Dockerfile 的路径,Docker Compose 将自动构建该服务的 Docker 镜像。
- container_name: 指定容器的名称,如果不指定,Docker 会自动分配一个唯一的名称。
- ports: 指定容器和宿主机之间的端口映射关系,格式为 宿主机端口:容器端口。
- expose:声明容器暴露的端口。不会在主机和容器之间创建端口映射,而是仅仅在容器内部定义了一个端口,以便其他容器可以通过容器网络进行访问。
- environment: 定义容器的环境变量,可以是数组或字典形式。
- volumes: 指定容器和宿主机之间的数据卷映射关系,格式为 宿主机路径:容器路径。
- networks: 指定容器所属的网络,可以是已存在的网络或者新建的网络。
- depends_on: 指定服务之间的依赖关系,使得一个服务启动前必须先启动其依赖的服务。
- links:链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名。
- restart: 指定容器退出后的重启策略,如 no, always, on-failure, unless-stopped。
- command: 覆盖容器启动后要执行的命令。
- healthcheck:定义容器的健康检查逻辑。通过这种方式,你可以确保容器在启动后能够正常运行,并且在出现问题时能够被及时发现和处理。
- env_file:从文件添加环境变量。可以是单个值(env_file: .env)或列表的多个值。
- secrets:用于定义敏感数据的部分。这些敏感数据通常是需要保密的信息,如数据库密码、API密钥等。
bash
version: "3.9"
# 定义服务
services:
# 定义服务1
service1: # 自定义服务名称
image: postgresql # 使用的是postgresql镜像
build:
context: ./dir # Dockerfile 所在的上下文路径
dockerfile: Dockerfile # Dockerfile 的名称,默认为 Dockerfile
container_name: my-postgresql-container # 指定自定义容器名
ports:
- "5005:5432" # 将主机的5005端口映射到容器的5432端口上
expose:
- "8080" # 暴露容器内部8080端口
environment: # 环境变量
- DB_HOST=${DB_HOST}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
volumes: # 数据卷挂载
- /db-data:/var/lib/postgresql/data # 将主机根目录下的db-data目录挂载到容器的/var/lib/postgresql/data目录中
networks: # 网络配置
- my_network: aliased_web # 服务在my_network网络中被赋予别名aliased_web
depends_on: # 依赖服务
- service2 # 指定要依赖的服务名称
links: # 链接服务
- service3 # 指定要链接的服务名称
restart: always # 重启策略
command: ["echo", "Goodbye World"] # 会覆盖容器启动命令
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
env_file:
- ./config/env
secrets:
- my_secret
- my_other_secret
# 定义服务2
service2:
image: nginx # 使用的是nginx镜像
volumes:
- my_data:/data # my_data卷被挂载到service2容器的/data路径
# 定义数据卷,与services元素同级
volumes:
my_data:
# 定义网络,与services元素同级
networks:
my_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
# 定义密钥, 与services元素同级
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true