一 Docker Compose文件简介

compose文件使用yml格式,主要分为了四个区域:
  • version:用于指定当前docker-compose.yml语法遵循哪个版本
  • services:服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
  • networks:应用的网络,在它下面可以定义应用的名字、使用的网络类型等。
  • volumes:数据卷,在它下面可以定义数据卷,然后挂载到不同的服务下去使用。

二 Docker Compose文件详解

2.1 version字段

用于指定当前compose文件语法遵循哪个版本,Compose文件版本支持特定的Docker版本列表如下:
Compose文件格式
Docker Engine版本
3.7
18.06.0+
3.6
18.02.0+
3.5
17.12.0+
3.4
17.09.0+
3.3
17.06.0+
3.2
17.04.0+
3.1
1.13.1+
3.0
1.13.0+
2.4
17.12.0+
2.3
17.06.0+
2.2
1.13.0+
2.1
1.12.0+
2.0
1.10.0+
1.0
1.9.1.+
示例:version: "3"

2.2 services区域

所有服务的定义都是定义在services区域中,services常用的配置项如下:
image:指定要启动容器的映像。可以是一个repository/tag或镜像ID来表明。
示例:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
提示:image可以是本地也可以是远程的,如果本地不存在,compose会尝试pull下来,肉使用了build手动构建镜像,则使用指定的选项构建它,并使用指定的标签标记它。
 
build:该参数指定Dockerfile文件的路径,compose会通过Dockerfile构建并生成镜像,然后使用该镜像
示例:
 version: '3'
services:
webapp:
build: ./dir
image: webapp:tag
 
提示:如果在构建镜像的时候你指定相关名字和tag,则生成指定的镜像和tag。
 
command:重写默认的命令,即指定启动容器的命令。
示例:
command: bundle exec thin -p 3000 或
command: ["bundle", "exec", "thin", "-p", "3000"]
 
links:链接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称。
示例:
 web:
links:
- db
- db:database
- redis
此时,在容器内部,会在/etc/hosts文件中用别名创建几个条目,如下:
 172.17.2.100 db
172.17.2.100 database
172.17.2.100 redis
 
external_links:链接到compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法。
示例:
 external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
 
ports:暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口。
提示:注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为base-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"
示例2:
 ports:
- target: 80
published: 8080
protocol: tcp
mode: host
解释:长格式语法允许配置无法以简短形式表示的其他字段。
  • target:容器内的端口
  • published:公开暴露的港口
  • protocol:端口协议(tcp或udp)
  • mode:host用于在每个节点上发布主机端口,或者ingress用于负载平衡的群集模式端口。
 
expose:暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供,只能指定内部端口。
示例:
 expose:
- "3000"
- "8000"
 
environment:加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值。
提示:任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。
示例:
 environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
 
env_file:从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值。
示例:
 env_file: .env

 env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
提示:列表中文件的顺序对于确定分配给多次显示的变量的值非常重要。列表中的文件从上到下进行处理。对于在文件中指定的相同变量a.env并在文件中 分配不同的值b.env,如果b.env列在下面(后),则来自b.envstand 的值。
如:给出以下声明docker_compose.yml:
 services:
some-service:
env_file:
- a.env
- b.env
以下文件:
# a.env VAR=1
# b.env VAR=hello
则$VAR是hello。
 
depends_on:指定与部署和运行服务相关的配置。
示例:
 version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
服务依赖关系之间的Express依赖关系会导致以下行为:
  • docker-compose up:以依赖顺序启动服务,在以上示例中,db和redis之在web之前启动。
  • docker-compose up SERVICE:自动包含SERVICE依赖项。在以上示例中,docker-compose up web还创建并启动db和redis。
 
deploy:指定与部署和运行服务相关的配置。
示例:
 version: '3'
services:
redis:
image: redis:alpine
deploy:
labels:
com.example.description: "This label will appear on all containers for the web service"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
replicas: 6
update_config:
parallelism: 2
delay: 10s
update_config:
parallelism: 2
delay: 10s
order: stop-first
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
 
子选项说明:
labels:指定服务的标签。这些标签仅在服务上设置,而不是在服务的任何容器上设置。
mode:global:每个集群节点只有一个容器,默认为replicated。
resources:资源限制,如上所示:redis服务被限制为使用不超过50M的内存和0.50(50%)的CPU时间,并且保留20M了内存和0.25CPU时间(始终可用)。
replicas:指定replicated后,或默认情况下课使用replicas指定副本数,
restart_policy:配置是否以及如何在容器退出时重新启动容器,包括:
  • condition:其中之一none,on-failure或any(默认:) any。
  • delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
  • max_attempts:在放弃之前尝试重新启动容器的次数(默认值:永不放弃)。如果在配置中未成功重新启动 window,则此尝试不会计入配置的max_attempts值。例如,如果max_attempts设置为“2”,并且第一次尝试时重新启动失败,则可能会尝试重新启动两次以上。
  • window:在决定重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
rollback_config:配置在更新失败的情况下应如何回滚服务。
  • parallelism:一次回滚的容器数。如果设置为0,则所有容器同时回滚。
  • delay:每个容器组的回滚之间等待的时间(默认为0)。
  • failure_action:如果回滚失败该怎么办。一个continue或pause(默认pause)
  • monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
  • max_failure_ratio:回滚期间容忍的失败率(默认值为0)。
  • order:回滚期间的操作顺序。其中之一stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)。
update_config:配置服务应如何更新,用于配置滚动更新。
  • parallelism:一次更新的容器数。
  • delay:更新一组容器之间的等待时间。
  • failure_action:更新失败时的行为。其中一个continue,rollback或者pause (默认:pause)。
  • monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
  • max_failure_ratio:更新期间容忍的故障率。
  • order:更新期间的操作顺序。其中一个stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)注意:仅支持v3.4及更高版本。
注意:order仅支持v3.4及更高版本的撰写文件格式。
 
healthcheck:配置运行的检查以确定此服务的容器是否“健康”。
示例:
 healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
提示:healthcheck可参考:https://docs.docker.com/engine/reference/builder/#healthcheck
 
network_mode:网络类型,可指定容器运行的网络类型
示例:
 network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
 
dns:自定义dns服务
 dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9

2.3 networks区域

网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。
提示:注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称。您可以使用--project-name参数或COMPOSE_PROJECT_NAME环境变量覆盖项目名称,如当前的目录为myapp,期docker-compose.yml如下:
 version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
运行时docker-compose up,则:
  1. 创建了一个名为myapp_default的网络。
  2. 使用web配置创建容器,在web下加入myapp_default网络。
  3. 使用db配置创建容器,在db下加入myapp_default网络。
示例:
 version: '2'

 services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10 networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.168.238.254

2.4 volumes区域

可以在Compose file文件上声明卷,同时也可以在本区域创建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:
提示:volumes可参考:https://docs.docker.com/compose/compose-file/#specifying-byte-values

附005.Docker Compose文件详解的更多相关文章

  1. 附003.Docker Compose命令详解

    一 Docker Compose命令格式 Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker- ...

  2. Docker Compose文件详解 V2

    Compose file reference 语法: web:      build: ./web      ports:      - "5000:5000"      volu ...

  3. Docker Compose配置文件详解(V3)

    Docker Compose配置文件是Docker Compose的核心,用于定义服务.网络和数据卷.格式为YAML,默认路径为./docker-compose.yml,可以使用.yml或.yaml扩 ...

  4. Docker Compose 配置文件详解

    先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说: version: '2' services: web: image: dockercloud/he ...

  5. docker entrypoint入口文件详解

    docker entrypoint入口文件详解 pasting Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较 [k8s]args指令案例-彻底理解docke ...

  6. Docker学习(六)——Dockerfile文件详解

    Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...

  7. k8s之yaml文件详解

    k8s之yaml文件详解 目录 k8s之yaml文件详解 1. k8s支持的文件格式 2. YAML语言格式 3. 查看api资源版本标签 4. 编写nginx-test.yaml资源配置清单 4.1 ...

  8. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  9. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

随机推荐

  1. B - Internship (网络流关键割边)

    题目链接:https://cn.vjudge.net/contest/281961#problem/B 题目大意:给你n个城市,中间有一些中转站,然后给你终点,再给你l条轨道以及流量,问你增加哪几条轨 ...

  2. mysql 案例~关于pt-osc工具的用途

    简介:今天咱们聊聊PT-OSC的东东一 简单介绍  1 标准组合   pt-online-schema-change --user= --password= --host= D=,t= --sock= ...

  3. 单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场

    这里收录三个同类产品,找到他们花了我不少时间呢. 张鑫旭写的mobilebone自述:mobile移动端,PC桌面端页面无刷新过场JS骨架,简单.专注!http://www.zhangxinxu.co ...

  4. diff命令的参数详解和实例 【转】

    转自:http://blog.chinaunix.net/uid-25324849-id-270254.html diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文 ...

  5. Oracle实体化视图

    1.减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担.  2.搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数 ...

  6. 使用NGINX+Openresty和unixhot_waf开源防火墙实现WAF功能

    使用NGINX+Openresty实现WAF功能 一.了解WAF1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: ...

  7. nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory

    nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...

  8. [学习笔记]JS 数组Array push相关问题

    前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...

  9. Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档

    1.添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!--swagger2--> <dependency> <groupId>io.spr ...

  10. TCP template 代码

    服务端 from socket import * server= socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server. ...