Rede Docker e controle de recursos

Índice

1. Princípio de implementação da rede Docker

1. Modo de rede Docker

1.1 Ver lista de redes docker

 A opção 1.2 especifica o modo de rede do contêiner

2. Explicação detalhada do modo de rede

2.1 modo host

①modo host

 editar

②modo contêiner

③nenhum modo

editar

④ modo ponte

editar

⑤Rede personalizada

6. Controle de recursos

6.1cgroups tem quatro funções principais

6.2 Defina o limite superior de uso da CPU

6.3 Realizar teste de estresse da CPU

6.4 Definir a proporção de uso de recursos da CPU (válido apenas quando vários contêineres são definidos)

6.4 Defina o contêiner para vincular a CPU especificada


1. Princípio de implementação da rede Docker

Docker usa ponte Linux para virtualizar uma ponte de contêiner Docker (docker0) na máquina host. Quando o Docker inicia um contêiner, ele atribuirá um endereço IP ao contêiner de acordo com o segmento de rede da ponte Docker, chamado Container-IP, e o A ponte Docker é todo o gateway padrão para cada contêiner. Como os contêineres no mesmo host estão conectados à mesma ponte, os contêineres podem se comunicar diretamente por meio do Container-IP do contêiner.

A ponte Docker é virtualizada pelo host, não por um dispositivo de rede real. A rede externa não pode ser endereçada, o que também significa que a rede externa não pode acessar diretamente o contêiner através do Container-IP. Caso o container queira ser acessado por acesso externo, ele pode ser acessado mapeando a porta do container para o host host (mapeamento de porta), ou seja, quando docker run cria o container, ele é habilitado pelo parâmetro -p ou -P , e ao acessar o container, ele passa [host IP]: [container port] para acessar o container.

docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)

docker run -d --name test2 -p 43000:80 nginx		#指定映射端口

 

docker ps -a

 Acesso pelo navegador: http:192.168.237.21:32769

1. Modo de rede Docker

Hospedar 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.
Recipiente O contêiner criado não criará sua própria placa de rede e configurará seu próprio IP, mas compartilhará o IP e o intervalo de portas com um contêiner especificado.
Nenhum Este modo desativa os recursos de rede do contêiner.
Ponte O padrão é este modo, que alocará e definirá o IP para cada contêiner, conectará o contêiner a uma ponte virtual docker0 e se comunicará com o host por meio da ponte docker0 e da configuração da tabela nat iptables.
rede personalizada Você pode personalizar o endereço IP

1.1 Ver lista de redes docker

 A opção 1.2 especifica o modo de rede do contêiner

 ●modo host: Use --net=host para especificar.

● modo none: Use --net=none para especificar.

●modo contêiner: Use --net=container:NAME_or_ID para especificar.

●modo bridge: Use --net=bridge para especificar a configuração padrão, que pode ser omitida.

2. Explicação detalhada do modo de rede

2.1 modo host

①modo host

Equivalente ao modo bridge no VMware, está na mesma rede da máquina host, mas não possui endereço IP independente. Docker usa a tecnologia Linux Namespaces para isolar 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, rotas, regras iptable, etc., que são isolados de outros Namespaces de Rede. Um contêiner Docker geralmente recebe um namespace de rede independente. No entanto, se o modo host for usado 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.

 

②modo contêiner

Depois de compreender o modo host, este modo é fácil de entender. Este modo especifica que um 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, configurará seu próprio IP, mas compartilhará o IP, intervalo de portas, etc. com um contêiner especificado. Da mesma forma, além dos aspectos de rede dos dois contêineres, outras coisas, como sistemas de arquivos e listas de processos, ainda estão isoladas. Os processos dos dois contêineres podem se comunicar através do dispositivo de placa de rede.

docker run -itd --name test1 centos:7 /bin/bash #--name 选项可以给容器创建一个自定义名称

docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ed82355f811 centos:7 "/bin/bash" 5 days ago Up 6 hours test1

docker inspect -f '{
   
   {.State.Pid}}' 3ed82355f811 #查看容器进程号 25945

ls -l /proc/25495/ns #查看容器的进程、网络、文件系统等命名空间编号 
lrwxrwxrwx 1 root root 0 1月 7 11:29 ipc -> ipc:[4026532572] 
lrwxrwxrwx 1 root root 0 1月 7 11:29 mnt -> mnt:[4026532569]
lrwxrwxrwx 1 root root 0 1月 7 11:27 net -> net:[4026532575] 
lrwxrwxrwx 1 root root 0 1月 7 11:29 pid -> pid:[4026532573] 
lrwxrwxrwx 1 root root 0 1月 7 12:22 user -> user:[4026531837] 
lrwxrwxrwx 1 root root 0 1月 7 11:29 uts -> uts:[4026532570]
docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash docker

ps -a

③nenhum modo

No modo nenhum, o contêiner do Docker possui seu próprio namespace de rede, mas não executa nenhuma configuração de rede para o contêiner do Docker. Ou seja, este contêiner Docker 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, e uma rede fechada pode garantir a segurança do contêiner.

④ modo 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 de rede independente e se conecta à placa de rede virtual docker0. Configure a comunicação com o host por meio da ponte docker0 e da tabela iptables nat. Este modo alocará o namespace da rede, definirá o IP, etc. para cada contêiner e conectará um contêiner Docker em um host a uma ponte de rede virtual.

(1) Quando o processo Docker for iniciado, uma ponte de rede virtual chamada docker0 será criada no host e o contêiner Docker iniciado neste host será conectado a esta ponte virtual. O modo de funcionamento da ponte virtual é semelhante ao de 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 IP do docker0 como o gateway padrão do contêiner. Crie um par de NIC virtual com dispositivos de par no host. Os dispositivos Veth sempre aparecem em pares. Eles formam um canal de dados. Os dados que entram de um dispositivo sairão do outro dispositivo. Portanto, vários dispositivos são frequentemente usados ​​para conectar dois dispositivos de rede.

(3) O Docker coloca uma extremidade do dispositivo veth pair no contêiner recém-criado e o nomeia eth0 (a placa de rede do contêiner) e coloca a outra extremidade no host, nomeado com um nome semelhante como *, e adiciona este dispositivo de rede na ponte docker0. Ele pode ser visualizado através do comando brctl show. veth

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

⑤Rede personalizada

#O uso direto do modo bridge não pode suportar o IP especificado para executar o docker. Por exemplo, se você executar o seguinte comando, um erro será relatado docker run -itd --name test3 --network bridge --ip 172.17.0.10 centos: 7 /bin/bash

//创建自定义网络 #可以先自定义网络,再使用指定IP运行docker

docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。

#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。

docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

6. Controle de recursos

Cgroups de controle de recursos da CPU é uma ferramenta de kernel Linux muito poderosa, que pode não apenas limitar recursos isolados por namespace, mas também definir pesos para recursos, calcular o uso, controlar o início e a parada do processo e assim por diante. Assim cgroups (grupos de controle) realizam a cota e medição de recursos.

6.1cgroups tem quatro funções principais

●Limite de recursos: você pode limitar a quantidade total de recursos usados ​​pela tarefa

● Alocação de prioridade: através do número de intervalos de tempo de CPU alocados e do tamanho da 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 duração da CPU, uso de memória, etc.

●Controle de tarefas: cgroup pode realizar operações como suspender e retomar tarefas

100.000 1 50.000 0,5

6.2 Defina o limite superior de uso da CPU

Linux usa CFS (Completely Fair Scheduler) para agendar o uso da CPU de cada processo. O período de agendamento padrão do CFS é 100 ms. Podemos definir o ciclo de agendamento de cada processo de contêiner e quanto tempo de CPU cada contêiner pode usar no máximo 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 período. Os dois podem ser usados ​​juntos. O intervalo efetivo do período CFS é de 1ms a 1s e o intervalo de valores correspondente de --cpu-period é de 1000 a 1000000. O período é de 100 milissegundos e a cota de CPU do contêiner não deve ser inferior a 1ms, ou seja, o valor de --cpu-quota deve ser >= 1000.

docker run -itd --name test5 centos:7 /bin/bash

docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ed82355f811 centos:7 "/bin/bash" 5 days ago Up 6 hours test5

cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/ cat cpu.cfs_quota_us -1

cat cpu.cfs_period_us

100000

#cpu.cfs_period_us: O período de alocação da CPU (microssegundos, portanto o nome do arquivo é representado por nós), o padrão é 100000.

#cpu.cfs_quota_us: Indica o tempo (em microssegundos) que leva o limite de cgroups, e o padrão é -1, o que significa sem limite . Se estiver definido como 50.000, significa que 50.000/100.000 = 50% da CPU está ocupada.

6.3 Realizar teste de estresse da CPU

docker exec -it 3ed82355f811 /bin/bash vim /cpu.sh #!/bin/bash i=0 while true deixe i++ pronto

chmod +x /cpu.sh ./cpu.sh

principal

#Você pode ver que este script ocupa muitos recursos da CPU

#Defina uma proporção de 50% para alocar o limite superior de tempo de uso da CPU

docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash

#Você pode recriar um contêiner e definir uma cota ou cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/ echo 50000 > cpu.cfs_quota_us docker exec -it 55 3ed82 3f811 /bin/bash./cpu.sh

principal

#Você pode ver que a taxa de uso da CPU está próxima de 50%, os cgroups afetam o controle da CPU

6.4 Definir a proporção de uso de recursos da CPU (válido apenas quando vários contêineres são definidos)

Docker especifica o compartilhamento da CPU por meio de --cpu-shares, o valor padrão é 1024 e o valor é um múltiplo de 1024. #Crie dois contêineres como c1 e c2. Se houver apenas esses dois contêineres, defina o peso do contêiner para que os recursos da CPU de c1 e c2 representem 1/3 e 2/3.

docker run -itd --name c1 --cpu-shares 512 centos:7 docker run -itd --name c2 --cpu-shares 1024 centos:7

Entre no recipiente separadamente para teste de pressão

yum install -y epel-release yum install -y estresse estresse -c 4

# Gere quatro processos, cada um dos quais calcula repetidamente a raiz quadrada do número aleatório

#Ver o status de execução do contêiner (atualização dinâmica)

estatísticas do docker

6.4 Defina o contêiner para vincular a CPU especificada

#先分配虚拟机4个CPU核数 
docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

#进入容器,进行压力测试 
yum install -y epel-release yum install stress -y stress -c 4

#退出容器,执行 top 命令再按 1 查看CPU使用情况。

Limitação no uso de memória //-m(--memory=) opção é usada para limitar a memória máxima que o contêiner pode usar

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

estatísticas do docker

//Limite o tamanho de swap disponível, --memory-swap Enfatize que --memory-swap deve ser usado junto com --memory.

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 - 300) de troca.

Se --memory-swap estiver definido como 0 ou não definido, o contêiner poderá usar o dobro do tamanho de troca 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 e o espaço de troca disponível não é limitado (o host pode usar quantos contêineres de troca houver).

3. Restrições ao controle de cota de IO de disco (blkio) --device-read-bps: limita a velocidade de leitura em bps (volume de dados) em um determinado dispositivo, e a unidade pode ser kb, mb(M) ou gb. Exemplo: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash

--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. exemplo:

docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash

--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

#Crie um contêiner e limite a velocidade de gravação

docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash

#Verifique a velocidade de gravação por dd

dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

#Adicione o parâmetro oflag para evitar o sistema de arquivos

armazenar em cache 10+0 registros em 10+0 registros com 10485760 bytes (10 MB) copiados, 10,0025 s, 1,0 MB/s

#Limpe o espaço em disco ocupado pelo docker docker system prune -a #Pode ser usado para limpar o disco, excluir contêineres fechados, volumes de dados inúteis e redes

Falha na expansão de produção: um grande número de logs está cheio devido à falha do contêiner do docker, o que fará com que o espaço em disco fique cheio. Solução 1. Limpar logs

#!/bin/bash logs=$ (find /var/lib/docker/containers/ -name -json.log ) para login $logs do cat /dev/null > $log concluído

2. O que fazer quando o log estiver cheio ###Defina o número de arquivos de log do docker e o tamanho de cada log vim /etc/docker/daemon.json { "registry-mirrors": [" http ://f613ce8f . m.daocloud.io "], "log-driver": "json-file",

#Meu único formato de log "log-opts": { "max-size" : "500m", "max-file" : "3"} O parâmetro máximo do log é 500M. Existem três arquivos de log em cada arquivo de log no meu maior tamanho de contêiner é 500 milhões }

Após a modificação, você precisa recarregar o systemctl daemon-r

Acho que você gosta

Origin blog.csdn.net/m0_71888825/article/details/132339196
Recomendado
Clasificación