[Nativo en la nube] Principio de red de Docker y control de ocupación de recursos de hardware de Cgroup

1. El modo de red de los dockers
 obtiene el número de proceso del contenedor
docker inspect -f '{ {.State.Pid}}' container id/container name

Las características del modo de red de la ventana acoplable 
En el estado inicial de la ventana acoplable, hay tres modos de red predeterminados, bridg (puente), host (host), ninguno (sin configuración de red)

[root@localhost ~]#docker network ls
 

Descripción de la configuración del modo de red
host//modo de host –network host El contenedor y el host comparten el espacio de nombres de red
container//modo de contenedor –network container: el id o el nombre del contenedor El contenedor comparte el espacio de nombres de red con el contenedor especificado
none// Sin modo de red: el contenedor de red ninguno tiene su propio espacio de nombres de red, pero no hay configuración de
modo puente//puente: el contenedor de puente de red tiene su propio espacio de nombres de red y tiene IP, puerto, enrutamiento, etc. independientes, usando un par veth para conectarse al puente docker0, y Usar el puente docker0 como el
modo de host del host de puerta de enlace 1.1

Equivalente al modo puente en Vmware, está en la misma red que la máquina host, pero no tiene una dirección IP independiente. Docker utiliza la tecnología de espacios de nombres de Linux para aislar recursos, como el proceso de aislamiento de espacios de nombres PID, el sistema de archivos de aislamiento de espacios de nombres de montaje, la red de aislamiento de espacios de nombres de red, etc. Un espacio de nombres de red proporciona un entorno de red independiente, incluidas las tarjetas de red, el enrutamiento, las reglas de iptable, etc., que están aislados de otros espacios de nombres de red. Por lo general, a un contenedor de Docker se le asigna una red independiente.

Sin embargo, si se utiliza el modo de host al iniciar el contenedor, el contenedor no obtendrá un espacio de nombres de red independiente, sino que compartirá un espacio de nombres de red con el host. El contenedor no virtualizará su propia tarjeta de red, configurará su propia IP, etc., sino que utilizará la IP y el puerto del host.

El contenedor y el host comparten el espacio de nombres de la red, pero no hay una dirección IP independiente. Se usa la dirección IP del host y el rango de puertos se comparte con el host. Por ejemplo, si el host usa el puerto 80, el contenedor no puede Usa el puerto 80. Este modo es más conveniente, pero no seguro. 
 

 #Crear contenedor web1, especificar el modo de red como host
 #El contenedor y el host comparten el espacio de nombres de la red, pero no tienen una dirección IP independiente. Utilice la IP del host y comparta el intervalo de puertos con el host.
 docker run -d --name web1 --net=host nginx
 #Acceda
 a la ip y al puerto 80 de la máquina host, luego puede acceder al servicio nginx de tt1
 curl http://192.168.50.24:80

1.2 modo contenedor
Después de comprender el modo host, este modo es fácil de entender. Este modo especifica que un contenedor recién creado comparte un espacio de nombres de red con un contenedor existente en lugar de compartirlo con el host. El contenedor recién creado no creará su propia tarjeta de red, ni configurará su propio Ie, sino que compartirá re, rango de puertos, etc. con un contenedor específico. De manera similar, además de los aspectos de red de los dos contenedores, otras cosas, como los sistemas de archivos y las listas de procesos, aún están aisladas. Los procesos de los dos contenedores pueden comunicarse a través del dispositivo de la tarjeta de red.

El contenedor B y el contenedor A recién creados comparten un espacio de nombres. Si el contenedor A usa el puerto 80, el contenedor B no puede usar el puerto 80.
 

#Cree un contenedor llamado web2 basado en la imagen centos:7
docker run -itd --name web2 centos:7 /bin/bash
#Vea el número pid del contenedor web2
docker inspect -f '{ {.State.Pid}} 'web2

#Vea el espacio de nombres de red de web2
ls -l /proc/web2's pid/ns
 
#Cree un contenedor web3, use el modo de red de contenedor y comparta el espacio de nombres de red con web2
docker run -itd --name web3 --net=container: web2 centos :7 bash
#Ver el pid del contenedor web3
docker inspect -f '{ {.State.Pid}}' web3
ls -l /proc/web3's pid/ns/
#Puedes ver que web3 y web2 comparten lo mismo espacio de nombres de red
 

1.3 ningún modo

En modo ninguno, el contenedor de Docker tiene su propio espacio de nombres de red, pero no realiza ninguna configuración de red para el contenedor de Docker. Es decir, el contenedor del casillero no tiene tarjeta de red, IP, enrutamiento y otra información. En este modo de red, el contenedor solo tiene la red loopback baja y no hay otras tarjetas de red. Este tipo de red no se puede conectar a Internet. Una red cerrada puede garantizar la seguridad del contenedor.
 

 1.4 modo puente puente

 El modo puente es el modo de red predeterminado de docker, sin el parámetro --net, es el modo puente.

Equivalente al modo nat en Vmware, el contenedor utiliza un espacio de nombres .network independiente y se conecta a la tarjeta de red virtual docker. A través del puente dockerO e iptables

La configuración de la tabla nat se comunica con el host. Este modo asignará Mamespace de red, configuraciones, etc. para cada contenedor, y conectará un contenedor Docker en un host a un puente de red virtual.

 (1) Cuando se inicie el proceso Docker, se creará un puente de red virtual denominado docker0 en el host y el contenedor Docker iniciado en este host se conectará a este puente virtual. El modo de trabajo del puente virtual es similar al de un conmutador físico, de modo que todos los contenedores del host están conectados a una red de capa 2 a través del conmutador.

(2) Asigne una IP al contenedor desde la subred docker0 y configure la dirección I de dockerO como la puerta de enlace predeterminada del contenedor. Cree un par de dispositivos de par veth de NIC virtual en el host. Los dispositivos Veth siempre aparecen en pares y forman un canal de datos. Cuando los datos ingresan desde un dispositivo, saldrán del otro dispositivo. Por lo tanto, los dispositivos Veth se usan a menudo para conectar dos dispositivos de red.

(3) Docker coloca un extremo del dispositivo de par veth en el contenedor recién creado y lo nombra eth0 (la tarjeta de red del contenedor), y coloca el otro extremo en el host, lo nombra con un nombre similar como veth*, y agrega este dispositivo de red al puente docker0. Se puede ver a través del comando brctl show.

(4) Cuando se usa docker run -p, docker en realidad crea reglas DNAT en iptables para realizar la función de reenvío de puertos. Puede usar iptables -t nat -vnL para ver.

[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.5 Red personalizada del contenedor 
ifconfig docker0

  Cree una red personalizada:
docker network create --subnet=172.66.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
docker network create --subnet=172.66.0.0/16 -- opt "com.docker.network.bridge.name"="docker1" mi red
 


Vuelva a crear el contenedor con la IP especificada:

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

Experiencia de producción de red de contenedores de Docker, recomendaciones de red de Docker y "contraste" de IP de host:

 Por ejemplo, la dirección de la máquina host es 10.2.5.6 y la dirección del contenedor se puede cambiar a 172.5.6.x, lo que facilita la localización del nodo defectuoso cuando ocurre una falla. 

Eliminar una red personalizada:

Si desea eliminar una red personalizada, puede usar el nombre del modo de red de docker network rm para eliminar, como docker network rm mynetwork.

 Antes de eliminar un modo de red, debe asegurarse de que el contenedor creado con este modo de red haya salido (es decir, se haya detenido). La red no se puede eliminar si el contenedor aún se está ejecutando.
 

2. Control de recursos del contenedor Docker
 Docker usa Cgroup para controlar la cuota de recursos utilizada por el contenedor, incluidos la CPU, la memoria y el disco, que básicamente cubre la cuota de recursos comunes y el control de uso. Cgroup es la abreviatura de ControlGroups. Es un mecanismo proporcionado por el kernel de Linux que puede limitar, registrar y aislar los recursos físicos (como cpu, memoria, disco, io, etc.) utilizados por grupos de procesos. Es utilizado por muchos proyectos como LXC y docker Implementar el control de recursos del proceso. Cgroup en sí mismo es una infraestructura que proporciona funciones e interfaces para administrar procesos en grupos, y la administración de recursos específicos, como E/S o control de asignación de memoria, se realiza a través de esta función.

Límite de recursos: puede limitar la cantidad total de recursos utilizados por la tarea.
Asignación de prioridad: a través de la cantidad de segmentos de tiempo de CPU asignados y el tamaño del ancho de banda de E/S del disco, en realidad es equivalente a controlar la prioridad de ejecución de la tarea.
Estadísticas de recursos: puede contar el uso de recursos del sistema, como la duración de la CPU, el uso de la memoria, etc.
Control de tareas: cgroup puede realizar operaciones como suspender y reanudar tareas.
 

 3. Límites en la CPU del host ocupada por la ventana acoplable
3.1 Límite superior de uso de la CPU
 Linux usa CFS (programador completamente justo) para programar el uso de la CPU por cada proceso. El período de programación predeterminado de CFS es de 100 ms. Podemos establecer el ciclo de programación de cada proceso de contenedor y cuánto tiempo de CPU puede usar cada contenedor como máximo durante este ciclo.

Use --cpu-period para establecer el período de programación y use --cpu-quota para establecer el tiempo de CPU que el contenedor puede usar en cada período. Los dos se pueden usar juntos. El rango efectivo del período CFS es 1ms~1s, y el rango de valores del período --cpu correspondiente es 1000~1000000 (en microsegundos). La cuota de CPU del contenedor no debe ser inferior a 1 ms, es decir, el valor de --cpu-quota debe ser >= 1000. La cuota de CPU del contenedor no debe ser inferior a 1 ms, es decir, el valor de --cpu-quota debe ser >= 1000.

1 segundo = 1000 milisegundos = 1000000 microsegundos

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

gato cpu.cfs_period_us 
100000
--------------------------------------------- -------------------------------------------------- ----------
#cpu.cfs_period_us: El período de asignación de la CPU (microsegundos, por lo que representamos el nombre del archivo), el valor predeterminado es 100000.
#cpu.cfs_quota_us: Indica el tiempo (en microsegundos) que tarda el límite de cgroups, y el valor predeterminado es -1, lo que significa que no hay límite. Si se establece en 50000, significa que 50000/100000 = 50% de la CPU está ocupada.

(1) CPU normalmente habilitada, pruebe el límite superior de uso
#Cree un contenedor normalmente (en este momento, el contenedor sigue la regla predeterminada de ocupar recursos de la 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++
hecho
 
 
[root@d6da0a6b999a / ]# chmod +x cpu.sh 
 iniciar secuencia de comandos de bucle infinito
[root@d6da0a6b999a /]# ./cpu.sh 

 A partir de este resultado, se puede ver que es muy peligroso si el límite de uso de la CPU no está limitado al crear un contenedor. Una vez que la excepción del programa de un determinado contenedor cae en un bucle infinito, conducirá directamente a la interrupción del negocio en otros contenedores 

(2) Modifique la regla de límite superior de fragmentación de tiempo del contenedor predeterminada y cree una prueba de inicio nuevamente para
ingresar directamente la modificación del archivo de configuración

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

(3) Especifique el límite superior del uso de recursos de CPU del contenedor al crear el contenedor 
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) 多cpu分配容器的使用上限
[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/
[raíz@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed4 0487f91a5a]#ls
 
[raíz@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 
[raíz@a1ce6948cdb6 /]# ./cpu.bash 

3.2 Establecimiento de la tasa de ocupación de los recursos de la CPU 
Nota: este método solo tendrá efecto cuando se 
 establezcan varios contenedores. porcentaje de recursos de CPU ocupados por el contenedor) para asignar

[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 ejecutar -id --nombre b3 --cpu-shares 1024 centos:7
 

Abra tres terminales y comience la prueba de presión del contenedor:

#Tres recipientes son las siguientes operaciones de medición de presión

docker exec -it b1 bash
#Descargar el entorno dependiente de la herramienta de medición de presión
yum install -y epel-release
#Descargar la herramienta de medición de presión
yum install -y stress
#Realizar la medición de presión de cuatro subprocesos
stress -c 4
 


 
#Abra otra terminal para ver las
estadísticas de la ventana acoplable  de los resultados de la prueba

A partir de los resultados de la prueba, se puede ver que cuando la CPU asigna segmentos de tiempo, el contenedor b1 tiene el doble de oportunidades que los contenedores b2 y b3 para obtener segmentos de tiempo de CPU. Sin embargo, el resultado de la asignación depende del estado de ejecución del host y otros contenedores en ese momento. De hecho, no hay garantía de que los contenedores b2 y b3 puedan obtener segmentos de tiempo de cpu.

Por ejemplo, los procesos de los contenedores b2 y b3 siempre están inactivos, entonces el contenedor b1 puede obtener más segmentos de tiempo de CPU que los contenedores b2 y b3. En casos extremos, por ejemplo, solo se ejecuta un contenedor en el host, incluso si su cuota de CPU es solo 50, puede monopolizar los recursos de CPU de todo el host.

 Cgroups solo surtirá efecto cuando los recursos asignados por el contenedor sean escasos, es decir, cuando los recursos utilizados por el contenedor deban ser limitados. Por lo tanto, es imposible determinar cuántos recursos de CPU se asignan a un contenedor basándose simplemente en la cuota de CPU de un contenedor. El resultado de la asignación de recursos depende de la asignación de CPU de otros contenedores que se ejecutan al mismo tiempo y del estado de ejecución del contenedor. procesos en el contenedor.
 

3.3 Configure el contenedor para vincular la CPU especificada 
para ver el número de CPU en la 
parte superior    del host
, presione el número "1"

Vincule el núcleo para crear un contenedor 
[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7
 

 exec en el contenedor para pruebas de estrés:

yum install -y epel-release
yum insatll -y estrés
 
estrés -c 1

 4. Límites en el uso de la memoria
4.1 Limite la memoria máxima que puede usar un contenedor
La opción m (o --memory=) se usa para limitar la memoria máxima que puede usar un contenedor 

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

4.2 Limitar el tamaño de intercambio disponible para el contenedor 
#Limitar el tamaño de intercambio disponible, --memory-swap  

●Para enfatizar, --memory-swap debe usarse junto con --memory (o -m).

●En circunstancias normales, el valor de --memory-swap incluye la memoria disponible del contenedor y el intercambio disponible.

● Entonces -m 300m --memory-swap=1g significa: el contenedor puede usar 300M de memoria física y puede usar 700M (1G - 300M) de intercambio. ​ Si se establece en 0 o no se establece, el tamaño de intercambio que el contenedor puede usar es el doble del valor de -m. Si el valor de --memory-swap es el mismo que el valor de -m, el contenedor no puede usar swap. Si el valor de --memory-swap es -1, significa que la memoria utilizada por el programa contenedor es limitada y el espacio de intercambio disponible no está limitado (el host puede usar tantos contenedores de intercambio como haya).
 

 El valor de #--memory-swap incluye la memoria disponible del contenedor y el intercambio disponible, menos el valor de -m es el valor del intercambio disponible.
 #Indica que el contenedor puede usar 512M de memoria física y puede usar 512M de intercambio. Debido a que 1 g menos 512 m de
memoria física, el valor restante es el intercambio disponible.
 docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash  #
   --memoryswap value es el mismo que -m value, lo que significa que el contenedor no puede usar swap  docker run -itd -- nombre d3 - m 512m --memory-swap=512m centos:7 bash  #    Si el valor de --memory-swap se establece en 0 o no se establece, el tamaño de intercambio que el contenedor puede usar es el doble del valor de - metro.  docker run -itd --name d4 -m 512m centos:7 bash  ​​#    --memory-swap El valor es -1, lo que significa que la memoria utilizada por el programa contenedor es limitada, pero el espacio de intercambio utilizable no está limitado (host El host puede usar tantos contenedores de intercambio como tenga).  docker ejecutar -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash











5. Limitación del control de configuración de E/S del disco (blkio) 
-device-read-bps: limita la velocidad de lectura bps (volumen de datos) en un determinado dispositivo, y la unidad puede ser kb, mb (M) o gb.

--device-write-bps: limita la velocidad de escritura en bps (volumen de datos) en un determinado dispositivo, la unidad puede ser kb, mb (M) o gb.

La velocidad se refiere a operaciones de lectura y escritura por segundo 1M, 1G o 1kb 

--device-read-iops: limita las iops (cantidad de veces) para leer un dispositivo

--device-write-iops: limita las iops (cantidad de veces) escritas en un determinado dispositivo
 

5.1 La velocidad de escritura del contenedor por defecto 
[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 evita el caché causado por el sistema de lectura y escritura de archivos, y evita afectar los resultados de la prueba

5.2 Cree un contenedor con límite de velocidad de escritura 
 
[root@localhost ~]#docker run -it --name e3 --device-write-bps /dev/sda:1M centos:7 /bin/bash [root@
6c1b8bcf6b44 /]# dd if=/dev/cero of=/opt/test.out bs=10M count=5 oflag=direct

6. Limpiar el espacio en disco ocupado por
docker docker system prune -a se puede usar para limpiar el disco, eliminar contenedores cerrados, volúmenes de datos inútiles y redes.

sistema docker podar -a 

Supongo que te gusta

Origin blog.csdn.net/zl965230/article/details/131043412
Recomendado
Clasificación