Подтвердить что ты не робот

Каково влияние использования нескольких базовых изображений в Docker?

Я понимаю, что контейнеры докеров переносимы между хостами докеров, но я смущен об отношениях с базовым изображением и хостом.

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

  • ХОРОШЕЕ. Многие контейнеры используют одно базовое изображение.
  • BAD. Многие контейнеры работают с отдельными/уникальными базовыми изображениями.

Я уверен, что эта путаница возникает из-за моего незнания LXC.

enter image description here

4b9b3361

Ответ 1

Я запутался в связи с базовым изображением и хостом.

Единственное отношение между контейнером и хостом заключается в том, что они используют одно и то же ядро. Программы, запущенные в Docker, вообще не видят файловую систему хоста, а только их собственную файловую систему.

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

Нет. Базовое изображение Ubuntu составляет около 150 МБ. Но вам будет сложно использовать все эти программы и библиотеки. Вам нужно только небольшое подмножество для какой-либо конкретной цели. Фактически, если ваш контейнер работает с memcache, вы можете просто скопировать 3 или 4 библиотеки, которые ему нужны, и это будет около 1 МБ. Там нет необходимости в оболочке и т.д. Неиспользуемые файлы просто будут сидеть там на диске, полностью игнорируются. Они не загружаются в память и не копируются на диске.

ХОРОШО: многие контейнеры используют одно базовое изображение. BAD: много контейнеров с отдельными/уникальными базовыми изображениями.

Нет. Использование нескольких изображений будет использовать только небольшой бит оперативной памяти. (Очевидно, что несколько контейнеров занимают больше места на диске, но диск дешевый, поэтому мы это проигнорируем). Поэтому я бы сказал, что это "ОК" вместо "BAD".

Пример. Я запускаю один контейнер Ubuntu с Memcached и другим контейнером Centos с Tomcat. Если бы они работали под управлением Ubuntu, они могли бы делиться ОЗУ такими вещами, как libc. Но поскольку они не делят файлы, каждое базовое изображение должно загрузить свою собственную копию libc. Но, как мы видели, мы говорим только 150 МБ файлов, и вы, вероятно, используете только несколько процентов от этого. Таким образом, каждое изображение только отнимает несколько МБ ОЗУ.

(Подсказка: посмотрите на свой процесс в ps. Это то, сколько оперативной памяти оно использует, включая любые файлы с его изображения.)

Ответ 2

На данный момент Docker использует AUFS, который является файловой системой Union, используя копию при записи.

Если у вас несколько базовых образов, эти изображения занимают дисковое пространство, но при запуске N контейнеров с этих изображений не используется фактический диск. Поскольку это копирование на запись, только измененные файлы занимают место на хосте.

Итак, если у вас есть 1 или N базовое изображение, оно ничего не меняет, независимо от того, сколько у вас контейнера.

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

Ответ 3

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

Пояснение:

Я думаю, что ваше сравнение с VM немного вводит в заблуждение. Конечно, в случае f.e. 3 базовых изображения будут иметь более высокие требования к памяти, чем в случае только одного базового изображения, но у виртуальных машин будут еще более высокие требования к памяти:

Грубый расчет - Докер, для M-изображений, N контейнеров:

  • 1 x базовое изображение + контейнер N x (файловая система + рабочая память)
  • M x размер базового изображения + контейнер N x (файловая система + рабочая память)

Расчет - виртуальные машины:

  • N x VM image = по крайней мере N x размер базового изображения для конкретного размера контейнера VM + N x (размер файловой системы + рабочая память)

Чтобы докер мог получить преимущество, вы должны иметь M < Н. Для малых M и больших N разница между докером и несколькими виртуальными машинами значительна.