docker-compose
总结:
文件定义的为一个应用程序应该如何运行。所以其内容应该由两个部分组成,一份为资源定义,也就是容器需要的存储资源,网络资源, 第二部分是容器的定义。
例子:
定义
- 两个服务,一个前端web服务,以及一个后台数据库服务。
- 一个数字证书用于HTTPS
- web服务配置
- 一个持久化卷用于数据库服务
- 两个网络
services:
frontend:
image: awesome/webapp
ports:
- "443:8043"
networks:
- front-tier
- back-tier
configs:
- httpd-config
secrets:
- server-certificate
backend:
image: awesome/database
volumes:
- db-data:/etc/data
networks:
- back-tier
volumes:
db-data:
driver: flocker
driver_opts:
size: "10GiB"
configs:
httpd-config:
external: true
secrets:
server-certificate:
external: true
networks:
# The presence of these objects is sufficient to define them
front-tier: {}
back-tier: {}
容器属性配置
- privileged
privileged : true
设置容器以root模式运行。这会影响很多东西,例如,物理机的/proc
目录与容器的/proc
目录将完全一致。 - environment
设置容器环境变量 - runtime
运行时容器的实现,容器是一个规范,由OCI组织定义,至于实现,就有各种各样的实现了。 - sysctls
只能修改具有名称空间的内核参数,因为需要实现进程间隔离。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
- restart
容器终止时采用的策略
no : 不执行任何操作
always:一直尝试重启
on-failure: 如果退出代码指示错误,策略将重新启动容器。
unless-stopped: 策略将重新启动容器,而不考虑退出代码,但在服务停止或删除时将停止重新启动。
网络配置
(1) IP地址配置
ipam:
driver: default # 网络驱动类型
config:
- subnet: 172.28.0.0/16 # 子网网段
ip_range: 172.28.5.0/24 # 容器允许使用的IP地址
gateway: 172.28.5.254 # 网关
aux_addresses: # hostname 与 IP地址的映射
host1: 172.28.1.5
host2: 172.28.1.6
host3: 172.28.1.7
options:
foo: bar
baz: "0"
(2) 定义网络是否为外部
# 网络的生命周期是否大于容器,如果大于容器,则 compose 不应该试图创建。而是查询使用已有的网络。
services:
proxy:
image: awesome/proxy
networks:
- outside
- default
app:
image: awesome/app
networks:
- default
networks:
outside:
external: true
(3) 端口映射
使用端口映射的前提是网络模式不能为host。
# 短语法格式
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" # 网络协议指定
# 长语法格式
ports:
- target: 80 # 容器端口地址
host_ip: 127.0.0.1 # 主机IP地址
published: 8080 # 主机端口号
protocol: tcp # 协议
mode: host # ingress 用于负载均衡 host用于暴露端口
容器标签
labels:
com.example.description: "Financial transaction network"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Financial transaction network"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
参考资料
https://github.com/compose-spec/compose-spec/blob/master/spec.md