Rede Docker e controle de ocupação de recursos de hardware Cgroup

Índice

1. Modo de rede do Dockers

 1.1 Obtenha o número do processo do contêiner

1.2 Características do modo de rede docker 

1.3 modo host

 1.4 modo contêiner

 1.5 nenhum modo

1.6 modo ponte ponte

1.6 Rede personalizada para contêineres 

 (1) Quando nenhuma rede personalizada for criada, crie um teste do contêiner IP especificado

(2) Crie uma rede docker personalizada 

Exclua uma rede personalizada:

1.7 Experiência de produção de rede de contêineres Docker

2. Controle de recursos de contêineres Docker

3. Limitações no uso da CPU do host pelo docker

3.1 Limite superior de uso da CPU

(1) CPU normalmente habilitada, limite superior de uso de teste

(2) Modifique a regra de limite superior de divisão de tempo do contêiner padrão e crie um teste de inicialização novamente

(3) Especifique o limite superior de uso de recursos de CPU do contêiner ao criar um contêiner 

(4) O limite superior de uso de contêineres de alocação de múltiplas CPUs

3.2 Defina a proporção de uso de recursos da CPU 

Nota: Este método só terá efeito se vários contêineres forem configurados. 

3.3 Defina o contêiner para vincular a CPU especificada 

Veja o número da CPU no host 

Vincule o núcleo para criar um contêiner

 4. Limitações no uso de memória

4.2 Limite o tamanho de swap disponível para contêineres 

5. Limitações no controle de configuração de E/S de disco (blkio) 

5.1 Velocidade de gravação do contêiner por padrão 

5.2 Criação de contêiner com limite de velocidade de gravação 

6. Limpe o espaço em disco ocupado pelo docker

 Resumir

 1. Controle do modo de rede

2. Parâmetros de restrição para CPU

3. Limitações de memória

4. Restrições de E/S de disco



modo de rede

 1.1 Obtenha o número do processo do contêiner


docker inspect -f '{
   
   {.State.Pid}}' 容器id/容器名

1.2  Características do  modo de rede docker

 Existem três modos de rede padrão no estado inicial do docker:

  • ponte (ponte)
  • hospedar
  • nenhum (sem configurações de rede)
docker network  ls

1.3 modo host

  • Equivalente ao modo bridge no VMware, está na mesma rede do host, mas não possui endereço IP independente. Docker usa a tecnologia Namespaces do Linux para isolamento de recursos, como processo de isolamento de Namespace PID, sistema de arquivos de isolamento Mount Namespace, rede de isolamento de Namespace de rede, etc. Um Namespace de Rede fornece um ambiente de rede independente, incluindo placas de rede, roteamento, regras iptable, etc., que são isolados de outros Namespaces de Rede. Um contêiner Docker geralmente receberá um Network.Namespace independente.
  • Mas se você usar o modo host ao iniciar o contêiner, o contêiner não obterá um Namespace de Rede independente, mas compartilhará um Namespace de Rede com o host. O contêiner não irá virtualizar sua própria placa de rede, configurar seu próprio IP, etc., mas usará o IP e a porta do host.
  • O contêiner e o host compartilham o namespace da rede, mas não têm endereços IP independentes. Eles usam o endereço IP do host e compartilham o intervalo de portas com o host. Por exemplo, se o host usar a porta 80, o contêiner não poderá usar a porta 80. Este modo é mais conveniente, mas não seguro

#创建容器web1,指定网络模式为 host
 #容器和宿主机共享网络命名空间,但没有独立IP地址。使用宿主机的IP,和宿主机共享端口范围。
 docker run -d --name web1 --net=host nginx
 ​
 #访问宿主机的ip和80端口,则可以访问到tt1的nginx服务
 curl http://192.168.181.100:80

  

 1.4 modo contêiner

Depois de compreender o modo host, este modo será mais fácil de entender. Este modo especifica que o contêiner recém-criado compartilha um Namespace de Rede com um contêiner existente, em vez de compartilhá-lo com o host. O contêiner recém-criado não criará sua própria placa de rede e configurará seu próprio IE, mas compartilhará re, intervalo de portas, etc. com um contêiner especificado. Da mesma forma, além da rede, os dois contêineres também estão isolados em outros aspectos, como sistemas de arquivos, listas de processos, etc. Os processos dos dois contêineres podem se comunicar através do dispositivo de placa de rede.

O contêiner B e o contêiner A recém-criados compartilham o namespace. Se o contêiner A usar a porta 80, o contêiner B não poderá usar a porta 80.

#基于镜像centos:7 创建一个名为web2的容器
docker run -itd --name web2 centos:7 /bin/bash
#查看容器web2的pid号
docker inspect -f '{
   
   {.State.Pid}}' web2
ls -l /proc/web2的pid/ns
 
#创建web3容器,使用container网络模式,和web2共享网络命名空间
docker run -itd --name web3 --net=container:web2 centos:7 bash
#查看web3容器的pid
docker inspect -f '{
   
   {.State.Pid}}' web3
ls -l /proc/web3的pid/ns/
#可以看到web3和web2共享同一个网络命名空间

 1.5 nenhum modo

Usando o modo nenhum, o contêiner do Docker tem seu próprio namespace de rede, mas nenhuma configuração de rede é executada para o contêiner do Docker. Ou seja, esse container locker não possui placa de rede, IP, roteamento e outras informações. Neste modo de rede, o contêiner possui apenas a rede de loopback lo e nenhuma outra placa de rede. Este tipo de rede não pode ser conectada à Internet. Uma rede fechada pode garantir a segurança do contêiner.

1.6  modo ponte ponte

 O modo Bridge é o modo de rede padrão do Docker. Sem o parâmetro --net, é o modo Bridge.

Equivalente ao modo nat no VMware, o contêiner usa um namespace .network independente e está conectado à placa de rede virtual do docker. Via ponte dockerO e iptables

A configuração da tabela nat se comunica com o host. Este modo aloca hetwork Mamespace, configurações, etc. para cada contêiner e conecta um contêiner Docker no host a uma ponte virtual.

 (1) Quando o processo Docker for iniciado, uma ponte virtual chamada docker0 será criada no host e o contêiner Dokcer iniciado neste host se conectará a esta ponte virtual. Uma ponte virtual funciona de forma semelhante a um switch físico, de modo que todos os contêineres no host sejam conectados a uma rede de Camada 2 por meio do switch.

(2) Atribua um IP da sub-rede docker0 ao contêiner e defina o endereço I do dockerO como o gateway padrão do contêiner. Crie um par de placas de rede virtuais com dispositivos emparelhados no host. Os dispositivos Veth sempre aparecem em pares. Eles formam um canal de dados. Os dados que entram de um dispositivo sairão de outro dispositivo. Portanto, os dispositivos veth são frequentemente usados ​​para conectar dois dispositivos de rede.

(3) O Docker coloca uma extremidade do dispositivo do par veth no contêiner recém-criado e o nomeia como eth0 (a placa de rede do contêiner), e a outra extremidade no host, nomeia-o com um nome semelhante como veth* e adiciona esta rede dispositivo para a ponte docker0. Você pode visualizá-lo através do comando brctl show.

(4) Ao usar docker run -p, o docker realmente cria regras DNAT em iptables para implementar a função de encaminhamento de porta. Você pode usar iptables -t nat -vnL para visualizar.


[root@localhost opt]#docker run -id --name c1  centos:7
[root@localhost opt]#docker run -id --name c2  centos:7
[root@localhost opt]#docker run -id --name c3  centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker run -id --name c4  -p 8080:80 centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker ps -a

1.6 Rede personalizada para contêineres 

ifconfig docker0

 (1) Quando nenhuma rede personalizada for criada, crie um teste do contêiner IP especificado

Como especificar o IP do contêiner: 

Nota: A criação de um contêiner com um IP especificado também requer um segmento de rede IP baseado na placa de rede do Docker. 

docker run -id --name a1 --ip 192.168.181.100   806c77e62cdd
ping 192.168.181.100
docker run -id --name a2 --network bridge --ip 192.168.181.100   806c77e62cdd

(2) Crie uma rede docker personalizada 

 Crie uma rede personalizada:

docker network create --subnet=192.168.181.100/24 --opt "com.docker.network.bridge.name"="docker1" mynetwork

 Crie um contêiner com o IP especificado novamente:

docker run -id --net=mynetwork --ip 1792.168.181.100 --name a3 centos:7
ping 192.168.181.100

Exclua uma rede personalizada:

如果想要删除自定义的网络,可以使用 docker network rm 网络模式名称 进行删除,例如docker network rm mynetwork。

 删除网络模式前,需要先确保使用该网络模式创建的容器已退出(即已停止)。如果容器仍在运行,则该网络无法删除。

1.7 Experiência de produção de rede de contêineres Docker

# daemon.json 配置介绍
 {
  "graph": "/data/docker",
  "storage-driver": "overlay2",
  "insecure-registries": ["registry.access.redhat.com", "quay.io"],
  "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
  "bip": "172.168.181.1/24",       #指定网桥的网段,这里不能写0,必须写1
  "exec-opts": ["native. cgroupdriver= systemd"],
  "live-restore": true
 }
 ​
 #配置项注意点:
 ● graph:该关键字未来将被弃用,可以采用"data-root" 替代。
 ● storage-driver:存储驱动,即分层文件系统。
 ● insecure-registries:不安全的docker registries, 即使用http协议推拉镜象。
 ● registry-mirrors:加速站点,一般可以使用阿里、网易云、docker中国 (https: //registry.docker-cn.com)的地址。
 ● bip:指定doccer bridge地址(不能以.0结尾),生产中建议采用172.xx.yy.1/24,其中xx. yy为宿主机ip后四位,方便定位问题。
 ● 若启动失败,查看/var/log/message 日志排错。
 ● live-restore:启用实时还原。
 默认情况下,当Docker守护程序终止时,它将关闭正在运行的容器。从Docker Engine 1.12开始,您可以配置守护程序,以便在守护程序不可用时容器仍在运行。此功能称为实时还原。实时还原选项有助于减少由于守护程序崩溃,计划内的停机或升级而导致的容器停机时间。
 ​
 ​
 #使用配置文件/etc/docker/daemon.json (没有时新建该文件)
 vim /etc/docker/daemon.json
 {
 " insecure-registries": ["172.168.181.7:65500"],
 "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
 "live-restore": true
 }

2. Controle de recursos de contêineres Docker

Docker usa Cgroup para controlar as cotas de recursos usadas pelos contêineres, incluindo CPU, memória e disco, que basicamente cobrem cotas de recursos comuns e controles de uso. Caroup é a abreviatura de ControlGroups. É um mecanismo fornecido pelo kernel Linux que pode limitar, registrar e isolar os recursos físicos (como CPU, memória, disco, io, etc.) usados ​​por grupos de processos. É usado por muitos projetos, como LXC e docker.Implementam o controle de recursos do processo. O próprio Cgroup é a infraestrutura que fornece funções e interfaces para gerenciamento de agrupamento de processos. O gerenciamento de recursos específicos, como E/S ou controle de alocação de memória, é obtido por meio desta função.

  • Limites de recursos: você pode limitar o total de recursos usados ​​por uma tarefa.
  • Alocação de prioridade: Ao atribuir o número de intervalos de tempo da CPU e a largura de banda de E/S do disco, é na verdade equivalente a controlar a prioridade de execução da tarefa.
  • Estatísticas de recursos: você pode contar o uso de recursos do sistema, como tempo de CPU, uso de memória, etc.
  • Controle de tarefas: cgroup pode realizar operações como suspender e retomar tarefas.

3. Limitações no uso da CPU do host pelo docker

3.1 Limite superior de uso da CPU

O Linux usa CFS (Completely Fair Scheduler) para agendar o uso do CEU por cada processo. O período de agendamento padrão do CFS é 100ms. Podemos definir o ciclo de agendamento de cada processo de contêiner e a quantidade máxima de tempo de CPU que cada contêiner pode usar durante esse ciclo.

 Use --cpu-period para definir o período de agendamento e use --cpu-quota para definir o tempo de CPU que o contêiner pode usar em cada ciclo. Ambos podem ser usados ​​juntos. O intervalo válido do período CFS é 1ms~1s, e o intervalo de valores correspondente de --cpu-period é 1000~1000000. A cota de CPU do contêiner não deve ser inferior a 1ms, ou seja, o valor de --cpu-quota deve ser >= 1000. A cota de CPU do contêiner não deve ser inferior a 1ms, ou seja, o valor de --cpu-quota deve ser >= 1000.

(1) CPU normalmente habilitada, limite superior de uso de teste


#正常创建容器(此时容器遵循默认的占用cpu资源规则)
[root@localhost ~]#docker run -id --name c1 centos:7
 
[root@localhost ~]#docker ps -a
 
[root@localhost ~]#docker exec -it c1 bash
 
[root@d6da0a6b999a /]# vi cpu.sh
 
#!/bin/bash
i=0
while true
do
let i++
done
 
 
[root@d6da0a6b999a /]# chmod +x cpu.sh 
 
[root@d6da0a6b999a /]# ./cpu.sh

如果在创建容器时不限制它cpu使用的限制,是非常危险的一件事,一旦某个容器的程序异常陷入死循环,将直接导致其他容器中业务的中断 

(2) Modifique a regra de limite superior de divisão de tempo do contêiner padrão e crie um teste de inicialização novamente

docker start c1
docker ps -a
#d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04为容器id
cd/sys/fs/cgroup/cpu/docker/d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04
 
[root@localhost d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04]#echo 50000 > cpu.cfs_quota_us

(3) Especifique o limite superior de uso de recursos de CPU do contêiner ao criar um contêiner 


docker run -id --name c2 --cpu-quota 30000 centos:7
[root@localhost docker]#docker exec -it c2 bash
[root@10cfa036ff07 /]# vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@10cfa036ff07 /]# vi cpu.sh
[root@10cfa036ff07 /]# chmod +x cpu.sh 
[root@10cfa036ff07 /]# ./cpu.sh

(4) O limite superior de uso de contêineres de alocação de múltiplas CPUs

[root@localhost docker]#docker run -id --name c3 centos:7
 
[root@localhost docker]#docker ps -a
 
[root@localhost docker]#cd /sys/fs/cgroup/cpu/docker/a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a/
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#ls
 
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#echo 200000 >  cpu.cfs_quota_us


[root@localhost ~]#docker exec -it c3 bash
[root@a1ce6948cdb6 /]# vi cpu.bash
#!/bin/bash
i=0
while true
do
let i++
done
[root@a1ce6948cdb6 /]# chmod +x ./cpu.bash 
[root@a1ce6948cdb6 /]# ./cpu.bash 

3.2 Defina a proporção de uso de recursos da CPU 

Nota: Este método só terá efeito se vários contêineres forem configurados. 

Ao criar um contêiner, você pode usar a opção --cpu-shares value (o valor deve ser um múltiplo de 1024, 1024 representa um compartilhamento. Quando a parcela da CPU ocupada por um contêiner é dividida pela parcela da CPU ocupada por todos os contêineres, é a porcentagem de recursos de CPU ocupados pelo contêiner)

进行分配:

[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7
 
[root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7
 
[root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7
 

Abra três terminais e inicie o teste de estresse do contêiner:


#三个容器均为以下压测操作
#下载压测工具依赖环境
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 4
 
 
#再开启一个终端查看测试结果
docker stats
  • A partir dos resultados do teste, podemos ver que quando a CPU aloca intervalos de tempo, o contêiner b1 tem duas vezes mais chance de obter o intervalo de tempo da CPU do que os contêineres b2 e b3. No entanto, o resultado da alocação depende do status de execução do host e de outros contêineres naquele momento. Na verdade, não há garantia de que os contêineres b2 e b3 obterão definitivamente o intervalo de tempo da CPU.
  • Por exemplo, os processos dos contêineres b2 e b3 estão sempre ociosos, então o contêiner b1 pode obter mais intervalos de tempo de CPU do que os contêineres b2 e b3. Em casos extremos, por exemplo, se apenas um contêiner estiver em execução no host, mesmo que seu compartilhamento de CPU seja de apenas 50, ele poderá monopolizar todos os recursos de CPU do host.
  •  Os Cgroups só entram em vigor quando os recursos alocados pelo contêiner são escassos, ou seja, quando é necessário limitar os recursos utilizados pelo contêiner. Portanto, não é possível determinar quantos recursos de CPU estão alocados para um contêiner com base apenas no seu compartilhamento de CPU. O resultado da alocação de recursos depende da alocação de CPU de outros contêineres em execução ao mesmo tempo e das condições de execução dos processos no recipiente.

3.3 Defina o contêiner para vincular a CPU especificada 

Veja o número da CPU no host 

top   
按数字“1”

Vincule o núcleo para criar o contêiner 

[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7

teste de pressão:

yum install -y epel-release
yum insatll -y stress
 
stress -c 1

 Resultado dos testes:

 4. Limitações no uso de memória

A opção m (ou --memory=) é usada para limitar a memória máxima que um contêiner pode usar 

docker run -itd --name d1 -m 512m centos:7 /bin/bash
docker  stats

4.2 Limite o tamanho de swap disponível para contêineres 

#Limite o tamanho de swap disponível, --memory-swap  

●Enfatize que --memory-swap deve ser usado junto com --memory (ou -m).

●Normalmente, o valor de --memory-swap inclui a memória disponível e a troca disponível do contêiner.

●Então -m 300m --memory-swap=1g significa: o contêiner pode usar 300M de memória física e pode usar 700M (1G - 300M) de swap. Se definido como 0 ou não definido, o tamanho de troca que o contêiner pode usar é o dobro do valor -m. Se o valor de --memory-swap for igual ao valor de -m, o contêiner não poderá usar swap. Se o valor --memory-swap for -1, significa que a memória usada pelo programa contêiner é limitada, mas o espaço de troca que pode ser usado não é limitado (tantos contêineres de troca quantos houver na máquina host podem ser usado).

 #--memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。
 #表示容器可以使用512M的物理内存,并且可以使用512M的swap。因为1g减去512m的物理内存,剩余值才是可用swap。
 docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash
 ​
 ​
 #--memoryswap值和 -m 的值相同,表示容器无法使用swap
 docker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash
 ​
 ​
 # --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
 docker run -itd --name d4 -m 512m centos:7 bash
 ​
 ​
 # --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。
 docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash
 

5. Limitações no controle de configuração de E/S de disco (blkio) 

  • -device-read-bps: Limita a velocidade de leitura em bps (volume de dados) em um determinado dispositivo, a unidade pode ser kb, mb (M) ou gb.
  • --device-write-bps: Limita a velocidade de gravação em bps (volume de dados) em um determinado dispositivo, a unidade pode ser kb, mb (M) ou gb.
  • A velocidade refere-se a operações de leitura e gravação de 1M, 1G ou 1kb por segundo. 
  • --device-read-iops: Limita os iops (número de vezes) de leitura de um dispositivo
  • --device-write-iops: Limita os iops (número de vezes) gravados em um dispositivo

5.1 Velocidade de gravação do contêiner por padrão 

[root@localhost ~]#docker run -id --name e1  centos:7
[root@localhost ~]#docker exec -it e1 bash
[root@8657384cb483 /]# dd if=/dev/zero  of=/opt/test.txt bs=10M count=5 oflag=direct
## oflag=direct 规避文件读写系统中所带来的缓存,避免影响测试结果

5.2 Criação de contêiner com limite de velocidade de gravação 

 
[root@localhost ~]#docker run -it --name e3 --device-write-bps /dev/sda:1M centos:7 /bin/bash
[root@6c1b8bcf6b44 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct

6. Limpe o espaço em disco ocupado pelo docker

docker system prune -a pode ser usado para limpar o disco e excluir contêineres fechados, volumes de dados inúteis e redes.

docker system prune -a 

 Resumir

 1. Controle do modo de rede

 ########映射端口 -P为随机 -p为指定端口#################
docker run -itd  --name=为容器指定名称 -P 镜像名称
docker run -itd --name=为容器指定名称 -p 宿主机端口:容器端口 镜像名称
 
 
##############指定网络模式##########################
 #使用docker' run 创建Docker容器时,可以用--net 或--network 选项指定容器的网络模式
 ●host模式:使用 --net=host 指定。
 ●none模式:使用 --net=none 指定。
 ●container模式:使用--net=container:NAME/ID指定。
 ●bridge模式:使用 --net=bridge 指定,默认设置,可省略。
 
############自定义网络####################################
注意:只要自定义网络在创建容器时才能指定IP(必须是自定义网段中的IP)
#创建自定义网络
 docker network create --subnet=网段 --opt "com.docker.network.bridge.name"="网卡名" 自定义网络的名称
 
#使用自定义网络
 docker run -itd --name 容器名 --net 自定义网路名 --ip 自定义网路网段范围内的IP  centos:7 /bin/bash
 
#删除自定义网络
docker network rm 网络模式名称
 
 

2. Parâmetros de restrição para CPU

 docker run --cpu-period     #设置调度周期时间1000~1000000
            --cpu-quota      #设置容器进程的CPU占用时间,要与调度周期时间成比例
            --cpu-shares    #设置多个容器之间的CPU资源占用比
            --cpuset-cpus   #绑核(第一个CPU编号从0开始)

3. Limitações de memória

 -m 物理内存 [--memory-swap=总值]

4. Restrições de E/S de disco

 --device-read-bps 设备文件:1mb/1M     #限制读速度
 --device-write-bps 设备文件:1mb/1M    #限制写速度
 --device-read-iops                   #限制读次数
 --device-write-iops                  #限制写次数
 ​
 docker system prune -a    #清理磁盘,删除关闭的容器、无用的数据卷和网络。

Acho que você gosta

Origin blog.csdn.net/Sp_Tizzy/article/details/132339807
Recomendado
Clasificación