docker-compose.yml配置文件的常用构建参数

Docker Compose 配置文件的常用构建参数说明
官方提供了一个 yaml Docker Compose 配置文件的标准例子

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

1、image

从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果镜像不存在,Compose 会自动拉去镜像

2、network_mode

网络模式,用法类似于 Docke 客户端的 --net 选项,格式为:service:[service name]
可以指定使用服务或者容器的网络
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”

3、 networks

加入指定网络

services:
some-service:
networks:
- some-network
- other-network

4、ports

映射端口

1. SHORT 语法

可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口

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”

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

2. LONG 语法

LONG 语法支持 SHORT 语法不支持的附加字段

target:容器内的端口
published:公开的端口
protocol: 端口协议(tcp 或 udp)
mode:通过host 用在每个节点还是哪个发布的主机端口或使用 ingress 用于集群模式端口进行平衡负载,
ports:

  • target: 80
    published: 8080
    protocol: tcp
    mode: host

5、volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统

version: “3.2”
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static

db:
image: postgres:latest
volumes:
- “/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock”
- “dbdata:/var/lib/postgresql/data”

volumes:
mydata:
dbdata:

Compose 的数据卷指定路径可以是相对路径,使用 . 或者 … 来指定相对目录。

数据卷的格式可以是下面多种形式:

volumes:
#只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。

  • /var/lib/mysql

使用绝对路径挂载数据卷

  • /opt/data:/var/lib/mysql

以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。

  • ./cache:/tmp/cache

使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。

  • ~/configs:/etc/configs/:ro

已经存在的命名的数据卷。

  • datavolume:/var/lib/mysql

如果你不使用宿主机的路径,可以指定一个 volume_driver

volume_driver: mydriver

1. SHORT 语法

可以选择在主机(HOST:CONTAINER)或访问模式(HOST:CONTAINER:ro)上指定路径。

可以在主机上挂载相对路径,该路径相对于正在使用的 Compose 配置文件的目录进行扩展。相对路径应始终以 . 或 … 开头

volumes:

Just specify a path and let the Engine create a volume

  • /var/lib/mysql

Specify an absolute path mapping

  • /opt/data:/var/lib/mysql

Path on the host, relative to the Compose file

  • ./cache:/tmp/cache

User-relative path

  • ~/configs:/etc/configs/:ro

Named volume

  • datavolume:/var/lib/mysql

2. LONG 语法

LONG 语法有些附加字段

type:安装类型,可以为 volume、bind 或 tmpfs
source:安装源,主机上用于绑定安装的路径或定义在顶级 volumes密钥中卷的名称 ,不适用于 tmpfs 类型安装。
target:卷安装在容器中的路径
read_only:标志将卷设置为只读
bind:配置额外的绑定选项
propagation:用于绑定的传播模式
volume:配置额外的音量选项
nocopy:创建卷时禁止从容器复制数据的标志
tmpfs:配置额外的 tmpfs 选项
size:tmpfs 的大小,以字节为单位

version: “3.2”
services:
web:
image: nginx:alpine
ports:
- “80:80”
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static

networks:
webnet:

volumes:
mydata:

6、 volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。

volumes_from:

  • service_name
  • service_name:ro
  • container:container_name
  • container:container_name:rw

7、depends_on

此选项解决了启动顺序的问题

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

指定服务之间的依赖关系,有两种效果

docker-compose up 以依赖顺序启动服务,下面例子中 redis 和 db 服务在 web 启动前启动
docker-compose up SERVICE 自动包含 SERVICE 的依赖性,下面例子中,例如下面容器会先启动 redis 和 db
两个服务,最后才启动 web 服务:
version: ‘3’
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系

8、deploy

指定与部署和运行服务相关的配置

version: ‘3’
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure

这里有几个子选项

1. endpoint_mode

指定连接到群组外部客户端服务发现方法

endpoint_mode:vip :Docker 为该服务分配了一个虚拟 IP(VIP),作为客户端的 “前端“ 部位用于访问网络上的服务。
endpoint_mode: dnsrr : DNS轮询(DNSRR)服务发现不使用单个虚拟 IP。Docker为服务设置 DNS 条目,使得服务名称的 DNS 查询返回一个 IP 地址列表,并且客户端直接连接到其中的一个。如果想使用自己的负载平衡器,或者混合 Windows 和 Linux 应用程序,则 DNS 轮询调度(round-robin)功能就非常实用。
version: “3.3”

services:
wordpress:
image: wordpress
ports:
- 8080:80
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip

mysql:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: dnsrr

volumes:
db-data:

networks:
overlay:

相关信息:Swarm 模式 CLI 命令 、Configure 服务发现

2.labels

指定服务的标签,这些标签仅在服务上设置。

version: “3”
services:
web:
image: web
deploy:
labels:
com.example.description: “This label will appear on the web service”

通过将 deploy 外面的 labels 标签来设置容器上的 labels

version: “3”
services:
web:
image: web
labels:
com.example.description: “This label will appear on all containers for the web service”

3.mode

global:每个集节点只有一个容器
replicated:指定容器数量(默认)

version: ‘3’
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global

4. placement

指定 constraints 和 preferences

version: ‘3’
services:
db:
image: postgres
deploy:
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
preferences:
- spread: node.labels.zone

5.replicas

如果服务是 replicated(默认),需要指定运行的容器数量

version: ‘3’
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6

6. resources

配置资源限制

version: ‘3’
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: ‘0.50’
memory: 50M
reservations:
cpus: ‘0.25’
memory: 20M

此例子中,redis 服务限制使用不超过 50M 的内存和 0.50(50%)可用处理时间(CPU),并且 保留 20M 了内存和 0.25 CPU时间

7. restart_policy

配置容器的重新启动,代替 restart

condition:值可以为 none 、on-failure 以及 any(默认)
delay: 尝试重启的等待时间,默认为 0
max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。
windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。

version: “3”
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s

8. update_config

配置更新服务,用于无缝更新应用(rolling update)

parallelism:一次性更新的容器数量
delay:更新一组容器之间的等待时间。
failure_action:如果更新失败,可以执行的的是 continue、rollback 或 pause (默认)
monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为0)
max_failure_ratio:在更新期间能接受的失败率
order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first)

version: ‘3.4’
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first

不支持 Docker stack desploy 的几个子选项
build、cgroup_parent、container_name、devices、tmpfs、external_links、inks、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Compose 是 Docker 官方提供的一个工具,用于管理多个 Docker 容器的工具,通过一个配置文件来定义一组相关联的应用容器为一个项目。Docker Compose 配置文件 docker-compose.yml 是一个 YAML 格式的文件,用于定义多个容器的构建、启动和运行参数。 下面是一个 docker-compose.yml 配置文件的示例: ``` version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code links: - redis redis: image: "redis:alpine" ``` 这个配置文件定义了两个服务:web 和 redis。web 服务基于 Dockerfile 构建镜像,将容器内部的 5000 端口映射到主机的 5000 端口,将当前目录挂载到容器的 /code 目录下,同时将 redis 服务链接到 web 服务中。redis 服务则直接使用官方提供的 redis:alpine 镜像。 在这个配置文件中,version 指定了 Docker Compose 的版本号。services 是一个列表,用于定义多个服务。每个服务定义了自己的构建、启动和运行参数。 在 services 列表中,每个服务都有一个名称,这个名称是用来区分服务的。例如,这个配置文件中的 web 服务就是一个名为 web 的容器。 build 表示使用 Dockerfile 构建镜像。ports 表示将容器内部的端口映射到主机的端口。volumes 表示将主机上的目录挂载到容器内部,使容器内部的数据可以持久化保存。links 表示将其他服务链接到当前服务中,以便它们之间可以相互通信。 除了上面的参数之外,还有其他一些参数可以用于配置 Docker Compose,例如 networks、volumes、environment 等等。详细的配置参数可以参考 Docker Compose 的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值