当前位置:   article > 正文

Docker compose介绍及入门、docker-compose.yaml文件如何编写及规范

Docker compose介绍及入门、docker-compose.yaml文件如何编写及规范

目录

前言

docker-compose用来做什么?

docker-compose文件规范及常用元素

一、版本和名称顶级元素

二、服务顶级元素

三、网络顶级元素

四、卷顶级元素

docker-compose样例文件展示

运行docker-compose文件


前言

配置集群,不使用docker-compose也同样能配置,使用docker-compose来配置集群的原因最主要的就是简便和方便管理。不建议使用docker的命令去配置集群,直接使用docker-compose即可。

docker-compose用来做什么?

Docker Compose 是用于管理和编排多个 Docker 容器的工具。它允许通过一个简单的配置文件(通常是 YAML 格式)定义应用程序的多个服务、网络、卷和其他资源,然后使用 Docker Compose 命令来启动、停止和管理这些容器。

主要功能:

  1. 定义多个服务: 使用 Docker Compose,可以定义一个应用程序的多个服务,每个服务对应一个容器或多个容器,也可以指定服务所需的镜像、环境变量、端口映射、卷挂载等配置。

  2. 编排容器启动顺序: 可以使用 Docker Compose 来定义容器的启动顺序和依赖关系。这样,可以确保在启动应用程序时,各个服务的容器按照正确的顺序启动,并能够正确地互相通信。

  3. 统一管理容器: Docker Compose 提供了一种集中管理多个容器的方式。可以使用 Docker Compose 命令一次性启动、停止、重启和删除整个应用程序堆栈,管理和操作多个容器变得更加简单和高效。

  4. 创建和管理网络: Docker Compose 可以定义和管理应用程序的网络。可以创建自定义网络,用于容器之间的通信,或者将容器连接到现有的网络。

  5. 共享卷和数据: Docker Compose 可以定义卷挂载,从而使容器可以共享数据或访问共享的持久化存储。这使得容器之间可以共享文件和数据,并保留持久性。

  6. 简化部署和开发环境: Docker Compose 提供了一种简化部署和开发环境的方式。通过将应用程序的各个组件定义在一个文件中,可以轻松地在不同的环境中复制和部署应用程序,确保一致性和可重复性。

docker-compose文件规范及常用元素

官网文档链接:概览 |Docker 文档

docker-compose.yaml文件有严格的缩进和空格要求,一个 docker-compose 文件通常由以下几个部分组成:

  1. 版本(Version): Docker Compose 文件的顶级元素是 version,用于指定所使用的 Docker Compose 文件版本。它定义了使用的语法和支持的功能。

  2. 服务(Services)services 部分定义了应用程序的各个服务或容器。每个服务都有一个唯一的名称,并包含该服务的配置信息,如所使用的镜像、环境变量、端口映射、卷挂载等。

  3. 网络(Networks)networks 部分定义了应用程序的网络配置。可以创建自定义网络,并指定容器连接到哪个网络上,以实现容器之间的通信。

  4. 卷(Volumes)volumes 部分定义了应用程序的卷挂载配置。可以指定容器与宿主机之间的文件或目录的映射,实现数据的持久化和共享。

  5. 环境变量(Environment Variables): 在服务的配置中,可以使用 environment 或 env_file 字段指定环境变量。这些环境变量将传递给容器内运行的应用程序。

  6. 端口映射(Port Mapping): 在服务的配置中,可以使用 ports 字段指定容器端口与宿主机端口之间的映射关系。这使得可以从宿主机访问容器内运行的服务。

  7. 卷挂载(Volume Mounting): 在服务的配置中,可以使用 volumes 字段指定容器内的路径与宿主机路径之间的映射关系。这允许容器与宿主机之间共享文件和数据。

一、版本和名称顶级元素

1、版本顶级元素  version

用于指定 Docker Compose 文件的版本。该版本指定了使用的 Docker Compose 文件语法和支持的功能。

要指定版本,在 Docker Compose 文件的顶级元素中添加 version 字段。

  1. version: "3.8"
  2. services:
  3. my-service:
  4. image: my-image
  5. # 其他配置项...

version: "3.8" 指定了 Docker Compose 文件的版本为 "3.8"。这意味着该文件将使用 Docker Compose 3.8 版本的语法和功能。

2、名称顶级元素 name

用于指定 Docker Compose 项目的名称。该名称可以在多个方面使用,例如网络、卷和容器的命名,不过一上级元素为默认名称,如下代码所示,my-service即为该服务名称。

要指定项目名称,在 Docker Compose 文件的顶级元素中添加 name 字段

  1. version: "3.8"
  2. services:
  3. my-service:
  4. image: my-image
  5. # 其他配置项...
  6. name: my-project

指定容器名称,指定容器名时有一个专门的container_name元素可以使用

  1. version: "3.8"
  2. services:
  3. my-service:
  4. image: my-image
  5. container_name: my-container
  6. # 其他配置项...

指定网络名称,my-network即为该网路的名称

  1. version: "3.8"
  2. services:
  3. my-service:
  4. networks:
  5. - my-network
  6. networks:
  7. my-network:
  8. # 网络配置...

其他的服务、卷等元素中的name元素基本如上所示

二、服务顶级元素

服务顶级元素中有非常多的元素可以使用,在此只介绍部分常用的元素。

  1. image: 指定服务所使用的容器镜像。可以是公共的 Docker Hub 镜像,也可以是私有的镜像。

    1. version: "3.8"
    2. services:
    3. my-service: # 使用公共镜像
    4. image: mysql:latest # :可使用特定的版本
    5. # 其他配置项...
    6. ------------------------------------------------------------------------------------
    7. version: "3.8"
    8. services:
    9. my-service:
    10. build: # 使用本地构建镜像,这部分请自行探索,本文不做解释
    11. context: ./my-app
    12. dockerfile: Dockerfile
    13. # 其他配置项...
  2. volumes: 定义卷挂载配置,用于将容器内的路径与宿主机路径进行映射,实现数据的持久化和共享。

    基本卷挂载:指定宿主机路径和容器内路径之间的映射关系。例如,将宿主机的 /path/on/host 目录映射到容器内的 /path/on/container 目录:

    1. version: "3.8"
    2. services:
    3. my-service:
    4. volumes:
    5. - /path/on/host:/path/on/container
    6. # 其他配置项...

    使用命名卷:可以在 volumes顶级元素部分定义命名卷,然后在服务的配置中引用该命名卷。例如:

    1. version: "3.8"
    2. services:
    3. my-service:
    4. volumes:
    5. - my-volume:/path/on/container
    6. # 其他配置项...
    7. volumes:
    8. my-volume:
    9. # 卷配置...

    使用卷挂载有多种模式,rw(读写,默认)、ro(只读)、bind(锚定)、tmpfs(临时文件系统)

    1. version: "3.8"
    2. services:
    3. my-service:
    4. volumes:
    5. - /path/on/host:/path/on/container:rw
    6. # 其他配置项...
    7. version: "3.8"
    8. services:
    9. my-service:
    10. volumes:
    11. - /path/on/host:/path/on/container:ro
    12. # 其他配置项...
    13. version: "3.8"
    14. services:
    15. my-service:
    16. volumes:
    17. - type: bind
    18. source: /path/on/host
    19. target: /path/on/container
    20. # 其他配置项...
    21. version: "3.8"
    22. services:
    23. my-service:
    24. volumes:
    25. - type: tmpfs
    26. target: /path/on/container
    27. # 其他配置项...
  3. ports: 定义端口映射配置,将容器内的端口映射到宿主机的端口上,从而可以通过宿主机访问容器内运行的服务。

    基本端口映射:指定将容器内的端口映射到宿主机的端口。例如,将容器内的 8080 端口映射到宿主机的 80 端口:

    1. version: "3.8"
    2. services:
    3. my-service:
    4. ports:
    5. - 80:8080
    6. # 其他配置项...

    指定特定IP:可以指定要将容器端口映射到的特定 IP 地址。例如,将容器内的 8080 端口映射到宿主机的 80 端口,并绑定到特定的 IP 地址:

    1. version: "3.8"
    2. services:
    3. my-service:
    4. ports:
    5. - 192.168.0.100:80:8080
    6. # 其他配置项...

    不指定时使用动态分配的宿主机端口:

    1. version: "3.8"
    2. services:
    3. my-service:
    4. ports:
    5. - 8080
    6. # 其他配置项...
  4. environment: 定义环境变量,传递给容器内运行的应用程序。可以使用键值对的形式指定多个环境变量。

    这部分,没有特定的子元素,具体的需要查看各个容器的文档,通常在docker-hub的官网中搜索都能查看到,或者在git-hub中也能找到。
    需要注意的地方是,environment中的元素可以使用列表和字典两种方式来指定,其他形式无效,注意检查格式。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. environment:
    5. - DB_HOST=localhost #字典
    6. - DB_PORT=5432
    7. - DB_USER=myuser
    8. - DB_PASSWORD=mypassword
    9. # 其他配置项...
    10. version: "3.8"
    11. services:
    12. my-service:
    13. environment: #列表
    14. DB_HOST: localhost
    15. DB_PORT: 5432
    16. DB_USER: myuser
    17. DB_PASSWORD: mypassword
    18. # 其他配置项...
  5. networks: 定义服务所连接的网络,可以是预定义的自定义网络,也可以是默认的网络。
    默认网络:如果未指定网络配置,Docker Compose 会自动创建一个默认网络,允许在同一 docker-compose.yml 文件中定义的服务之间进行通信。例如:

    1. version: "3.8"
    2. services:
    3. service1:
    4. # 服务配置...
    5. service2:
    6. # 服务配置...

    自定义网络:显式地定义一个自定义网络,并将服务连接到该网络。例如:

    1. version: "3.8"
    2. services:
    3. service1:
    4. networks:
    5. - my-network
    6. # 服务配置...
    7. service2:
    8. networks:
    9. - my-network
    10. # 服务配置...
    11. networks:
    12. my-network:
    13. # 网络配置...

    外部网络:连接到现有的外部网络,例如在本docker-compose文件之外创建的网络。例如:

    1. version: "3.8"
    2. services:
    3. service1:
    4. networks:
    5. - my-external-network
    6. # 服务配置...
    7. networks:
    8. my-external-network:
    9. external: true
  6. depends_on: 定义服务之间的依赖关系,确保在启动时按正确的顺序启动服务。不过其也并不能保证在所有情况下完全控制服务的启动顺序。它只能确保所依赖的服务在启动时会先行启动,但并不能保证服务完全可用或准备就绪。

    1. version: "3.8"
    2. services:
    3. db:
    4. # 数据库服务配置...
    5. app:
    6. depends_on:
    7. - db
    8. # 应用程序服务配置...

    app 服务依赖于 db 服务。当使用 docker-compose up 启动服务时,db 服务会先于 app 服务启动。

  7. restart: 定义容器在退出时的重启策略。可以设置为"no"、"always"、"on-failure" 或 "unless-stopped"。

    无重启策略(默认):如果未指定 restart 元素,则容器将不会自动重启。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. # 服务配置...

    重启策略:可以使用 restart 元素指定容器的重启策略。常见的重启策略包括:
    no:不重启容器。即使容器退出或发生错误,也不会自动重启。
    always:总是重启容器。无论容器是如何退出或发生错误,都会自动重启。
    on-failure:只在容器非正常退出时(退出状态码非零)才重启容器。
    unless-stopped:除非手动停止容器,否则始终重启容器。即使容器在正常情况下退出,也会自动重启。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. restart: always/no/on-failure/unless-stopped
    5. # 服务配置...
  8. container_name: 用于指定容器的名称。
    默认情况下,Docker Compose 会根据服务的名称和项目名称来生成容器的名称。然而,使用 container_name 元素可以覆盖默认生成的容器名称,并为容器指定一个自定义的名称。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. image: my-image
    5. container_name: my-container
    6. # 其他配置项...

    my-service 服务使用 my-image 镜像,并将容器名称设置为 my-container

  9. hostname: 用于指定容器的主机名,为容器设置自定义的主机名。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. image: my-image
    5. hostname: my-host
    6. # 其他配置项...

    my-service 服务使用 my-image 镜像,并将容器的主机名设置为 my-host
    注:建议通常container_name和hostname都要设置并且设置为同一个,这能避免很多麻烦。hostname和container_name的作用不同,hostname通常是和ip绑定的,类比DNS服务。

  10. links: 已弃用,和depends_on作用类似,现一般使用depends_on

  11. working_dir: 用于指定容器的工作目录(Working Directory),工作目录是容器中执行命令和操作时的默认目录,也可以理解为进入容器后无任何操作的当前路径。

    1. version: "3.8"
    2. services:
    3. my-service:
    4. image: my-image
    5. working_dir: /app
    6. # 其他配置项...

三、网络顶级元素

  1. networks:用于定义多个网络,每个网络由一个名称和一个可选的配置对象组成。
    1. version: "3.8"
    2. networks:
    3. network1:
    4. # 网络1的配置
    5. network2:
    6. # 网络2的配置
    7. services:
    8. # 服务配置...

    以上定义了两个网络,分别为 network1 和 network2

  2. name:每个网络都需要一个名称,以便在服务配置中引用它。名称应该是唯一的。

    1. version: "3.8"
    2. networks:
    3. my-network:
    4. # 网络配置
    5. services:
    6. my-service:
    7. networks:
    8. - my-network
    9. # 服务配置...

    以上定义了一个名为 my-network 的网络,并在 my-service 服务的网络配置中引用了它。

  3. driver:定义了网络的类型。默认情况下,Docker Compose 使用 bridge 模式。常见的几种模式有

  • bridge(默认):这是 Docker 默认的网络驱动程序。它创建一个本地网络,允许容器通过网络进行通信。这是最常用的网络驱动程序。

  • host:使用宿主机的网络命名空间,容器与宿主机共享网络栈。容器的网络与宿主机的网络完全一致,网络性能较高。

  • overlay:用于创建跨多个 Docker 主机的网络。它允许在多个 Docker 主机上的容器之间进行通信,并提供了跨主机的网络连接。

四、卷顶级元素

  1. volumes:这是一个列表,用于定义多个卷。每个卷由一个名称和一个可选的配置对象组成。
    1. version: "3.8"
    2. volumes:
    3. volume1:
    4. # 卷1的配置
    5. volume2:
    6. # 卷2的配置
    7. services:
    8. # 服务配置...

docker-compose样例文件展示

文件只做参考,不保证完全的准确性

  1. version: '3'
  2. networks:
  3. kafka-storm-net:
  4. services:
  5. zookeeper1:
  6. image: zookeeper:3.7.1
  7. container_name: zookeeper1
  8. hostname: zookeeper1
  9. ports:
  10. - 8101:2181
  11. - 8102:2888
  12. - 8103:3888
  13. - 8108:8080
  14. environment:
  15. ZOO_MY_ID: 1
  16. ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
  17. networks:
  18. - kafka-storm-net
  19. zookeeper2:
  20. image: zookeeper:3.7.1
  21. container_name: zookeeper2
  22. hostname: zookeeper2
  23. ports:
  24. - 8201:2181
  25. - 8202:2888
  26. - 8203:3888
  27. - 8208:8080
  28. environment:
  29. ZOO_MY_ID: 2
  30. ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
  31. networks:
  32. - kafka-storm-net
  33. zookeeper3:
  34. image: zookeeper:3.7.1
  35. container_name: zookeeper3
  36. hostname: zookeeper3
  37. ports:
  38. - 8301:2181
  39. - 8302:2888
  40. - 8303:3888
  41. - 8308:8080
  42. environment:
  43. ZOO_MY_ID: 3
  44. ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
  45. networks:
  46. - kafka-storm-net
  47. kafka1:
  48. image: bitnami/kafka:latest
  49. hostname: kafka1
  50. container_name: kafka1
  51. ports:
  52. - 19092:9092
  53. environment:
  54. KAFKA_ENABLE_KRAFT: yes
  55. KAFKA_CFG_NODE_ID: 1
  56. KAFKA_CFG_PROCESS_ROLES: controller,broker
  57. KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
  58. KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: OUTSIDE:PLAINTEXT,CONTROLLER:PLAINTEXT,INSIDE:PLAINTEXT
  59. KAFKA_CFG_ADVERTISED_LISTENERS: OUTSIDE://:9092,INSIDE://:9091
  60. KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  61. KAFKA_CFG_LISTENERS: CONTROLLER://:9093,OUTSIDE://0.0.0.0:9092,INSIDE://:9091
  62. KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
  63. ALLOW_PLAINTEXT_LISTENER: 'yes'
  64. KAFKA_KRAFT_CLUSTER_ID: iZWRiSqjZAlYwlKEqHFQWI
  65. volumes:
  66. - ./kafka-data/kafka1:/bitnami/kafka:rw
  67. networks:
  68. - kafka-storm-net
  69. kafka2:
  70. image: bitnami/kafka:latest
  71. hostname: kafka2
  72. container_name: kafka2
  73. ports:
  74. - 29092:9092
  75. environment:
  76. KAFKA_ENABLE_KRAFT: yes
  77. KAFKA_CFG_NODE_ID: 2
  78. KAFKA_CFG_PROCESS_ROLES: controller,broker
  79. KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
  80. KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: OUTSIDE:PLAINTEXT,CONTROLLER:PLAINTEXT,INSIDE:PLAINTEXT
  81. KAFKA_CFG_ADVERTISED_LISTENERS: OUTSIDE://:9092,INSIDE://:9091
  82. KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  83. KAFKA_CFG_LISTENERS: CONTROLLER://:9093,OUTSIDE://0.0.0.0:9092,INSIDE://:9091
  84. KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
  85. ALLOW_PLAINTEXT_LISTENER: 'yes'
  86. KAFKA_KRAFT_CLUSTER_ID: iZWRiSqjZAlYwlKEqHFQWI
  87. volumes:
  88. - ./kafka-data/kafka2:/bitnami/kafka:rw
  89. networks:
  90. - kafka-storm-net
  91. kafka3:
  92. image: bitnami/kafka:latest
  93. hostname: kafka3
  94. container_name: kafka3
  95. ports:
  96. - 39092:9092
  97. environment:
  98. KAFKA_ENABLE_KRAFT: yes
  99. KAFKA_CFG_NODE_ID: 3
  100. KAFKA_CFG_PROCESS_ROLES: controller,broker
  101. KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
  102. KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: OUTSIDE:PLAINTEXT,CONTROLLER:PLAINTEXT,INSIDE:PLAINTEXT
  103. KAFKA_CFG_ADVERTISED_LISTENERS: OUTSIDE://:9092,INSIDE://:9091
  104. KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  105. KAFKA_CFG_LISTENERS: CONTROLLER://:9093,OUTSIDE://0.0.0.0:9092,INSIDE://:9091
  106. KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
  107. ALLOW_PLAINTEXT_LISTENER: 'yes'
  108. KAFKA_KRAFT_CLUSTER_ID: iZWRiSqjZAlYwlKEqHFQWI
  109. volumes:
  110. - ./kafka-data/kafka3:/bitnami/kafka:rw
  111. networks:
  112. - kafka-storm-net
  113. kafka-ui:
  114. image: provectuslabs/kafka-ui:master
  115. container_name: kafka-ui
  116. ports:
  117. - "9080:8080"
  118. restart: always
  119. environment:
  120. - KAFKA_CLUSTERS_0_NAME=hsh_kafka_cluster
  121. - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS= kafka1:9092 ,kafka2:9092,kafka3:9092
  122. - DYNAMIC_CONFIG_ENABLED= 'true'
  123. - AUTH_TYPE=LOGIN_FORM
  124. - SPRING_SECURITY_USER_NAME=hsh
  125. - SPRING_SECURITY_USER_PASSWORD=241817
  126. depends_on:
  127. - kafka1
  128. - kafka2
  129. - kafka3
  130. volumes:
  131. - ./kafka-ui/config.yml:/etc/kafkaui/dynamic_config.yaml
  132. networks:
  133. - kafka-storm-net
  134. storm-nimbus:
  135. image: storm:2.5.0
  136. container_name: storm-nimbus
  137. hostname: storm-nimbus
  138. command: storm nimbus
  139. ports:
  140. - 6627:6627
  141. depends_on:
  142. - zookeeper1
  143. - zookeeper2
  144. - zookeeper3
  145. environment:
  146. - STORM_ZOOKEEPER_SERVERS=zookeeper1,zookeeper2,zookeeper3
  147. volumes:
  148. - ./storm-conf/storm.yaml:/conf/storm.yaml
  149. networks:
  150. - kafka-storm-net
  151. storm-supervisor1:
  152. image: storm:2.5.0
  153. container_name: storm-supervisor1
  154. hostname: storm-supervisor1
  155. command: storm supervisor
  156. depends_on:
  157. - storm-nimbus
  158. volumes:
  159. - ./storm-conf/storm.yaml:/conf/storm.yaml
  160. networks:
  161. - kafka-storm-net
  162. storm-supervisor2:
  163. image: storm:2.5.0
  164. container_name: storm-supervisor2
  165. hostname: storm-supervisor2
  166. command: storm supervisor
  167. depends_on:
  168. - storm-nimbus
  169. volumes:
  170. - ./storm-conf/storm.yaml:/conf/storm.yaml
  171. networks:
  172. - kafka-storm-net
  173. storm-supervisor3:
  174. image: storm:2.5.0
  175. container_name: storm-supervisor3
  176. hostname: storm-supervisor3
  177. command: storm supervisor
  178. depends_on:
  179. - storm-nimbus
  180. volumes:
  181. - ./storm-conf/storm.yaml:/conf/storm.yaml
  182. networks:
  183. - kafka-storm-net
  184. storm-ui:
  185. image: storm:2.5.0
  186. container_name: storm-ui
  187. hostname: storm-ui
  188. command: storm ui
  189. ports:
  190. - "8080:8080"
  191. depends_on:
  192. - storm-nimbus
  193. volumes:
  194. - ./storm-conf/storm.yaml:/conf/storm.yaml
  195. networks:
  196. - kafka-storm-net

运行docker-compose文件

在docker-compose.yaml文件的当前目录下,右键点击在终端中打开

输入命令:docker-compose up,即会自动拉取docker-compose文件中的相关镜像并开启容器运行,待其全部完毕,就可以在docker的可视化界面中看到已经开启的集群。

注:

1、docker-compose的文件,只有在文件名为docker-compose时才可以使用docker-compose up命令,如果名字为自定义时,需要指定文件名才行,命令为  docker-compose -f my-compose.yml up。

2、docker-compose文件名后缀使用  .yml   或   .yaml都可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/74227
推荐阅读
相关标签
  

闽ICP备14008679号