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

这样会同时重启 webdb 服务。

如果你希望对某个服务进行更精确的控制(比如只重启容器而不重新构建镜像),这时 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 无意义。
  • 健康检查的性能影响

    • 频繁的健康检查可能对容器资源产生轻微影响,应根据实际需求设置合适的 intervaltimeout
  • depends_on 中使用 condition

    • condition: service_healthy 仅在 Docker Compose 3.4 及以上版本支持。



相关推荐