容器编排docker-compose
docker-compose.yml文件是一个 YAML 文件,用于定义 Docker 容器在生产中的行为方式。
将 Compose 文件设置为 version:“3”。本质上,这会使其兼容 swarm mode。我们可以使用 docker stack deploy 命令(仅在 Compose 文件版本 3.x 及更高版本上受支持)运行此文件。您可以使用 docker-compose up 运行具有_非 swarm_ 配置的版本 3 文件。
技术栈
技术栈是一组相关的服务,它们共享依赖项并且可以一起进行编排和扩展。单个技术栈能够定义和协调整个应用的功能(虽然很复杂的应用程序可能需要使用多个技术栈)。
特点
1、单个主机上多个隔离环境
2、创建容器时保留数据卷
3、仅创建已经修改的容器
4、通过变量来定制环境变量
docker-compose中的一些指令
1、build
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
- buildno: 1
- password=secret
cache_from:
- alpine:latest
- corp/web_app:3.14
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
context:说明dockerfile的路径
dockerfile:备用dockerfile,还必须指定构建路径
args:添加的构建参数
cache_from:所列出的镜像将被引擎用来缓存
labels:使用Docker标签将元数据添加到生成的图像中。您可以使用数组或字典
2、cap_add、cap_drop
添加或删除容器功能
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
3、command
覆盖默认command命令
command: bundle exec thin -p 3000
4、configs
在每个服务中使用configs为每个服务授予config权限,支持两种语法变体。
- SHORT SYNTAX
短语法变体仅指定配置名称。这将授予容器对配置的访问权限并将其挂载在容器的/<config_name>的目录下。源名称和目标安装点都设置为配置名称。
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
my_other_config被定义为外部资源,这意味着它已经在Docker中定义,可以通过运行docker config create命令或通过其他堆栈部署来定义。如果外部配置不存在,则堆栈部署将失败,并显示config not found错误
- LONG SYNTAX
长语法提供了在服务的任务容器中如何创建配置的更多粒度。
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
数字UID或GID,它将在服务的任务容器中拥有已安装的配置文件。如果未指定,则在Linux上默认为0。 Windows不支持。
mode:将以八进制表示法在服务的任务容器中装入的文件的权限。例如,0444表示世界可读。默认值为0444
5、cgroup_parent
为容器指定可选的父cgroup。
cgroup_parent: m-executor-abcd
6、container_name
指定自定义容器名称,而不是生成的默认名称。容器名应该唯一,不然无法扩展到外面去。
container_name: my-web-container
7、credential_spec
配置托管服务帐户的凭据规范(仅限Windows)
credential_spec:
file: c:/WINDOWS/my-credential-spec.txt
credential_spec:
registry: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
8、deploy
指定与部署和运行服务相关的配置。这仅在部署到具有docker堆栈部署的群集时生效,并且被docker-compose up和docker-compose run忽略。
version: '3'
services:
redis:
image: redis:alpine
deploy:
mode: global
replicas: 6
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
update_config:
parallelism: 2
delay: 10s
resources:
limits:
cpus: '0.001'
memory: 50M
reservations:
cpus: '0.0001'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
labels:
com.example.description: "This label will appear on the web service"
-
MODE
global(每个群集节点恰好一个容器)或replicated(指定数量的容器)。默认值global。 -
REPLICAS
如果mode是replicated,指定在任何给定时间应该运行的容器数。 -
PLACEMENT
指定放置约束。 -
UPDATE_CONFIG
配置服务应如何更新。用于配置滚动更新。
parallelism:一次更新的容器数。
delay:更新一组容器之间的等待时间。
failure_action:如果更新失败怎么办。继续或暂停之一(默认值:暂停)。
monitor:每次更新任务后的持续时间以监视失败(ns | us | ms | s | m | h)(默认为0)。
max_failure_ratio:更新期间容忍的失败率。
-
RESOURCES
配置资源限制。这将替换版本3之前的Compose文件中的旧资源约束选项(cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit,mem_swappiness) -
RESTART_POLICY
配置是否以及如何在容器退出时重新启动容器。替换restart.
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
condition:none,on-failure或any(默认值:any)之一。
delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
max_attempts:在放弃之前尝试重启容器的次数(默认值:never give up)。
window:在判断重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
- LABELS
指定服务的标签。这些标签只能在服务上设置,而不能在服务的任何容器上设置。
9、其他
build
cgroup_parent
container_name
devices
dns
dns_search
tmpfs
external_links
links
network_mode
security_opt
stop_signal
sysctls
userns_mode
10、devices
设备映射列表。使用与–device docker client create选项相同的格式。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
11、depends_on
服务之间的快速依赖关系,有两个影响:
- docker-compose up将按依赖顺序启动服务。在以下示例中,db和redis将在web之前启动。
- docker-compose up SERVICE将自动包含SERVICE的依赖项。在以下示例中,docker-compose up web还将创建并启动db和redis。
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
11、dns
自定义DNS服务器。可以是单个值或列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
12、dns_search
自定义DNS搜索域。可以是单个值或列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
13、tmpfs
在容器内安装临时文件系统。可以是单个值或列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
14、entrypoint
覆盖默认的entrypoint。可以是个列表
entrypoint: /code/entrypoint.sh
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
15、env_file
从文件添加环境变量。可以是单个值或列表。
如果已使用docker-compose -f FILE指定了Compose文件,则env_file中的路径相对于该文件所在的目录。
环境中指定的环境变量会覆盖这些值
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
如果您的服务指定了构建选项,则在构建期间,环境文件中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。
环境文件的顺序非常重要,当放在下面的文件中定义的变量在上面文件中已经定义过时,则下面的则会覆盖上面的。
16、environment
添加环境变量。您可以使用数组或字典。任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。
仅具有键的环境变量将解析为计算机正在运行的计算机上的值,这对于特定于机密或特定于主机的值很有用。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
如果您的服务指定了构建选项,则在构建期间,环境中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。
17、expose
暴露端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。
18、ports
暴露端口
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"
19、external_links
链接到此docker-compose.yml之外或甚至在Compose之外的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links遵循类似于遗留选项链接的语义。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
20、healthcheck
配置运行的检查以确定此服务的容器是否“健康”。
21、image
定义容器镜像
22、isolation
指定容器的隔离技术。在Linux上,唯一受支持的值是default。在Windows上,可接受的值是default,process和hyperv。有关详细信息
23、labels
使用Docker标签向容器添加元数据。您可以使用数组或字典。
24、links
链接到另一个服务中的容器。指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。
web:
links:
- db
- db:database
- redis
25、logging
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
max-size: "200k"
max-file: "10"
其中默认driver是json-file
driver: "json-file"
driver: "syslog"
driver: "none"
26、network_mode
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
27、networks
要加入的网络,引用顶级网络密钥下的条目。必须在全局的networks下有定义。
- ALIASES
网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。 - IPV4_ADDRESS, IPV6_ADDRESS
在加入网络时为此服务指定容器的静态IP地址。
version: '2.1'
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
-
subnet: 172.16.238.0/24
-
subnet: 2001:3984:3989::/64
28、extra_hosts
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
将在此服务的容器内的/ etc / hosts中创建具有ip地址和主机名的条目,例如:
162.242.195.82 somehost
50.31.209.229 otherhost
29、volumes
在全局volumes选项中定义了命名卷并且被其他服务卷列表所参考。命名卷必须在全局中有定义
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
name: actual-name-of-volume
-
driver
指定应为此卷使用哪个卷驱动程序。默认为Docker Engine配置使用的任何驱动程序,在大多数情况下是本地的。如果驱动程序不可用,则当docker-compose尝试创建卷时,Engine将返回错误。 -
driver_opts
将选项列表指定为键值对,以传递给此卷的驱动程序。
driver_opts:
foo: "bar"
baz: 1
- external
如果设置为true,则指定已在Compose之外创建此卷。 docker-compose up不会尝试创建它,如果它不存在则会引发错误。
external不能与其他卷配置键(driver,driver_opts)一起使用。
在下面的示例中,Compose不会尝试创建名为[projectname] _data的卷,而是查找仅称为数据的现有卷,并将其挂载到db服务的容器中。
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
您还可以在Compose文件中与用于引用它的名称分别指定卷的名称:
volumes:
data:
external:
name: actual-name-of-volume
- labels
使用Docker标签向容器添加元数据。您可以使用数组或字典。
建议您使用反向DNS表示法来防止标签与其他软件使用的标签冲突。
30、domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
每个都是单个值,类似于docker run对应物。
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true
read_only: true
shm_size: 64M
stdin_open: true
tty: true