Docker Compose - Ограничения на паметта

Docker Compose Memory Limits



Docker Compose е мощна помощна програма. Спестява време и намалява грешките при разгръщането на вашето Dockerized приложение. Обикновено не е добра идея да стартирате целия стек, включително интерфейса, сървъра на базата данни и т.н. от един единствен контейнер.

Разделяме различни контейнери, за да се справим с различни натоварвания на приложение и използваме Docker Compose, за да направим това лесно. Всяко логически различно натоварване е посочено като различно обслужване . Например, вашият frontend http сървър ще бъде посочен като frontend услуга, изпълняваща Apache или Nginx изображение като контейнер.







Всички услуги, техните мрежови нужди, изисквания за съхранение и т.н. могат да бъдат посочени във файл docker-compose.yml. Тук ще се съсредоточим върху уточняване на използването на паметта.



За да продължите, ще ви трябват следните инструменти във вашия арсенал:



  1. Основни познания за Docker
  2. Docker за Windows или Mac или ако използвате Linux, DockerCE за Linux
  3. Docker Съставете бинар y (потребителите на Windows и Mac вече ще имат инсталирана тази версия)

Ще се придържаме към версия 2.4 за нашите docker-compose.yml файлове, тъй като поддържа версия 17.12 и по-нова на Docker Engine и по-нова. Можехме да отидем с версия 3, която е по -нова, но не поддържа стар синтаксис за ограничаване на паметта. Ако се опитате да използвате по -новия синтаксис, той настоява вместо това да използвате Docker в режим Swarm. Така че, за да опростя нещата за обикновените потребители на Docker, ще се придържам към версия 2.4





Повечето от кода биха работили по същия начин за версия 3 и там, където ще има разлика, ще спомена по -новия синтаксис за потребителите на Docker Swarm.

Примерно приложение

Нека се опитаме да стартираме проста Nginx услуга на порт 80, като използваме първо CLI и след това обикновен docker-compose.yml. В следващия раздел ще изследваме ограниченията и използването на паметта му и ще променим нашия docker-compose.yml, за да видим как се налагат персонализираните ограничения.



Нека стартираме прост nginx сървър, използвайки Docker-CLI:

$ docker run -d --name my -nginx -p80:80nginx: най -новата

Можете да видите работещия сървър nginx, като посетите http: // localhost или заменете lcoalhost

С IP адреса на вашия Docker хост. Този контейнер може потенциално да използва цялата налична памет на вашия Docker хост (в нашия случай това е около 2GB). За да проверим използването на паметта, наред с други неща, можем да използваме командата:

$ docker статистика my-nginx

ИМЕ НА КОНТЕЙНЕР CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0,00% 2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

МЕМ ИЗПОЛЗВАНЕТО/ОГРАНИЧЕНИЕТО е на 2.133MiB от общите 1.934GiB. Нека премахнем този контейнер и да започнем да пишем скриптове за съставяне на докери.

$ docker спрете моя-nginx
$ docker rm my-nginx

Еквивалентен ym файл

Точният контейнер както по -горе може да бъде създаден, ако следваме тези стъпки:

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

Създаваме нова празна директория и създаваме файл docker-compose.yml в нея. Когато стартираме docker-compose от тази директория, той ще търси този конкретен файл (игнорирайки всичко останало) и ще създаде съответно нашето разполагане. Добавете следното съдържание в този .yml файл.

версия:'3'
услуги:
my-nginx:
изображение: nginx: последно
пристанища:
-'80: 80 '

$ docker -compose up -d

Флагът -d се добавя, така че новосъздадените контейнери да работят във фонов режим. В противен случай терминалът ще се прикрепи към контейнерите и ще започне да печата отчети от него. Сега можем да видим статистиката на новосъздадения контейнер (и):

$ docker stats -всички

ИМЕ НА КОНТЕЙНЕР CPU% MEM USAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2.25MiB/1.934GiB0,11% 1.65kB/0B 7.35MB/0B2

Ще забележите, че подобен контейнер, както преди, е създаден с подобни ограничения на паметта и дори използване. От същата директория, която съдържа yml файла. Изпълнете следната команда, за да изтриете новосъздадения контейнер, заедно с създадената клиентска мостова мрежа.

$docker-compose down

Това ще върне докера в чисто състояние, с изключение на всички създадени томове (не сме създали такива, така че това не е проблем.)

Ограничения на паметта и резервации на паметта

Ограниченията на паметта и резервирането на памет са два различни аспекта, за да се осигури безпроблемно функциониране на вашите приложения и хоста на Docker, на който работите отгоре.

Най -общо казано, ограничението на паметта налага горна граница на обема памет, която потенциално може да се използва от Docker контейнер. По подразбиране контейнер на Docker, както всеки друг системен процес, може да използва цялата налична памет на хоста на Docker. Това може да доведе до изключение на паметта и вашата система може да се срине. Дори и да не се стигне до това, той все още може да гладува друг процес (включително други контейнери) от ценни ресурси, което отново уврежда производителността. Ограниченията на паметта гарантират, че жадните за ресурси контейнери не надвишават определен лимит. Това ограничава радиуса на взрив на лошо написано приложение до няколко контейнера, а не целия хост.

Резервациите на паметта, от друга страна, са по -малко твърди. Когато системата изчерпва паметта и се опитва да възстанови част от нея. Той се опитва да намали консумацията на памет на контейнера на или под границата на резервацията. Ако има изобилие от памет обаче, приложението може да се разшири до твърдо зададения лимит на паметта.

Да обобщим:

  1. Ограничение на паметта: Строга горна граница на размера на паметта, предоставена на контейнера.
  2. Резервиране на памет: Това трябва да бъде зададено като минимално количество памет, от което дадено приложение трябва да работи правилно. Така че не се срива или се държи лошо, когато системата се опитва да възстанови част от паметта.

Ако резервирането на памет е по -голямо от ограничението на паметта, ограничението на паметта има предимство.

Определяне на граници на паметта и резервиране

Версия 2

Да се ​​върнем към docker-compose.yml, който написахме по-рано и да добавим ограничение на паметта към него. Променете версията на 2.4 по причини, обсъдени в раздела за предпоставки.

версия:'2.4'
услуги:
my-nginx:
изображение: nginx: последно
пристанища:
-'80: 80 '
mem_limit: 300м

Последният ред задава ограничението за услугата my-nginx до 300MiB. Можете да използвате k за KiB и g за GiB и b само за байтове. Но числото преди него трябва да е цяло число. Не можете да използвате стойности като 2.4m, вместо това ще трябва да използвате 2400k. Сега, ако стартирате:

$ docker stat -всички

ИМЕ НА КОНТЕЙНЕР CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2.141MiB/300MiB0,71% 1.16kB/0B 0B/0B2

Ще забележите, че ограничението на паметта е зададено на 300 MiB. Задаването на резервация на паметта е също толкова лесно, просто добавете ред mem_reservation: xxx в края.

версия:'2.4'
услуги:
my-nginx:
изображение: nginx: последно
пристанища:
-'80: 80 '
mem_limit: 300м
mem_reservation: 100м

Версия 3 (по избор)

За да използвате версия три, трябва да работите с Docker в режим на рояк. За Windows и Mac можете да го активирате чрез менюто с настройки на Docker. Потребителите на Linux ще трябва да стартират docker swarm init. Повече информация за това може да бъде намерена тук . Това обаче не е необходима стъпка и ако не сте я активирали, това също е добре. Този раздел е за хора вече работи в режим на рояк и може да използва по -новата версия.

версия:'3'
услуги:
my-nginx:
изображение: nginx: последно
пристанища:
-'80: 80 '
разгръщам:
ресурси:
граници:
памет: 300м
резервации:
памет: 100м

Ние дефинираме всичко това под опция ресурси. Ограниченията и резервирането стават собствени първични ключове, а паметта е само един от многото ресурси, които се управляват тук. Процесорът е още един важен параметър.

Допълнителна информация

Можете да научите повече за docker-compose от официалната документация свързани тук . След като разберете същността на това как да напишете файл за съставяне, документацията може да ви помогне с конкретните параметри.

Не е нужно да знаете всичко, просто потърсете какво изисква приложението ви и препратката би ви насочила при прилагането на това.