转载

docker-compose2和3的常用参数和资源限制

常我们在编排一个容器的时候,最简单的方式就是使用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]# docker stats 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
正文到此结束
Loading...