docker compose工具
阅读数:269 评论数:0
跳转到新版页面分类
应用软件
正文
一、概述
Docker Compose 是 Docker 提供的一个工具,在大多数系统中,Docker Compose 通常会随着 Docker 的安装一同安装。用于定义和运行多容器的 Docker 应用。通过一个 YAML 文件,你可以配置应用的所有服务,然后使用一个命令来创建和启动所有服务。Docker Compose 适用于开发、测试和生产环境中的多容器应用。
你可以通过以下命令检查是否已安装 Docker Compose:
docker-compose --version
二、基本概念
1、service
服务是一个应用的容器,定义了容器的镜像、命令、端口映射、环境变量等。
2、network
服务之间可以通过网络进行通信,Docker Compose 会自动创建一个默认网络,所有服务都连接到这个网络。
3、volume
用于持久化数据,卷可以在多个容器之间共享数据。
三、文件结构
Docker Compose 文件使用 YAML 格式,通常命名为 docker-compose.yml
。
1、示例:web应用和数据库
假设我们有一个简单的 Web 应用,它使用 Nginx 作为前端服务器和 MySQL 作为数据库。
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./web:/usr/share/nginx/html
networks:
- webnet
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: exampledb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
networks:
- webnet
volumes:
db_data:
networks:
webnet:
- 版本:
version: '3.8'
指定了 Docker Compose 文件的版本。 - 服务:
web
:定义了一个名为web
的服务,使用 Nginx 镜像,映射端口 8080 到容器的 80 端口,并挂载本地目录./web
到容器的/usr/share/nginx/html
。db
:定义了一个名为db
的服务,使用 MySQL 5.7 镜像,设置了一些环境变量来配置数据库,并挂载一个名为db_data
的卷到容器的/var/lib/mysql
目录。
- 卷:定义了一个名为
db_data
的卷,用于持久化 MySQL 数据。 - 网络:定义了一个名为
webnet
的网络,所有服务都连接到这个网络。
2、restart
Docker 的 restart
策略有几个选项,每个选项都定义了容器在不同情况下的重启行为。下面是 Docker 中 restart
策略的详细说明:
- no: 不重启容器(默认设置)。
- always: 无论何时容器停止,都会自动重启。
- unless-stopped: 除非容器被手动停止,否则都会自动重启。
- on-failure: 仅在容器以非零退出代码失败时重启,且可以设置最大重启次数。
3、networks
networks:
custom-network:
driver: bridge
host
: 容器将使用主机网络。容器与主机共享 IP 地址,容器不会获得单独的 IP 地址。overlay
: 用于跨多个 Docker 主机的网络,适合 Docker Swarm 或多主机集群。none
: 不为容器配置任何网络。bridge
: 这里指定了网络使用bridge
驱动程序,这意味着服务将会连接到一个使用桥接网络的 Docker 网络。bridge
是 Docker 中最常见的网络驱动,适合大多数场景,尤其是开发环境。
四、使用Docker Compose
1、启动服务
在包含 docker-compose.yml
文件的目录中,运行以下命令来启动所有服务:
docker-compose up
Docker Compose 会根据 docker-compose.yml
文件中定义的服务,自动检查每个服务所需的镜像。如果某个镜像在本地没有,它会从 Docker Hub(或其他指定的镜像仓库)拉取镜像。
2、后台运行
如果希望在后台运行服务,可以使用 -d
参数:
docker-compose up -d
3、停止服务
要停止所有服务,可以使用以下命令:
docker-compose down
4、查看日志
要查看所有服务的日志,可以使用以下命令:
docker-compose logs
5、重新构建服务
如果修改了 Dockerfile 或者 docker-compose.yml
,需要重新构建服务,可以使用以下命令:
#需要先停止容器
docker-compose down
docker-compose up --build
6、常用命令
docker-compose ps
:列出所有运行的服务。docker-compose exec <service> <command>
:在指定服务的容器中执行命令。docker-compose stop
:停止所有服务。docker-compose start
:启动已停止的服务。docker-compose restart
:重启服务。
7、只重启其中一个服务
如果你只想重启其中一个服务,而不重启整个应用栈,你可以使用以下命令:
docker-compose restart <服务名称>
docker-compose restart web db
这样会同时重启 web
和 db
服务。
如果你希望对某个服务进行更精确的控制(比如只重启容器而不重新构建镜像),这时 restart
命令会更方便。
8、手动拉取镜像
如果你想提前拉取所有服务的镜像,可以执行:
docker-compose pull
这会拉取 docker-compose.yml
文件中所有服务所需的镜像,而不启动容器。
- 如果镜像存在本地,Docker Compose 会直接使用本地镜像。
- 如果镜像不存在,Docker Compose 会自动尝试拉取镜像。
- 你可以使用
docker-compose pull
来手动拉取镜像。
五、通过healthCheck指定服务启动顺序
1、healthcheck参数
healthcheck:
test: ["CMD", "<command>"] # 健康检查命令(如检测服务是否正常运行)
interval: <duration> # 检查间隔时间(默认30s)
timeout: <duration> # 每次检查的超时时间(默认30s)
retries: <number> # 尝试检查的最大次数(默认3次)
start_period: <duration> # 初始启动延迟时间(可选,默认0s)
2、示例
(1)mysql健康检查
version: '3.8'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root_password
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
test
: 检查命令mysqladmin ping -h 127.0.0.1
。interval
: 每隔 10 秒执行一次检查。timeout
: 每次检查的超时时间为 5 秒。retries
: 检查失败后最多重试 3 次。start_period
: 在 30 秒内允许服务初始化,不触发检查失败。
(2)redis健康检查
version: '3.8'
services:
redis:
image: redis:latest
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
start_period: 20s
test
: 使用redis-cli ping
检查服务状态(返回PONG
表示正常)。retries
: 如果失败,会最多重试 5 次。
(3)使用shell命令
如果需要更复杂的检查逻辑,可以使用 Shell 脚本:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost/ || exit 1"]
interval: 15s
timeout: 10s
retries: 3
start_period: 10s
CMD-SHELL
: 允许使用 Shell 执行命令,例如检查 HTTP 服务是否返回 200 状态码。curl -f
: 请求失败时返回非零状态码。
3、组合依赖启动
通过 depends_on
配置实现服务的依赖启动:
version: '3.8'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
app:
image: your-app:latest
depends_on:
db:
condition: service_healthy
4、注意事项
-
健康检查的适用性:
- 健康检查仅在服务运行的容器内有效。
- 对于仅执行一次性任务的容器(如 Job 容器),
healthcheck
无意义。
-
健康检查的性能影响:
- 频繁的健康检查可能对容器资源产生轻微影响,应根据实际需求设置合适的
interval
和timeout
。
- 频繁的健康检查可能对容器资源产生轻微影响,应根据实际需求设置合适的
-
在
depends_on
中使用condition
:condition: service_healthy
仅在 Docker Compose3.4
及以上版本支持。