一、概述

docker-compose 项目是docker官方的开源项目, 负责完成对docker容器集群的快速编列,来轻松高效的办理容器,界说运转多个容器。

  • docker-compose将所办理的容器分为三层, 别离是工程(project)服务(service)以及容器(containner)
  • docker-compose运转目录下的一切文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特别指定,工程名即为当时目录名。
  • 一个工程傍边,能够包含多个服务,每个服务中界说了容器运转的镜像、参数、依靠。
  • 一个服务中能够包含多个容器实例,docker-compose并没有解决负载均衡的问题。因而需求凭借其他东西完成服务发现及负载均衡,比如consul
  • docker-compose的工程装备文件默以为 docker-compose.yml。能够经过环境变量COMPOSE_FILE -f 参数自界说装备文件,其自界说多个有依靠联系的服务及每个人服务运转的容器。

官方文档:docs.docker.com/compose/

GitHub:github.com/docker/comp…

曾经也写过一篇关于docker compose根底的文章,有爱好的能够先查阅看看:Docker三剑客之Compose

docker-compose 进阶篇

二、Compose 和 Docker 兼容性

Compose 文件格局有多个版别:1、2、2.x、和 3.x。下面的表格是 Compose 文件所支持的指定的 docker 发行版:

docker-compose 进阶篇

三、装置 docker

# 装置yum-config-manager装备东西
yum -y install yum-utils
# 主张运用阿里云yum源:(引荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 装置docker-ce版别
yum install -y docker-ce
# 发动并开机发动
systemctl enable --now docker
docker --version

四、装置 docker-compose

官方装置地址教程:docs.docker.com/compose/ins…

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose --version

五、环境变量

Docker Compose 答应你运用多种办法为服务设置环境变量。这些环境变量能够用来装备你的应用程序或将灵敏信息传递给你的容器。

下面是一些设置 Docker Compose 环境变量的办法:

1)在 docker-compose.yml 文件中设置环境变量

你能够在 docker-compose.yml 文件中为每个服务设置环境变量。在服务装备中,运用 environment 关键字,并在其间列出需求设置的环境变量和其值。

services:
  web:
    image: nginx
    environment:
      MY_VAR: my_value

2)从 .env 文件中读取环境变量

你能够将环境变量存储在一个 .env 文件中,并让 Docker Compose 读取它。在 docker-compose.yml 文件中,运用 env_file 关键字并指定 .env 文件的途径。

services:
  web:
    image: nginx
    env_file:
      - .env

3)运用 shell 环境变量

你也能够在发动 docker-compose 指令时,运用 shell 环境变量传递环境变量值。例如:

$ export MY_VAR=my_value
$ docker-compose up

docker-compose.yml 文件中运用 ${MY_VAR} 语法来引用 shell 环境变量。

services:
  web:
    image: nginx
    environment:
      MY_VAR: ${MY_VAR}

运用环境变量能够使你的应用程序更具灵活性,而且能够方便地办理灵敏信息。

六、编列中的字段详解

在 Docker Compose 编列文件中,有一些重要的字段需求了解:

1)version

version 字段指定了 Docker Compose 编列文件的版别。当时最新版别是 3

version: '3'

2)services

services 字段指定了在 Docker Compose 编列中要运转的服务。每个服务都有一个称号,并指定要运用的镜像和容器的装备选项。以下是一个简略的 services 装备的示例:

services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

3)build 与 image

1、build

build 字段答应在 Docker Compose 编列中指定 Dockerfile 的方位,然后能够运用 Docker Compose 构建镜像。例如,以下是运用本地 Dockerfile 的示例:

services:
  web:
    build: .

也能够指定一个包含 Dockerfile 的目录:

services:
  web:
    build: ./my-web-app

2、image

image 字段指定要运用的 Docker 镜像。例如:

services:
  web:
    image: nginx

【温馨提示】build 和 image 二选一即可,也能够一起写,可是一般只挑选image吧。

version: '3.8'
services:
  web:
    build: ./web
    image: myapp/web:latest

上面的装备指定了服务称号为web,Dockerfile途径为./web,镜像称号为 myapp/web,标签为 latest。在运转docker-compose build 指令时,会主动构建名为 myapp/web:latest 的镜像。

4)networks

networks 字段指定了要运用的网络。默许情况下,Docker Compose 创立一个名为 default 的网络。以下是一个运用自界说网络的示例:

networks:
  my-network:
    driver: bridge

5)volumes

volumes 字段指定了要运用的数据卷。以下是一个运用数据卷的示例(下面会细讲):

volumes:
  my-volume:
    driver: local

6)environment 与 environment_file

1、environment

environment 字段指定了要设置的环境变量。以下是一个运用环境变量的示例:

environment:
  MY_VAR: my_value

2、environment_file

environment_file:指定从文件中读取环境变量。

environment_file: .env

7)ports 与 expose

1、ports

ports 字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。以下是一个运用端口映射的示例:

ports:
  - "8080:80"

2、expose

expose 字段是用于在 Docker 容器内部露出端口的选项,能够让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。

在 docker-compose.yml 文件中运用 expose 选项来指定容器内部需求露出的端口。例如,以下示例界说了一个 web 服务,它露出了 8000 和 8080 端口:

version: '3'
services:
  web:
    image: myapp:latest
    expose:
      - "8000"
      - "8080"

当您运用 expose 选项时,其他容器能够运用 Docker 的内部网络进行连接。例如,假如您有另一个服务 worker,它需求连接到 web 服务的 8000 端口,则能够在 worker 服务的 docker-compose.yml 文件中运用 links 选项:

version: '3'
services:
  worker:
    image: myworker:latest
    links:
      - web

8)depends_on

depends_on 字段指定了服务之间的依靠联系。例如,假如 web 服务依靠于 db 服务,则能够运用以下示例:

depends_on:
  - db

9)restart

Docker Compose 供给了几种重启战略,以便在容器出现故障时主动重启它们。以下是可用的重启战略:

  • no: 不重启任何容器。假如容器中止,Compose 不会测验主动重启它们。(默许战略

  • always: 假如容器中止,Compose 将主动重启它。(常用

  • on-failure: 只要在容器因非 0 退出码而中止时才会重启。

  • unless-stopped: 除非手动中止,不然一直重启容器。这相当于运用 docker run 指令时运用的 –restart=unless-stopped 标志。

这些战略能够在 docker-compose.yml 文件中经过 restart 键指定,例如:

version: '3'
services:
  web:
    image: myapp:latest
    restart: always

这个示例运用 always 战略,这意味着假如 web 容器中止,Compose 将主动重启它。

10)command

command 字段能够运用多种写法来指定容器发动时要履行的指令,详细取决于您的需求和偏好。以下是一些常见的写法示例:

1、字符串方法

version: '3'
services:
  web:
    image: myapp:latest
    command: python manage.py runserver 0.0.0.0:8000

在这个示例中,command 字段的值是一个字符串,表明要履行的指令和参数。

2、列表方法

version: '3'
services:
  web:
    image: myapp:latest
    command:
      - python
      - manage.py
      - runserver
      - 0.0.0.0:8000

在这个示例中,command 字段的值是一个列表,每个元素都表明要履行的指令或参数。

3、Shell 指令方法

version: '3'
services:
  web:
    image: myapp:latest
    # 两种写法
    # command: sh -c "python manage.py runserver 0.0.0.0:8000"
    command: ["sh","-c","python manage.py runserver 0.0.0.0:8000"]

4、运用环境变量方法

version: '3'
services:
  web:
    image: myapp:latest
    environment:
      - ENVIRONMENT=production
    command: python manage.py runserver 0.0.0.0:${PORT}

在这个示例中,command 字段中的 ${PORT} 将被替换为 web 服务的环境变量 PORT 的值。

11)healthcheck

healthcheck:指定容器健康查看装备。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost/health"]
  interval: 30s
  timeout: 10s
  retries: 3

上面的比如中,装备容器健康查看指令为 “curl -f http://localhost/health”,**每 30 秒查看一次**,超时时刻为 10 秒,最多重试 3 次。

12)configs 与 secrets

1、configs

configs:指定容器运用的装备文件。

configs:
  - source: my-config
    target: /etc/nginx/conf.d/default.conf

上面的比如中,将名为 my-config 的装备文件复制到容器的 /etc/nginx/conf.d/default.conf 目录下。

2、secrets

secrets:指定容器运用的秘要数据。

secrets:
  - db_password

13)hostname 与 container_name

hostnamecontainer_name 都是用来界说 Docker 容器的标识符,可是它们的含义不同。

1、hostname

hostname 用于设置容器的主机名,也就是在容器内部能够运用的称号。例如,假如您在容器内部运用 ping hostname 指令,它将解析为容器的 IP 地址。能够运用以下格局设置主机名:

version: '3'
services:
  web:
    image: myapp:latest
    container_name: myapp

在这个示例中,web 服务的容器主机名被设置为 myapp-container

2、container_name

container_name 用于给容器命名,也就是在 Docker 主机上运用的称号。能够运用以下格局设置容器称号:

version: '3'
services:
  web:
    image: myapp:latest
    container_name: myapp

在这个示例中,web 服务的容器称号被设置为 myapp。

总之,hostname 和 container_name 都是用于界说容器的标识符,可是 hostname 用于容器内部的标识,container_name 用于 Docker 主机上的标识。

14)user

在 Docker Compose 中,能够运用 user 字段来指定容器中运转的进程的用户和用户组。它的语法与 docker run 指令的 --user 选项相似,有以下三种方法:

1、user:group(引荐)

以 user 用户和 group 用户组的身份运转容器中的进程,例如:

version: "3"
services:
  web:
    image: nginx
    user: nginx:nginx

2、uid:gid

以 uid 用户 ID 和 gid 用户组 ID 的身份运转容器中的进程,例如:

version: "3"
services:
  web:
    image: nginx
    user: "1000:1000"

3、user

以 user 用户的身份运转容器中的进程,例如:

version: "3"
services:
  web:
    image: nginx
    user: nginx

需求注意的是,假如在 Docker Compose 中运用了 user 字段,则容器中的一切进程都将以指定的用户身份运转,而不是默许的 root 用户身份运转。这能够进步容器的安全性,防止在容器中运用 root 用户形成潜在的安全危险

15)deploy

deploy:指定服务布置装备。

deploy:
  replicas: 3
  resources:
    limits:
      cpus: '0.5'
      memory: '256M'
    reservations:
      cpus: '0.25'
      memory: '128M'

上面的比如中,装备服务的副本数量为 3,约束每个副本运用的 CPU 和内存资源,并保留一部分资源供其他服务运用。

七、port 和 expose 差异

portsexpose 是两个不同的 Docker Compose 字段,用于在容器中露出端口。

  • ports 字段用于将容器内部的端口映射到宿主机上的端口,以便外部网络能够经过宿主机上的端口与容器中运转的应用程序进行通讯。这个字段的语法如下:
version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"

这个比如中,容器中运转的 nginx 进程监听的是容器内部的 80 端口,而 ports 字段将宿主机上的 8080 端口映射到了容器内部的 80 端口,这样外部网络就能够经过拜访宿主机上的 8080 端口来拜访容器中运转的 nginx 应用程序。

  • exposeports 不同的是,expose 字段仅仅是将容器内部的端口露出给其他容器运用,而不是直接映射到宿主机上的端口。这个字段的语法如下:
version: "3"
services:
  db:
    image: mysql
    expose:
      - "3306"
  web:
    image: nginx
    expose:
      - "80"

这个比如中,db 和 web 两个容器别离露出了它们内部的 3306 和 80 端口,其他容器能够运用这些端口来与它们通讯。可是,由于这些端口没有被映射到宿主机上,因而外部网络无法直接拜访它们。假如要从外部网络拜访这些容器,需求运用 ports 字段将它们映射到宿主机上的端口。

八、configs 与 secrets 差异

configssecrets 是 Docker Compose 和 Docker Swarm 中用于办理容器装备和灵敏数据的两个不同的功用。它们的差异如下:

  • 用途不同configs 用于办理容器应用程序的装备文件,例如 nginx 的装备文件、MySQL 的装备文件等,而 secrets 则用于办理灵敏数据,例如数据库的暗码、API 密钥等。
  • 存储方位不同:configs 存储在 Docker 主机的文件体系中,能够是本地文件体系、NFS 文件体系或长途 S3 存储等,而 secrets 存储在 Docker Swarm 的安全存储中,该存储是加密的、高度安全的,而且只能由授权的 Docker 服务和节点拜访。
  • 拜访方法不同:configs 能够经过文件挂载或 Docker Compose 文件中的 configs 字段来拜访,而 secrets 能够经过文件挂载、Docker Compose 文件中的 secrets 字段、Docker CLI 的 docker secret 指令或容器内部的文件体系来拜访。
  • 生命周期不同configs 的生命周期是独立于服务的,当服务中止时,装备文件仍然能够保留在主机上,而 secrets 的生命周期是与服务绑定的,当服务被删去时,灵敏数据也会被删去。
  • 更新方法不同:configs 的更新是经过从头布置服务来完成的,而 secrets 的更新是经过 Docker CLI 的 docker secret 指令或容器内部的文件体系来完成的。

以下是一个运用 configssecrets 的 Docker Compose 文件的示例:

version: '3.7'
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    configs:
      - source: nginx_conf
        target: /etc/nginx/nginx.conf
    secrets:
      - source: db_password
        target: /run/secrets/db_password
configs:
  nginx_conf:
    file: ./nginx.conf
secrets:
  db_password:
    file: ./db_password.txt

在上面的示例中,咱们界说了一个 web 服务,该服务运用了 nginx:latest 镜像,并将容器内的 80 端口映射到 Docker 主机的 80 端口。此外,咱们还界说了两个装备:configs 和 secrets。

  • configs 界说了一个名为 nginx_conf 的装备,该装备从本地nginx.conf 文件中读取装备,并将其挂载到容器内的 /etc/nginx/nginx.conf 途径。这样,咱们就能够运用自界说的 nginx.conf 装备文件来装备 nginx 服务。
  • secrets 界说了一个名为 db_password灵敏数据,该数据从本地的 db_password.txt 文件中读取,并将其挂载到容器内的 /run/secrets/db_password 途径。这样,咱们就能够在容器内部安全地拜访数据库暗码,而不必忧虑暗码走漏的危险。

在上述示例中,咱们运用了文件挂载来拜访 configssecrets。这是最常见的拜访方法,但并不是唯一的方法。secrets 还能够经过 Docker CLI 的 docker secret 指令或容器内部的文件体系来拜访。

九、挂载

在 Docker Compose 中,能够经过挂载主机目录或文件来拜访容器内部的文件或目录,以便在容器内外同享数据或装备文件。Docker Compose 支持两种方法进行挂载:

1)命名卷挂载

命名卷是由 Docker 创立和办理的卷,它们能够用于存储持久化数据,并能够在多个容器之间同享。在 Docker Compose 中,能够经过 volumes 字段来界说命名卷的挂载途径和主机目录的映射联系。关于docker的卷办理能够参阅我这篇文章:Docker数据卷—Volumes。示例例如:

version: "3.7"
services:
  app:
    image: myapp:latest
    volumes:
      - myapp_data:/app/data
volumes:
  myapp_data:

在上述示例中,咱们界说了一个 myapp 服务,该服务运用了 myapp:latest 镜像,并将命名卷 myapp_data 挂载到容器内的 /app/data 目录。

2)主机目录挂载

主机目录挂载答应将 Docker 主机上的目录或文件夹挂载到容器内部,以便在容器内外同享数据。在 Docker Compose 中,能够经过 volumes 字段来界说主机目录的挂载途径和主机目录的映射联系。例如:

version: "3.7"
services:
  app:
    image: myapp:latest
    volumes:
      - /host/data:/app/data

在上述示例中,咱们界说了一个 myapp 服务,该服务运用了 myapp:latest 镜像,并将宿主机上的 /host/data目录挂载到容器内/app/data 目录。

【注意】在 Docker Compose 中,假如运用主机目录挂载,则要求主机目录有必要存在且具有正确的权限。不然,容器将无法拜访该目录。此外,在运用主机目录挂载时,请注意挂载的目录是否包含灵敏数据,以防止数据走漏的危险。

十、网络

Docker Compose 中的网络能够用于在多个容器之间树立通讯。经过界说网络,能够让容器之间彼此通讯,一起将它们与主机网络阻隔开来,进步容器应用的安全性。其实也可参阅我之前的文章:Docker四种网络方法(Bridge,Host,Container,None)

Docker Compose 供给了三种网络类型:bridge、host 和 none,每种类型都适用于不同的场景。

1)bridge 网络类型

bridge 网络类型是默许的网络类型,它创立一个桥接网络,答应容器之间进行通讯。每个容器都有自己的 IP 地址,而且能够经过容器称号来彼此拜访。假如没有指定网络类型,Docker Compose 将运用 bridge 网络类型

在 bridge 网络类型中,Docker Compose 会为每个服务创立一个容器,并为每个容器分配一个 IP 地址。在同一个网络中的容器能够彼此拜访

【请注意】假如您运用了Docker Compose的网络功用(默许情况下会创立一个网络),则能够在同一网络中的任何容器中运用容器称号来拜访服务。假如您没有运用Docker Compose网络功用,则需求手动创立网络,并将一切容器添加到同一网络中。

【示例】假定咱们有两个服务:web 和 db。在默许情况下,Docker Compose 运用 bridge 网络类型,咱们能够不必特别指定网络类型。以下是一个示例的 docker-compose.yml 文件:

version: '3'
services:
  web:
    build: .
    ports:
      - "80:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

在上述示例中,web 服务将运用本地 Dockerfile 构建,并将容器端口 80 映射到主机端口 80。db 服务将运用 MySQL 5.7 镜像,并设置 MySQL 的 root 用户暗码为 example。

经过 docker-compose up 指令发动这个示例,Docker Compose 将为每个服务创立一个容器,并主动创立一个默许的 bridge 网络来使它们彼此通讯。

2)host 网络类型

host 网络类型让容器同享主机的网络栈,这意味着容器将与主机具有相同的 IP 地址和网络接口。这样能够进步容器的网络功能和可拜访性,可是容器之间不能彼此拜访,由于它们同享同一个网络栈。

在 host 网络类型中,Docker Compose 会将每个服务直接放在主机网络中,容器将与主机同享 IP 地址和网络接口,因而能够经过主机 IP 地址来拜访容器中运转的服务。

【示例】假定咱们有一个服务,它需求运用主机网络接口。以下是一个示例的 docker-compose.yml 文件:

version: '3'
services:
  web:
    build: .
    network_mode: host

在上述示例中,咱们运用 build 关键字来指定构建上下文,并运用 network_mode 关键字将服务 web 的网络方法设置为 host。这样,web 服务将与主机同享 IP 地址和网络接口,能够经过主机 IP 地址来拜访服务。

3)none 网络类型

none 网络类型表明不为容器分配任何网络资源,容器将没有网络接口。这一般用于某些特别的容器场景,例如一些只需求与主机交互而不需求网络连接的容器。

在 none 网络类型中,Docker Compose 会将每个服务放在一个单独的网络命名空间中,容器将没有任何网络资源,无法进行网络通讯。

【示例】假定咱们有一个服务,它不需求任何网络连接。以下是一个示例的 docker-compose.yml 文件:

version: '3'
services:
  worker:
    build: .
    network_mode: none

在上述示例中,咱们运用 build 关键字来指定构建上下文,并运用 network_mode 关键字将服务 worker 的网络方法设置为 none。这样,worker 服务将没有任何网络资源,无法进行网络通讯。

4)自界说网络

Docker Compose默许会为每个Compose项目创立一个网络。这个网络的称号会以Compose项目的目录名作为前缀,例如,假如您的Compose项目目录名为myproject,则默许创立的网络称号为myproject_default。

  • 在这个默许创立的网络中,一切的服务和容器都能够经过它们的服务称号或容器称号进行通讯。这些称号在默许情况下都是唯一的,因而能够防止称号抵触和混乱。

  • 假如您需求拜访不同的网络或自界说网络,则能够运用Docker Compose的networks特点来创立自界说网络。例如,以下是一个Docker Compose文件,其间界说了一个名为my_network的自界说网络:

version: '3'
services:
  web:
    image: nginx
    networks:
      - my_network
networks:
  my_network:
    driver: bridge

在这个示例中,web服务将被连接到my_network网络中,而不是默许创立的网络。该网络的驱动程序为bridge,这是Docker Compose默许运用的网络驱动程序。

Compose项目目录名解释:Compose项目目录名是指包含Docker Compose文件的目录的称号。Docker Compose文件(一般命名为docker-compose.yml)描绘了Docker Compose应该如何构建和运转Docker容器应用程序。该文件一般存储在Compose项目目录的根目录中。

例如,假如您正在开发一个名为myapp的应用程序,并运用Docker Compose来办理它的容器化布置,那么您可能会在以下目录结构中存储您的Docker Compose文件:

myapp/
├── docker-compose.yml
├── app/
│   ├── Dockerfile
│   └── app.py
└── data/

在这个比如中,myapp是Compose项目目录名,docker-compose.yml是Compose文件的称号,并存储在myapp目录的根目录中。myapp目录还包含了应用程序的代码和数据目录。

十一、域名解析 DNS

Docker Compose中的容器能够运用容器称号或服务称号来彼此拜访,而不需求运用IP地址。这是由于Docker Compose会为每个服务创立一个DNS记载,这些记载由默许的DNS解析器处理。

默许情况下,Docker Compose会创立一个名为”projectname_default“的网络,并将一切服务连接到该网络中。该网络运用Docker内置的DNS解析器,为每个服务和容器分配一个DNS称号。例如,假如您的Compose项目名为”myproject”,那么您能够运用以下指令查看一切服务的DNS称号:

docker-compose run <service> nslookup <service>

例如,假如您的服务称号为”web”,则能够运用以下指令查看web服务的DNS称号:

docker-compose run web nslookup web

这将输出web服务的DNS记载,包含IP地址和DNS称号。例如:

Server:    127.0.0.11
Address 1: 127.0.0.11
Name:      web
Address 1: 172.18.0.2

在这个比如中,web服务的DNS称号为”web”,IP地址为172.18.0.2。您能够运用该称号(”web”)来拜访该服务,而无需运用IP地址。

十二、健康查看

Docker Compose 支持为服务界说健康查看,用于查看服务是否正常运转。健康查看能够是一个指令、一个 HTTP 恳求或许一个 TCP 端口。假如健康查看失利,Docker Compose 将测验从头发动服务,直到到达最大重试次数或许服务成功运转。

1)健康查看语法

在 Docker Compose 中,能够经过 healthcheck 关键字来界说健康查看。详细语法如下:

healthcheck:
  test: ["CMD-SHELL", "command"]
  interval: interval
  timeout: timeout
  retries: retries

参数解释:

  • test 是健康查看的指令或许恳求。
  • interval 是查看健康状况的时刻间隔,单位为秒,默以为 30s
  • timeout 是查看健康状况的超时时刻,单位为秒,默以为 30s
  • retries 是健康查看失利时的重试次数,默以为 3

2)健康查看写法

包含以下几种写法:

1、字符串方法的指令

healthcheck:
  test: curl --fail http://localhost:80 || exit 1
  interval: 30s
  timeout: 10s
  retries: 5

在上述示例中,healthcheck 字段的 test 特点是一个字符串,表明需求履行的健康查看指令。在这个示例中,咱们运用 curl 指令来测验 localhost:80 是否能够拜访。假如健康查看指令返回状况码 0,则表明服务正常,不然表明服务异常。在这个示例中,假如健康查看失利,Docker Compose 将在每 30 秒测验从头运转健康查看,最多重试 5 次。

2、数组方法的指令

healthcheck:
  test:
    - CMD
    - curl
    - --fail
    - http://localhost:80
  interval: 30s
  timeout: 10s
  retries: 5

3、自界说指令

healthcheck:
  test: ["CMD-SHELL", "curl --fail http://localhost:80 || exit 1"]
  interval: 30s
  timeout: 10s
  retries: 5

在上述示例中,healthcheck 字段的 test 特点是一个数组,其间第一个元素是 CMD-SHELL,表明运用 shell 履行指令。第二个元素是一个自界说的指令,与前面的示例相同。

3)CMD-SHELL 与 CMD

CMD-SHELLCMD 都是 DockerfileRUN 指令以及 Docker Composehealthcheck 指令中常用的指令格局,两者之间的差异如下:

  • CMD-SHELL(这儿引荐):表明运用 shell 履行指令。在 Docker Compose 中,健康查看的 test 特点中能够运用 CMD-SHELL` 来履行自界说的 shell 指令。
  • CMD:表明履行指定的指令或许指令参数。在 Dockerfile 中,CMD 常用于指定容器发动时需求履行的指令,而在 Docker Compose 中,CMD 常用于指定服务发动时需求履行的指令或许指令参数。

两者的运用方法不同,但都能够用于履行指令或许指令参数。在 Dockerfile 中,CMD-SHELL 并不是一个有用的指令,而在 Docker Compose 中,CMD 用于界说服务的发动指令,而 healthcheck 中的 test 属功能够运用 CMD-SHELL 来履行自界说的 shell 指令。其实CMD在docker compose healthcheck 也是能够运用的。只是更主张运用CMD-SHELL

4)示例解说

以下是一个简略的Docker Compose文件,其间界说了一个健康查看:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"
    healthcheck:
      #test: ["CMD", "curl", "-f", "http://localhost"]
      test: ["CMD-SHELL", "curl -f http://localhost"]
      interval: 1m
      timeout: 10s
      retries: 3

在这个比如中,web服务运用nginx镜像,并将端口80映射到主机上的端口80。此外,它界说了一个健康查看,该查看将定期运转curl指令来测验服务是否呼应HTTP恳求。详细来说,该查看将每隔1分钟运转一次,超时时刻为10秒,并测验重试3次。

您能够运用以下指令发动该服务:

# 也经过-f指定docker-compose文件
docker-compose up

在服务发动后,Compose将定期运转健康查看,并依据查看成果重启服务。您能够运用以下指令查看服务的健康状况:

docker-compose ps

此指令将显现服务的健康状况,例如:

   Name           Command              State          Ports
-------------------------------------------------------------------
webapp_web_1   nginx -g daemon off;   Up (healthy)   0.0.0.0:80->80/tcp

在这个比如中,服务的健康状况为”Up (healthy)“,这表明服务正在运转而且健康查看经过。

十三、常用指令

以下是Docker Compose中一些常用的指令:

  • docker-compose up:发动Compose文件中界说的服务,创立并发动一切容器。

  • docker-compose down:中止Compose文件中界说的服务,删去一切容器和网络。

  • docker-compose ps:显现Compose文件中界说的一切容器的状况。

  • docker-compose logs:显现Compose文件中界说的一切容器的日志。

  • docker-compose build:依据Compose文件中界说的Dockerfile构建一切服务的镜像。

  • docker-compose pull:拉取Compose文件中界说的一切服务的镜像。

  • docker-compose restart:重启Compose文件中界说的一切服务。

  • docker-compose stop:中止Compose文件中界说的一切服务。

  • docker-compose start:发动Compose文件中界说的一切服务。

  • docker-compose exec:在Compose文件中界说的容器中履行指令。

  • docker-compose run:在Compose文件中界说的容器中运转指令。

  • docker-compose config:查看Compose文件的语法,并显现Compose文件中界说的一切服务的装备。

这些是Docker Compose中一些常用的指令,您能够依据需求运用它们来办理和操作Compose项目。


docker-compose 进阶篇解说就先到这儿了,有任何疑问欢迎给我留言,后续会继续更新相关技能文章,有任何疑问欢迎给我留言或私信,也可重视我的公众号【大数据与云原生技能共享】深化交流技能或私信咨询问题~

docker-compose 进阶篇