Service配置指令详解

container_name(指定容器名称)

指定容器名称
1
2
3
4
5
version: "3"
services:
redis:
image: redis:alpine
container_name: redis_test

image(指定为镜像名称或镜像ID)

如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
1
2
3
4
version: "3"
services:
redis:
image: redis:alpine

build(指定Dockerfile文件夹路径)

可以是绝对路径,或者相对docker-compose.yml文件的路径。 Compose将会自动构建镜像,然后使用镜像
1
2
3
4
version: '3'
services:
webapp:
build: ./dir
如果同时指定了 image和 build,image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称
1
2
3
4
5
version: '3'
services:
webapp:
image: myimage
build: ./dir

context(指定 Dockerfile文件夹路径)

也可以是到链接到git仓库的url,同时使用dockerfile指令指定Dockerfile文件名
1
2
3
4
5
6
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-name

command(覆盖容器启动默认命令)

写成shell形式
1
2
3
4
5
version: '3'
services:
myservice:
image: myimage:latest
command: mycommand arg1 arg2
写成Dockerfile中的exec格式
1
2
3
4
5
version: '3'
services:
myservice:
image: myimage:latest
command: ["bundle", "exec", "thin", "-p", "3000"]

entrypoint(覆盖容器默认的entrypoint)

entrypoint配合command
1
2
3
4
5
6
version: '3'
services:
myservice:
image: myimage:latest
entrypoint: ["/entrypoint.sh"]
command: mycommand arg1 arg2

depends_on(容器依赖)

解决容器的依赖、启动先后的问题,只有依赖的启动完成了才能启动当前的服务
1
2
3
4
5
6
7
8
9
version: '3'
services:
web:
image: redis:alpine
container_name: redis_test
depends_on:
- db
db:
image: mysql:5.7

environment(设置环境变量)

可以使用数组或字典两种格式,只给定名称没有值的变量会自动获宿主机上的对应系统变量
1
2
3
4
5
6
7
8
9
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:

environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET

如果变量名称或者值中用到true|false,yes|no等表达布尔含义的词汇,最好放到引号里,避免YAML自动解析某些内容为对应的布尔语义

expose(暴露端口)

暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
1
2
3
expose:
- "3000"
- "8000"

ports(映射端口信息)

宿主端口:容器端口的格式,或者仅仅指定容器的端口,宿主将会随机选择端口
1
2
3
4
5
6
7
8
9
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进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式

extra_hosts(指定额外host映射)

类似Docker中的–add-host参数,会在启动后的服务容器中/etc/hosts文件中添加host映射信息
1
2
3
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"

dns(自定义DNS服务器)

可以是一个值,也可以是一个列表
1
2
3
4
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
链接到其它服务中的容器
1
2
3
4
links:
- db
- db:database
- redis

restart(指定容器退出后的重启策略)

该命令对保持服务始终运行十分有效,在生产环境中推荐配置为always或者unless-stopped
1
2
3
4
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

alias(网络上此服务的别名)

同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。由于aliases是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名
1
2
3
4
5
6
7
8
9
10
11
12
#注意:网络范围的别名可以多个容器共享,甚至可以多个服务共享。如果是,则无法保证名称解析到正确的容器

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

volumes(挂载宿主机路径到容器)

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#注意: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

volumes_from(从另一个服务或容器挂载)

从另一个服务或容器挂载
1
2
3
volumes_from:
- service_name
- container_name