当前位置:   article > 正文

Docker之docker-compose语法

docker-compose语法

Docker之docker-compose语法

Compose介绍

Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

compose 的优点:

  • 在单个主机上建立多个隔离环境,Compose 使用项目名称将环境彼此隔离。您可以在多个不同的上下文中使用此项目名称。默认项目名称是项目目录的基本名称。您可以使用-p 命令行选项或 - COMPOSE_PROJECT_NAME 环境变量设置自定义项目名称 。默认项目目录是 Compose 文件的基本目录。可以使用–project-directory 命令行选项自定义项目目录。
  • 创建容器时保留卷数据
  • 仅重新创建已更改的容器,当您重新启动未更改的服务时,Compose 会使用现有容器。
  • 变量在环境之间组合重复使用

Docker Compose 配置文件的构建参数说明

build

build 可以指定包含构建上下文的路径

version: '2'
services:
  webapp:
    build: ./dir
    

//或者,作为一个对象,该对象具有上下文路径和指定的Dockerfile文件以及args参数值
version: '2'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

image

指定运行容器使用的镜像。以下格式都可以。

image: redis
image: centos
image: tutum/influxdb
image: example-registry.com/postgresql
image: bs2n54kl
  • 1
  • 2
  • 3
  • 4
  • 5

如果镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。

args

添加构建参数,这些参数是仅在构建过程中可访问的环境变量。

首先,在Dockerfile中指定参数:

ARG buildno

ARG gitcommithash

 

RUN echo "Build number: $buildno"

RUN echo "Based on commit: $gitcommithash"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后在build键下指定参数,可以传递映射或列表

build:

   context:.

   args:

     buildno:1

     gitcommithash:cdc3b19

build:

   context:.

   args:

     - buildno=1

     - gitcommithash=cdc3b19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注意:在Dockerfile中,如果ARG在FROM指令之前指定, ARG则在构建说明中不可用FROM。如果您需要在两个位置都可以使用参数,请在FROM指令下指定它。

你可以在指定构建参数时省略该值,在这种情况下,它在构建时的值是运行Compose的环境中的值。

args:

   - buildno

   - gitcommithash
  • 1
  • 2
  • 3
  • 4
  • 5

container_name

指定一个自定义容器名称,而不是生成的默认名称。

container_name: my-web-container
  • 1

由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。

volumes

卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。
你可以在主机上挂载相对路径,该路径将相对于当前正在使用的Compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 … 开始。


volumes:
  # 只需指定一个路径,让引擎创建一个卷
  - /var/lib/mysql
 
  # 指定绝对路径映射
  - /opt/data:/var/lib/mysql
 
  # 相对于当前compose文件的相对路径
  - ./cache:/tmp/cache
 
  # 用户家目录相对路径
  - ~/configs:/etc/configs/:ro
 
  # 命名卷
  - datavolume:/var/lib/mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

但是,如果要跨多个服务并重用挂载卷,请在顶级volumes关键字中命名挂在卷,但是并不强制,如下的示例亦有重用挂载卷的功能,但是不提倡。


version: "3"
 
services:
  web1:
    build: ./web/
    volumes:
      - ../code:/opt/web/code
  web2:
    build: ./web/
    volumes:
      - ../code:/opt/web/code
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

通过顶级volumes定义一个挂载卷,并从每个服务的卷列表中引用它, 这会替换早期版本的Compose文件格式中volumes_from。


version: "3"
 
services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data
 
volumes:
  data-volume:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数

expose:
 - "8080"
 - "80"
  • 1
  • 2
  • 3

target

根据对应的 Dockerfile 构建指定 Stage

build:

   context:.

   target:prod
  • 1
  • 2
  • 3
  • 4
  • 5

ports

暴露端口信息。
常用的简单格式:使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在v3.2中ports的长格式的语法允许配置不能用短格式表示的附加字段。
长格式:

ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host
  • 1
  • 2
  • 3
  • 4
  • 5

target:容器内的端口
published:物理主机的端口
protocol:端口协议(tcp或udp)
mode:host 和ingress 两总模式,host用于在每个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。

pid

将PID模式设置为主机PID模式。 这就打开了容器与主机操作系统之间的共享PID地址空间。 使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。即打开该选项的容器可以相互通过进程 ID 来访问和操作。

pid: "host"
  • 1

env_file

从文件中添加环境变量。可以是单个值或是列表

如果已经用 docker-compose -f FILE 指定了 Compose 文件,那么 env_file 路径值为相对于该文件所在的目录

但 environment 环境中的设置的变量会会覆盖这些值,无论这些值未定义还是为 None

env_file:.env

env_file:

   - ./common.env

   - ./apps/web.env

    -/opt/secrets.env
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

environment

添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
 
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。 将使用build的args子选项来定义构建时的环境变量。

links

链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS),与 Docker 客户端的 --link 有一样效果,会连接到其它服务中的容器。

web:
 links:

    - db

    - db:database

    - redis
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

networks

加入指定网络

services:
  some-service:
    networks:
     - some-network
     - other-network
  • 1
  • 2
  • 3
  • 4
  • 5

关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

command

覆盖容器启动后默认执行的命令

command:bundle exec thin -p 3000
  • 1

该命令也可以是一个列表,方式类似于dockerfile:

command:["bundle","exec","thin","-p","3000"]
  • 1

entrypoint

在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点。在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义

entrypoint:/code/entrypoint.sh
  • 1

configs

使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法

  • SHORT 语法
    • SHORT 语法只能指定配置名称,这允许容器访问配置并将其安装在 /<config_name> 容器内,源名称和目标装入点都设为配置名称。
version:"3.7"

services:

   redis:

     image:redis:latest

     deploy:

       replicas:1

     configs:

       - my_config

       - my_other_config

configs:

   my_config:

     file:./my_config.txt

   my_other_config:

     external:true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

以上实例使用 SHORT 语法将 redis 服务访问授予 my_config 和 my_other_config ,并被 my_other_config 定义为外部资源,这意味着它已经在 Docker 中定义。可以通过 docker config create 命令或通过另一个堆栈部署。如果外部部署配置都不存在,则堆栈部署会失败并出现 config not found 错误。

注意: config 定义仅在 3.3 版本或在更高版本的撰写文件格式中受支持,YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

  • LONG 语法
    LONG 语法提供了创建服务配置的更加详细的信息。
    • source:Docker 中存在的配置的名称
    • target:要在服务的任务中装载的文件的路径或名称。如果未指定则默认为 /
    • uid 和 gid:在服务的任务容器中拥有安装的配置文件的数字 UID 或 GID。如果未指定,则认为在Linux上。Windows不支持。
    • mode:在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444。如果配置文件无法写入,是因为它们安装在临时文件系统中,所以如果设置了可写位,它将被忽略。可执行位可以设置。如果您不熟悉 UNIX 文件权限模式,Unix Permissions Calculator

下面示例在容器中将 my_config 名称设置为 redis_config,将模式设置为 0440(group-readable)并将用户和组设置为 103。该redis服务无法访问 my_other_config 配置

version:"3.7"

services:

   redis:

     image:redis:latest

     deploy:

       replicas:1

     configs:

       - source:my_config

         target:/redis_config

         uid:'103'

         gid:'103'

         mode:0440

configs:

   my_config:

     file:./my_config.txt

   my_other_config:

     external:true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

可以同时授予多个配置的服务相应的访问权限,也可以混合使用 LONG 和 SHORT 语法。定义配置并不意味着授予服务访问权限。

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

闽ICP备14008679号