常我们在编排一个容器的时候,最简单的方式就是使用docker-compose,compose是简单的将docker run的命令进行组织起来。而在docker早期的产品里面compose被收购后是很重要的一个环节。
当我们run一个容器的时候,一般而言,我们关注她的网络,持久化,资源情况
以rabbitmq为例,如下:
2.4版本
version: '2.4'
services:
rabbitmq:
image: rabbitmq:3.7.7-management
container_name: rabbitmq
restart: always
hostname: "rabbitmqA"
network_mode: "host"
environment:
- RABBITMQ_ERLANG_COOKIE="DSSOQQK1"
- RABBITMQ_DEFAULT_USER=linuxea
- RABBITMQ_DEFAULT_PASS=DSSOQQK1PASSWORD
- RABBITMQ_DEFAULT_VHOST="/"
volumes:
- /data/rabbitmq/data:/var/lib/rabbitmq
- /data/rabbitmq/rabbitmq_delayed_message_exchange-3.8.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.8.0.ez
mem_limit: 2048m
如上,我们关注几个配置项目
restart: always: 配置了容器重启策略,如果不配置此项,在docker被重启后,容器未必会被拉起。
container_name: 运行的容器命名
hostname: 容器的主机名
network_mode: 当被配置"host"的时候,docker不会隔离网络名称空间,这是最简单粗暴也有效的方式。我喜欢这样使用,特别是在你用iptables的时候
mem_limit: 在2.4的版本中mem_limit是用来限制内存大小的选项,不限制则使用所有了
查看rabbitmq状态
[root@test rabbitmq]
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5c1aed8e7ce5 rabbitmq 0.00% 42.66MiB / 2GiB 2.08% 0B / 0B 0B / 32.8kB 43
3版本
version: '3'
services:
rabbitmq:
image: rabbitmq:3.7.7-management
container_name: rabbitmq
restart: always
hostname: "rabbitmqA"
network_mode: "host"
environment:
- RABBITMQ_ERLANG_COOKIE="DSMAOMOXML"
- RABBITMQ_DEFAULT_USER=mark
- RABBITMQ_DEFAULT_PASS=E4OWYyNj11SXOA
- RABBITMQ_DEFAULT_VHOST="/"
volumes:
- /data/rabbitmq/data:/var/lib/rabbitmq
- /data/rabbitmq/rabbitmq_delayed_message_exchange-3.8.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.8.0.ez
deploy:
resources:
limits:
cpus: '0.5'
memory: 2048m
reservations:
cpus: '1'
memory: 2048m
而在compose3版本中更倾向对集群的使用了,从而资源限制的方式也变了。
2.4到3版本并不是一个2.4到3的平滑升级,3对于docker公司来说是另外一个商业计划。这样来理解,相信你已经明白了
deploy:
resources:
limits:
cpus: '0.5'
memory: 2048m
reservations:
cpus: '1'
memory: 2048m
如上,我们在限制内存的时候使用的是0.5。
要理解CPU限制为什么是0.5CPUS,以及了解CFS调度。
我们最快的方式查看docker官网的
configure-the-default-cfs-scheduler解释
--cpus=: 指定容器可以使用多少可用 CPU 资源。例如,如果主机有两个 CPU 并且您设置了--cpus="1.5",则容器最多保证一个半 CPU。这相当于设置--cpu-period="100000"和--cpu-quota="150000"。
如果你只有1个CPU,配置是0.5的时候,就是使用一半的CPU,50%,1个CPU的整个是100%
CPU的限制实际上有很多,你甚至可以限制它运行在某一颗上
另外,之所以内存的reservations和limits是一样,是为了减少内存回收可能产生的比必要的问题,所以请求和限制设置是一样的。而CPU我们是可压缩的,所以我们可以灵活的进行配置
https://docs.docker.com/compose/compose-file/compose-file-v2/#restart
[root@test rabbitmq]# docker stats rabbitmq
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a46e89266a99 rabbitmq 0.00% 102.3MiB / 2GiB 5.00% 0B / 0B 0B / 90.1kB 162
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a46e89266a99 rabbitmq 0.00% 102.3MiB / 2GiB 5.00% 0B / 0B 0B / 90.1kB 162
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a46e89266a99 rabbitmq 0.13% 102MiB / 2GiB 4.98% 0B / 0B 0B / 90.1kB 162