docker-compose详讲

news2024/11/26 11:34:18

一、概述

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 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。

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

GitHub:https://github.com/docker/compose/releases/

以前也写过一篇关于docker compose基础的文章,有兴趣的可以先查阅看看:Docker三剑客之Compose

图片

二、Compose 和 Docker 兼容性

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

三、安装 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

官方安装地址教程:https://docs.docker.com/compose/install/other/

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文件中定义的所有服务的配置。

https://github.com/bcicen/grmon)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,码海拾贝(19)——一般实矩阵的QR分解(QR Decomposition)方法之C#源代码,《C#数值计算算法编程》源代码升级改进版

1 实矩阵 实矩阵&#xff0c;指的是矩阵中所有的数都是实数的矩阵。如果一个矩阵中含有除实数以外的数&#xff0c;那么这个矩阵就不是实矩阵。 2 QR&#xff08;正交三角&#xff09;分解法 QR&#xff08;正交三角&#xff09;分解法是求一般矩阵全部特征值的最有效并广泛应…

基于Java+SpringBoot制作一个宿舍报修小程序

制作一个宿舍报修小程序&#xff0c;让学生实现快速报修&#xff0c;将流程进行精简&#xff0c; 便于管理部门有效响应。 微信小程序实战开发专栏 一、小程序1.1 项目创建1.2 首页iconfont图标引入1.3 报修管理报修提交报修记录报修溯源1.4 来访登记1.5 公告通知二、API2.1 Sp…

windows日志捕获工具-DebugView使用教程

debugview 是一款捕获windows桌面系统程序中由TRACE(debug版本)和OutputDebugString输出的信息。 1、双击打开DebugView.exe工具&#xff0c;看到如下界面&#xff1a; 其中这里 Include代表过滤想要的关键字&#xff0c;一般不会找自己想要的关键字日志就设置成星号*&#xf…

GDOUCTF WEB

web hate eat snake 游戏题找js&#xff0c;将判断语句删掉即可 ezweb 看源码找到/src路由&#xff0c;找到源码 import flaskapp flask.Flask(__name__)app.route(/, methods[GET]) def index():return flask.send_file(index.html)app.route(/src, methods[GET]) def so…

如何快速开发软件?这篇文章说明白了

随着经济迅速发展&#xff0c;传统软件开发模式存在研发周期长、需求转化困难、投入成本高等问题&#xff0c;无法适应当前业务发展速度,市场需要快速开发工具。快速开发软件可分为代码生成类、少代码类、零代码功能配置类。代码生成类相对灵活&#xff0c;但对用户要求高&…

MySQL group_concat设置group_concat_max_len

GROUP_CONCAT函数用于将多个字符串连接成一个字符串&#xff0c;在拼接成字符串时就会存在拼接长度的问题&#xff0c;mysql 默认的拼接最大长度为1024 个字节&#xff0c;由于1024个字节会出现不够用的情况&#xff0c;所以有时需要去根据情况进行修改&#xff0c;方式如下。 …

nginx启动、配置、测试(全网最全)

目录 一、要求 1.配置不同IP访问 2.配置不同端口访问 3.配置域名访问 二、前期准备 1.安装gcc g的依赖库 2.安装 pcre的依赖库 3.安装zlib的依赖库 4.安装openssl的依赖库 5.解压nginx的安装包 6.进入到解压的nginx安装目录里面 7.将nginx安装到/usr/local/下 8.编译 9.进入到…

从 Python 中的字典列表中删除重复项

要从字典列表中删除重复项&#xff1a; 使用字典推导来遍历列表。使用每个 id 属性的值作为键&#xff0c;使用字典作为值。使用 dict.values() 方法只获取唯一的字典。使用 list() 类将结果转换为列表。 list_of_dictionaries [{id: 1, site: jiyik.com},{id: 2, site: goo…

5G NR调制阶数与EVM关系以及对系统SNR要求分析

移动通信技术对数据传输速率要求越来越高。一种提高传输速率的思路是使用更高阶的QAM 调制方式&#xff0c;例如5G NR 的256QAM PDSCH&#xff0c;微波的1024QAM&#xff0c;2048QAM和4096QAM 调制。更高阶的QAM 调制方式对系统也提出了更高的要求。例如某个系统的EVM 测试结果…

微服务+springcloud+springcloud alibaba学习笔记【Hystrix(豪猪哥)的使用】(6/9)

Hystrix&#xff08;豪猪哥&#xff09;的使用 6/91、Hystrix熔断器概述2、HyStrix重要概念3、hystrix案例3.1 新建模块 Cloud-provider-hystrix-payment80013.2 创建带降级的order模块 Cloud-comsumer-feign-hystrix-order803.3 配置服务降级:3.3.1 服务降级 Cloud-provider-h…

企业做体系认证要警惕的8大问题,别再被不良认证机构忽悠啦!

企业资质认证要警惕这八大问题 企业资质真的很管用。我们都知道从事任何一个行业都需要准入证明&#xff0c;尤其是招投标企业&#xff0c;企业资质更是投标的准入门槛&#xff0c;并且在投标中还可以为企业加分。 有些资质如ISO三体系是企业必备的资质之一&#xff0c;也是常…

麻了,不要再动不动就BeanUtil.copyProperties

前言 最近项目上要求升级一个工具包hutool的版本&#xff0c;以解决安全漏洞问题&#xff0c;这不升级还好&#xff0c;一升级反而捅出了更大的篓子&#xff0c;究竟是怎么回事呢&#xff1f; 事件回顾 我们项目原先使用的hutool版本是5.7.2&#xff0c;在代码中&#xff0c…

Hudi集成Flink-写入方式

文章目录一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表1.2.3、将 kakfa 数据写入hudi1、k…

ERTEC200P-2 PROFINET设备完全开发手册(4-2)

4.2 XHIF接口实验 4.2.1写入单片机固件 首先按照下图连接设备 用JLINK 20Pin JTAG连接4 Pin SWD可以采用转接板 单片机的参考程序是用ST的CubeIDE生成的&#xff0c;目前的版本是1.7.0。打开安装后的CubeIDE&#xff0c;在菜单中选择“File->Import“ 选择“Existing Proj…

企业信息化建设都包括哪些方面?

随着大数据技术的发展&#xff0c;时代的发展要求企业转变管理模式、建立信息化管理机制&#xff0c;同时也是提高工作、管理效率&#xff0c;促进企业战略性发展的重要保障。 企业信息化是将信息技术应用于企业发展实践中的一个动态过程&#xff0c;即通过挖掘先进的管理理念…

高可靠多层板制造服务再获认可!华秋荣获创想三维优秀质量奖

4月10日&#xff0c;创想三维2023年度战略供应商大会在惠州成功举办&#xff0c;高可靠多层板制造商华秋出席了本次活动并取得了《优秀质量奖》一奖项。 大会现场&#xff0c;创想三维董事长陈春指出公司的持续发展与供应链高质量的交付息息相关。作为创想三维主力PCB供应商&am…

【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案

原本正常的正版系统&#xff0c;在昨天4月自动更新安装之后&#xff0c;发现右键找 不到新建文档了&#xff0c;word,ppt,excel都不见了。 看了网上大神的方法 Win11安装了Office右键没有新建Excel选项怎么办&#xff1f; - 知乎 可以解决一部分 官方解决方案&#xff0c;亲…

李宏毅2021春季机器学习课程视频笔记14-Transformer

Transformer Transformer实际上就是变形金刚&#xff0c;其与Bert实际类似。其实际上就是一个Sequence-to-Sequence的模型&#xff0c;其输出的长度并不是由人为指定&#xff0c;而是由机器自行确定。 Transformer的基本结构&#xff0c;如上图所示&#xff0c;主要由一个Encod…

AS01/AS02/AS03 创建定制屏幕字段

本文简介&#xff1a;在sap标准屏幕上&#xff0c;增加客户定制的屏幕字段。 操作步骤&#xff1a; 1、在创建资产卡片AS01时&#xff0c;界面需要输入客户定制的字段&#xff0c;如下图方框所示 2、查看增强点&#xff0c;事务码&#xff1a;SMOD AIST002 3、创建增强项目…

M1 M2上能安装上Autocad 2024 Mac 中文版吗 autocad m1 m2版本有啦 终于支持Ventura 13x了

AutoCAD是一款强大的工具&#xff0c;适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点&#xff0c;可以帮助用户实现高质量的设计和建模。同时&#xff0c;还支持云端存储和共享&#xff0c;方便用户随时随…