Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户使用YAML格式的配置文件(通常是docker-compose.yml)来配置应用程序所需的所有服务,并可以通过一个命令来启动或关闭这些容器。
服务配置(接上一篇)
26. network_mode
设置网络模式。使用和Docker客户端中的--network的参数一样的值,格式为service:[service name]。可以指定使用服务或者容器的网络。示例如下:
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
注意事项:
在swarm mode下部署堆栈时,该选项将被忽略。
network_mode: "host"不能与links配置项混用。
27. networks
指定所加入的网络。需要在顶层networks配置项中引入具体的网络信息。例如:
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
(1) aliases
指定服务在此网络上的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名来连接到服务的任何一个容器。由于aliases属于网络范围,因此同一服务在不同的网络上可以具有不同的别名。例如:
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
在以下示例中,提供了web、worker和db三个服务,以及new和legacy两个网络:
version: "3.8"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
在该例中,可以通过主机名db或database在new网络上访问db服务,通过db或mysql在legacy网络上访问db服务。
注意:网络范围内的别名可以被多个容器甚至多个服务共享。如果是这样,则不能保证名称恰好解析到哪一个容器。
(2) ipv4_address、ipv6_address
加入网络后,为此服务的容器指定一个静态IP地址。在顶层networks配置项中的相应网络配置必须有子网配置覆盖每个静态地址的ipam配置。例如:
version: "3.8"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
注意:如果需要IPv6寻址,则必须使用V2.x版本的Compose配置文件并设置顶层networks配置项下的enable_ipv6选项。在当前swarm mode下IPv6选项不会起作用。
28. pid
跟主机系统共享进程命名空间。
pid: "host"
将PID模式设置为主机PID模式,打开该选项的容器之间,以及容器和宿主机操作系统之间可以通过进程ID来相互访问和操作。
29. ports
暴露端口。注意端口映射与network_mode: host不兼容。支持short和long两种格式的语法。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"
- "12400-12500:1240"
注意:当使用HOST:CONTAINE格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制,因此建议始终采用字符串格式来指定端口映射。
long语法支持配置short语法中不支持的附加字段。这些附加字段如下:
target:指定容器内的端口。
published:指定公开的端口。
protocol:指定端口协议(tcp或udp)。
mode:使用host在每个节点公开一个主机端口,或使用ingress对swarm mode端口进行负载均衡。
示例如下:
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
long语法在3.2版的配置文件格式中加入
30. restart
指定重启策略。例如想要在容器退出时总是会重启容器,指定以下重启策略:
restart: always
一共支持以下重启策略:
no:在任何情况下都不会重启容器。默认的重启策略。
always:在容器退出时总是重启容器。
on-failure:在容器以非0状态码退出时才会重启。
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,restart配置项将被忽略。