什么是YAML呢?
YAML全称YAML Ain't Markup Language表示“YAML不是一种标记语言”的缩写,为了强调YAML语言以数据作为中心,不是以标记语言为重点,使用返璞词重新命名。
YAML是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
YAML是一种类似于标准通用标记语言的子集XML的数据描述语言,语法比XML更加容易简单。
什么是Docker Compose呢?
docker-compose
是用来将Docker自动化的命令,有了docker-compose
可将繁琐的Docker操作整合为一条命令,自动化的完成。
Docker Compose命令请参见 《docker-compose命令》
什么是docker-compose.yml文件呢?
Docker Compose默认的模板文件是docker-compose.yml
,其中定义的每个服务都必须通过image
指令指定镜像或使用Dockerfile的build
指令进行自动构建,其它大部分指令跟docker run
中选项类似。
如果使用Dockerfile的build
指令,则在Dockerfile中设置的选项如CMD
、EXPOSE
、VOLUME
、ENV
等将会自动被获取,无需在docker-comopse.yml
文件中再次设置。
如果使用image
指定为镜像名称或镜像ID时镜像在本地不存在,Compose将会尝试去拉取这个镜像。
典型的docker-comopse.yml
文件格式
$ vim docker-compose.yml
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
Compose文件是一个定义服务services
、网络networks
和卷volumes
的YAML文件,默认路径是./docker-compose.yml
,可使用.yml
或.yaml
作为文件扩展名。
服务services
定义包含应用于为该服务启动的每个容器的配置,类似传递命令行参数一样docker container create
。同样,网络networks
和卷volumes
的定义类似于docker network create
和docker volume create
。正如docker container create
在Dockerfile
指定选项,如CMD
、EXPOSE
、VOLUME
、ENV
,在默认情况下,不需要在docker-compose.yml
配置中再次指定。可以使用Bash类${VARIABLE}
语法在配置值中使用环境变量。
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:
docker-compose.yml指令有那些呢?
标准配置文件应该包含version
、services
、networks
三部分,其中最关键的是services
和networks
两个部分。
images
images
用来指定服务的镜像名称或镜像ID,如果镜像在本地不存在,compose将会尝试去拉取这个镜像。
services:
web:
image:redis
volumes
volumes
指令用于设置数据卷挂载路径,数据卷挂载路径可以是一个目录或一个已经存在的数据卷容器,可以设置宿主机路径HOST:CONTAINER
或加上访问模式HOST:CONTAINER:ro
。使用ro
表示对于容器来说数据卷是只读的,这样可以有效地保护宿主机的文件系统。
volumes:
# 指定一个容器内的路径,Docker会自动创建一个数据卷。
- /var/lib/mysql
# 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
# 以compose配置文件所在目录为根的相对路径作为数据卷挂载到容器
- ./cache:/tmp/cache
# 使用用户的相对路径
- ~/configs:/etc/configs:ro
networks
networks
指令用于设置指定网络
services:
some-service:
networks:
- some-network
networks
标签拥有一个特别的子标签aliases
用于设置服务别名,相同的别名可以在不同的网络中拥有不同的别名。
services:
some-service:
networks:
some-network:
aliases:
- alias1
未完待续...