[Нативное облако] Принцип сети Docker и контроль занятости аппаратных ресурсов Cgroup

1. Сетевой режим докеров
 получает номер процесса контейнера
docker inspect -f '{ {.State.Pid}}' идентификатор контейнера/имя контейнера

Характеристики сетевого режима докера 
В начальном состоянии докера есть три сетевых режима по умолчанию, bridg (мост), host (хост), none (нет сетевых настроек)

[root@localhost ~]#docker network ls
 

Описание конфигурации сетевого режима
хост//режим хоста – сетевой хост Контейнер и хост совместно используют сетевое пространство имен
container//режим контейнера – сетевой контейнер: идентификатор или имя контейнера Контейнер разделяет сетевое пространство имен с указанным контейнером
нет// Нет режима сети — контейнер network none имеет собственное пространство имен сети, но нет настройки
режима моста//моста — контейнер сетевого моста имеет собственное пространство имен сети и имеет независимый IP-адрес, порт, маршрутизацию и т. д. с использованием пары veth. для подключения к мосту docker0 и используйте мост docker0 в качестве
режима хоста хоста шлюза 1.1.

Эквивалентен режиму моста в Vmware, он находится в той же сети, что и хост-компьютер, но не имеет независимого IP-адреса. Docker использует технологию пространств имен Linux для изоляции ресурсов, таких как процесс изоляции пространства имен PID, файловая система изоляции пространства имен монтирования, сеть изоляции пространства имен сети и т. д. Сетевое пространство имен обеспечивает независимую сетевую среду, включая сетевые карты, маршрутизацию, правила iptable и т. д., изолированные от других сетевых пространств имен. Контейнеру Docker обычно назначается независимое пространство имен Network.

Однако, если при запуске контейнера используется режим хоста, контейнер не получит независимое сетевое пространство имен, а будет совместно использовать сетевое пространство имен с хостом. Контейнер не будет виртуализировать собственную сетевую карту, настраивать собственный IP и т. д., а будет использовать IP и порт хоста.

Контейнер и хост совместно используют сетевое пространство имен, но нет независимого IP-адреса. Используется IP-адрес хоста, а диапазон портов используется совместно с хостом. Например, если хост использует порт 80, контейнер не может используйте порт 80. Этот режим более удобен, но не безопасен. 
 

 #Создать контейнер web1, указать сетевой режим как хост
 #Контейнер и хост совместно используют сетевое пространство имен, но не имеют независимого IP-адреса. Используйте IP-адрес хоста и поделитесь диапазоном портов с хостом.
 docker run -d --name web1 --net=host nginx
 ​# Получите доступ к
 IP-адресу и порту 80 хост-компьютера, после чего вы сможете получить доступ к службе nginx tt1
 curl http://192.168.50.24:80

1.2 режим контейнера
После понимания режима хоста этот режим понять несложно. Этот режим указывает, что вновь созданный контейнер разделяет сетевое пространство имен с существующим контейнером, а не совместно использует его с хостом. Вновь созданный контейнер не будет создавать свою сетевую карту, настраивать свой Ie, а делиться re, диапазоном портов и т.д. с указанным контейнером. Точно так же, в дополнение к сетевым аспектам двух контейнеров, другие вещи, такие как файловые системы и списки процессов, все еще изолированы. Процессы двух контейнеров могут обмениваться данными через устройство сетевой карты lo.

Вновь созданный контейнер B и контейнер A совместно используют пространство имен. Если контейнер A использует порт 80, контейнер B не может использовать порт 80.
 

#Создать контейнер с именем web2 на основе образа centos:7
docker run -itd --name web2 centos:7 /bin/bash
#Просмотреть номер pid контейнера web2
docker inspect -f '{ {.State.Pid}} ' веб2

#Просмотреть сетевое пространство имен web2
ls -l /proc/web2's pid/ns
 
#Создать контейнер web3, использовать сетевой режим контейнера и поделиться сетевым пространством имен с web2
docker run -itd --name web3 --net=container: web2 centos :7 bash
# Просмотр pid контейнера web3
docker inspect -f '{ {.State.Pid}}' web3
ls -l /proc/web3's pid/ns/
# Вы можете видеть, что web3 и web2 имеют одинаковые сетевое пространство имен
 

1.3 нет режима

В режиме None контейнер Docker имеет собственное пространство сетевых имен, но не выполняет никакой настройки сети для контейнера Docker. То есть в контейнере локера нет сетевой карты, IP, маршрутизации и другой информации. В этом сетевом режиме контейнер имеет только петлевую сеть lo, других сетевых карт нет.Этот тип сети не может быть подключен к Интернету.Закрытая сеть вполне может гарантировать безопасность контейнера.
 

 1.4 мост режим моста

 Режим моста — это сетевой режим докера по умолчанию, без параметра --net это режим моста.

Эквивалентно режиму nat в Vmware, контейнер использует независимое пространство имен .network и подключается к виртуальной сетевой карте docker. Через мост dockerO и iptables

Конфигурация таблицы nat взаимодействует с хостом.В этом режиме для каждого контейнера выделяется Hework Mamespace, настройки и т. д., а контейнер Docker на хосте подключается к виртуальному сетевому мосту.

 (1) При запуске процесса Docker на хосте будет создан виртуальный сетевой мост с именем docker0, и контейнер Docker, запущенный на этом хосте, будет подключен к этому виртуальному мосту. Режим работы виртуального моста аналогичен режиму физического коммутатора, поэтому все контейнеры на хосте подключены к сети уровня 2 через коммутатор.

(2) Назначьте IP-адрес контейнеру из подсети docker0 и установите I-адрес dockerO в качестве шлюза контейнера по умолчанию. Создайте пару виртуальных сетевых адаптеров и парных устройств на хосте. Устройства Veth всегда появляются парами и образуют канал данных.Когда данные поступают с одного устройства, они будут поступать с другого устройства.Поэтому устройства veth часто используются для соединения двух сетевых устройств.

(3) Docker помещает один конец устройства пары veth во вновь созданный контейнер и называет его eth0 (сетевая карта контейнера), а другой конец помещает в хост, назвав его похожим именем, например veth*, и добавляет это сетевое устройство в мост docker0. Его можно просмотреть с помощью команды brctl show.

(4) При использовании docker run -p docker фактически создает правила DNAT в iptables для реализации функции переадресации портов. Вы можете использовать iptables -t nat -vnL для просмотра.

[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 ]#докер пс -а
                                     

1.5 Пользовательская сеть контейнера 
ifconfig docker0

  Создайте пользовательскую сеть:
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" моя сеть
 


Снова создайте контейнер с указанным IP:

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

Опыт создания сети контейнеров Docker, рекомендации по сети Docker и «контраст» IP-адресов хоста:

 Например, адрес хост-машины — 10.2.5.6, а адрес контейнера можно изменить на 172.5.6.x, что упрощает поиск неисправного узла при возникновении сбоя. 

Удалить пользовательскую сеть:

Если вы хотите удалить пользовательскую сеть, вы можете использовать для удаления имя режима сети docker network rm, например, docker network rm mynetwork.

 Перед удалением сетевого режима необходимо убедиться, что контейнер, созданный с использованием этого сетевого режима, вышел (то есть остановился). Сеть не может быть удалена, если контейнер все еще работает.
 

2. Управление ресурсами контейнера Docker
 Docker использует Cgroup для управления квотой ресурсов, используемых контейнером, включая ЦП, память и диск, что в основном охватывает общую квоту ресурсов и контроль использования. Cgroup — это сокращение от ControlGroups.Это механизм, предоставляемый ядром Linux, который может ограничивать, записывать и изолировать физические ресурсы (такие как процессор, память, диск, ввод-вывод и т. д.), используемые группами процессов. многие проекты, такие как LXC и докер Реализовать управление ресурсами процесса. Cgroup сама по себе представляет собой инфраструктуру, предоставляющую функции и интерфейсы для управления процессами в группах, и через эту функцию реализуется конкретное управление ресурсами, например ввод-вывод или управление распределением памяти.

Ограничение ресурсов: вы можете ограничить общий объем ресурсов, используемых задачей.
Распределение приоритетов: за счет количества выделенных квантов времени процессора и размера пропускной способности дискового ввода-вывода это фактически эквивалентно управлению приоритетом выполнения задачи.
Статистика ресурсов: вы можете подсчитать использование ресурсов системы, например продолжительность процессора, использование памяти и т. д.
Управление задачами: cgroup может выполнять такие операции, как приостановка и возобновление задач.
 

 3. Ограничения на процессор хоста, занятый докером
3.1 Верхний предел использования процессора
 Linux использует CFS (Completely Fair Scheduler) для планирования использования процессора каждым процессом. Период планирования CFS по умолчанию составляет 100 мс. Мы можем установить цикл планирования каждого процесса контейнера и максимальное количество процессорного времени, которое каждый контейнер может использовать в течение этого цикла.

Используйте --cpu-period, чтобы установить период планирования, и используйте --cpu-quota, чтобы установить процессорное время, которое контейнер может использовать в каждом периоде. Их можно использовать вместе. Эффективный диапазон периода CFS составляет 1 мс~1 с, а диапазон значений соответствующего --cpu-периода составляет 1000~1000000 (в микросекундах). Квота ЦП контейнера не должна быть меньше 1 мс, то есть значение --cpu-quota должно быть >= 1000. Квота ЦП контейнера не должна быть меньше 1 мс, то есть значение --cpu-quota должно быть >= 1000.

1 секунда = 1000 миллисекунд = 1000000 микросекунд

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

cat cpu.cfs_period_us 
100000
------------------------------------------------------------ -------------------------------------------------- ----------
#cpu.cfs_period_us: Период выделения процессора (микросекунды, поэтому имя файла представлено нами), по умолчанию 100000.
#cpu.cfs_quota_us: указывает время (в микросекундах), которое требуется для ограничения cgroups. Значение по умолчанию равно -1, что означает отсутствие ограничений. Если установлено значение 50000, это означает, что 50000/100000=50% ЦП занято.

(1) Обычно включенный процессор, проверьте верхний предел использования
# Создайте контейнер в обычном режиме (в настоящее время контейнер следует правилу по умолчанию для использования ресурсов процессора)
[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 

 Из этого результата видно, что очень опасно, если при создании контейнера не ограничивается лимит использования процессора.После того, как программное исключение определенного контейнера попадет в бесконечный цикл, это напрямую приведет к прерыванию бизнеса в другие контейнеры 

(2) Измените правило верхнего предела времени разделения контейнера по умолчанию и снова создайте начальный тест, чтобы
напрямую ввести модификацию файла конфигурации.

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

(3) Укажите верхний предел использования ресурсов ЦП контейнера при создании контейнера 
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/
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac73 7ed40487f91a5a]#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 Установка коэффициента занятости ресурсов ЦП 
Примечание. Этот метод будет действовать только в том случае, если 
 установлено несколько контейнеров. Доля ЦП делится на количество долей, выделенных самим собой, на количество долей ЦП, занятых всеми контейнерами, т.е. процент ресурсов ЦП, занятых контейнером) для выделения

[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
 

Откройте три терминала и начните опрессовку контейнера:

#Три контейнера – это следующие операции по измерению давления

docker exec -it b1 bash
#Загрузить средство измерения давления в зависимости от среды
yum install -y epel-release #
Загрузить средство измерения давления
yum install -y stress
#Выполнить измерение давления в четырех потоках
stress -c 4
 


 
#Открываем другой терминал, чтобы посмотреть результаты теста
docker stats 

Из результатов теста видно, что когда ЦП выделяет кванты времени, контейнер b1 имеет в два раза больше возможностей, чем контейнеры b2 и b3, для получения квантов времени ЦП. Однако результат выделения зависит от рабочего состояния хоста и других контейнеров в это время.На самом деле нет никакой гарантии, что контейнеры b2 и b3 смогут получить кванты процессорного времени.

Например, процессы контейнеров b2 и b3 всегда бездействуют, тогда контейнер b1 может получить больше квантов процессорного времени, чем контейнеры b2 и b3. В крайних случаях, например, на хосте работает только один контейнер, даже если его доля ЦП составляет всего 50, он может монополизировать ресурсы ЦП всего хоста.

 Cgroups вступают в силу только тогда, когда ресурсов, выделенных контейнером, не хватает, то есть когда ресурсы, используемые контейнером, должны быть ограничены. Таким образом, невозможно определить, сколько ресурсов ЦП выделяется контейнеру, просто основываясь на доле ЦП контейнера.Результат выделения ресурсов зависит от выделения ЦП других контейнеров, работающих в то же время, и рабочего состояния процессы в контейнере.
 

3.3 Установите контейнер для привязки указанного процессора,  чтобы просмотреть номер процессора в верхней части   
хоста,  нажмите цифру «1».

Привязать ядро ​​для создания контейнера 
[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7
 

 exec в контейнер для стресс-тестирования:

yum install -y epel-release
yum insatll -y стресс
 
стресс -c 1

 4. Ограничения на использование памяти
4.1 Ограничение максимальной памяти, которую может использовать контейнер
Параметр m (или --memory=) используется для ограничения максимальной памяти, которую может использовать контейнер. 

docker run -itd --name d1 -m 512m centos:7 /bin/bash
статистика докеров

4.2 Ограничить размер подкачки, доступный для контейнера 
#Ограничить доступный размер подкачки, --memory-swap  

● Чтобы подчеркнуть, --memory-swap необходимо использовать вместе с --memory (или -m).

● При нормальных обстоятельствах значение --memory-swap включает доступную память контейнера и доступную подкачку.

●So -m 300m --memory-swap=1g означает: контейнер может использовать 300M физической памяти и 700M (1G - 300M) подкачки. Если установлено значение 0 или не установлено, размер подкачки, который может использовать контейнер, в два раза превышает значение -m. Если значение --memory-swap совпадает со значением -m, контейнер не может использовать своп. Если значение --memory-swap равно -1, это означает, что память, используемая программой-контейнером, ограничена, а доступное пространство подкачки не ограничено (хост может использовать столько контейнеров подкачки, сколько имеется).
 

 Значение #--memory-swap включает доступную память контейнера и доступный своп, минус значение -m — это значение доступного свопа.
 # Указывает, что контейнер может использовать 512 МБ физической памяти и 512 МБ подкачки. Поскольку 1 г минус 512 м физической
памяти, оставшееся значение — это доступный объем подкачки.
 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 или не установлено, размер подкачки, который может использовать контейнер, в два раза превышает значение - м.  docker run -itd --name d4 -m 512m centos:7 bash  #    --memory-swap Значение равно -1, что означает, что память, используемая программой-контейнером, ограничена, но доступное пространство подкачки не ограничено (хост Хост может использовать столько контейнеров подкачки, сколько у него есть).  docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash











5. Ограничение управления конфигурацией дискового ввода-вывода (blkio) 
-device-read-bps: ограничение скорости чтения в битах (объем данных) на определенном устройстве, а единицей измерения может быть kb, mb (M) или gb.

--device-write-bps : Ограничить скорость записи в битах (объем данных) на определенном устройстве, единицей измерения может быть kb, mb (M) или gb.

Скорость относится к операциям чтения и записи в секунду 1M, 1G или 1kb. 

--device-read-iops : ограничить количество операций ввода-вывода (количество раз) для чтения устройства

--device-write-iops : ограничить количество операций ввода-вывода (количество раз), записываемых на определенное устройство
 

5.1 Скорость записи контейнера по умолчанию 
[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 Создайте контейнер с ограничением скорости записи 
 
[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. Очистите место на диске, занимаемое
докером. docker system prune -a можно использовать для очистки диска, удаления закрытых контейнеров, бесполезных томов данных и сетей.

система докеров обрезать -a 

рекомендация

отblog.csdn.net/zl965230/article/details/131043412