Что такое контейнер?

23

Есть несколько вопросов о контейнерах , таких как:

Мои вопросы :

  • Что на самом деле является «контейнером» (в контексте DevOps)?
  • Почему они используются?
Pierre.Vriens
источник
Легко объяснил shivab.com/blog/docker/2019/01/10/…
иллюзионист

Ответы:

18

Самое первое, что нужно знать о контейнере:

Это, в первую очередь, процесс.

Поняв это, можно начать понимать, как контейнеры сравниваются и сравниваются с виртуальными машинами. Контейнеры и виртуальные машины совместно используют изоляцию от своих хостов. Метод изоляции является критическим отличием.

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

Виртуальные машины используют гипервизор для изоляции виртуальных машин от их хостов. Это уровень программного обеспечения, который перенаправляет запросы на ресурсы от «гостей» (ВМ) на аппаратное обеспечение. Изоляция диска обеспечивается виртуализацией диска. Виртуальные машины не разделяют ядро ​​с хостом - они загружают свои собственные ядра в пространство памяти, выделенное для виртуальной машины.

Одним из важных последствий этого различия является то, что контейнер должен быть совместим с ядром своего хоста. Например, невозможно запустить контейнер на основе Windows Nano Server на хосте Linux или контейнер Ubuntu непосредственно на хосте Windows. Виртуальные машины, напротив, могут запускать любое ядро ​​независимо от операционной системы хоста. При запуске контейнера Linux на хосте Windows Docker запускает контейнер в виртуальной машине Linux.

Операционные различия заключаются в гибкости: контейнеры запускаются и останавливаются примерно так же быстро, как и обычный процесс. Виртуальные машины «тяжелее», для них требуются выделенные ресурсы, и для их запуска и завершения требуется больше времени.

Контейнеры предлагают большую гибкость для операционной модели DevOps:

  • Контейнеры изолируют зависимости программных компонентов. Разработчики могут использовать контейнеры, чтобы гарантировать, что модуль приложения будет функционировать так же на своих машинах разработки, как в QA / UA / Production.
  • Контейнеры используют программно-определяемые сети для связи
  • Определения контейнеров являются декларативными и могут контролироваться источником
  • Системы управления контейнерами (Kubernetes, DC / OS, Swarm) могут управлять пулами аппаратных ресурсов (вычисления / ОЗУ / хранилище) и динамически масштабировать контейнеры
Дейв Сверски
источник
1
Я также делаю ваши 3 последних пункта на vSphere, благодаря
vagrant
8

Слово « контейнер» относится к облегченной технологии виртуализации, доступной в современных ядрах Linux, эта технология очень похожа на тюрьмы FreeBSD.

Старое ядро ​​Linux, не поддерживающее контейнеры, может запускать процессы одновременно. Некоторые атрибуты системы являются частными для процесса, например, среда процесса или память процесса: только процесс, владеющий этими атрибутами, и сама операционная система могут получить доступ к этим данным. (Существует много лазеек, как в некоторых реализациях ps , но это, по сути, так!) Некоторые процессы совместно используются процессами, например, файловой системой и сетевыми интерфейсами.

Современное ядро ​​Linux с возможностью работы с контейнерами способно обрабатывать больше атрибутов системы как частные данные, связанные с процессом или группой процессов. Результирующий контекст представляет собой контейнер, и вместо запуска программы в «начальных контейнерах» с использованием файловой системы и сетевых интерфейсов, инициализированных операционной системой, можно запускать процессы в других контейнерах, чтобы они видели другую файловую систему и другой список сетевых интерфейсов. Таким образом, два процесса, выполняющиеся в разных контейнерах, действительно совместно используют ядро. Возможно, вы знакомы с командой chroot, которая может запускать процесс в отдельной файловой иерархии, контейнеры продвигают идею на несколько шагов дальше.

Конечно, это только очень грубое объяснение, но я надеюсь, что оно поможет прояснить идею о том, что такое контейнеры. Теперь, для чего они хороши?

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

Контейнерные технологии удобны для:

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

(Поскольку вы, кажется, знакомы с другими технологиями виртуализации, такими как Virtual Box, вы можете заметить, что эти технологии также могут удобно решать три вышеуказанные задачи. В настоящее время спектр технологий виртуализации довольно небольшой, и мы можем сравнить вопрос об их популярности в В некоторых случаях популярность компьютерных языков зависит, вероятно, от технических достоинств каждого отдельного решения, а также от множества факторов, которые я просто обозначу как «случайность».)

Михаэль Ле Барбье Грюневальд
источник
1
Windows 16 больше не ограничивается Linux, она обладает такими же возможностями
Tensibai
1
Ссылка для поддержки моей претензии docs.microsoft.com/en-us/virtualization/windowscontainers/…
Tensibai
7

Обычно контейнеры ссылаются на что-то вроде докер-контейнеров, которые популяризировали название

Я цитирую из определения докера:

С помощью контейнеров все необходимое для запуска части программного обеспечения упаковывается в изолированные контейнеры. В отличие от виртуальных машин, контейнеры не включают полную операционную систему - нужны только библиотеки и настройки, необходимые для работы программного обеспечения.

Корневое именование приходит из контейнеров linux (lxc), цель которых состояла в том, чтобы изолировать процесс от его хост-системы, первая цель состояла в том, чтобы избежать компрометации процесса для захвата хост-системы.

Теперь они используются в более широком масштабе. В современном определении «контейнер» вы более или менее выпустите пакет для среды выполнения, который уже включает ваше приложение, его промежуточное программное обеспечение, если это необходимо, и все необходимые библиотеки, и убедитесь, что он будет работать в любой совместимой системе.

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

В отличие от системы виртуальных машин, такой как виртуальная машина с виртуальной коробкой или экземпляр EC2 в AWS, контейнеры являются виртуальными только на уровне файловой системы и изолируются только в стеке памяти. Они по-прежнему используют один и тот же хост, и операционная система под ними будет обрабатывать такты процессора.

Виртуальная машина является виртуальной на аппаратном уровне, и вы запускаете операционную систему внутри, контейнер является виртуальным на уровне ОС, и вы запускаете процесс внутри.

Tensibai
источник
1
Хм, так что-то вроде VirtualBox-образа (или как это называется в VirtualBox) также может быть квалифицировано как «контейнер», или я не понимаю?
Pierre.Vriens
Увидел, что я забыл часть вопроса, добавил разницу, расширяя ответ.
Тенсибай
3

Из определения AWS :

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

Контейнерирование - это упаковка всех необходимых вещей, необходимых для выполнения конкретной задачи / среды, чтобы она была самодостаточной и могла работать на любой платформе, что устраняет большую боль при настройке и установке.

Dawny33
источник