[Обратите внимание, что этот ответ касается контейнеров Linux и может не полностью применяться к другим операционным системам. ]
Что такое контейнер?
Это приложение : контейнер - это способ запускать приложения, изолированные друг от друга. Вместо виртуализации оборудования для запуска нескольких операционных систем контейнеры полагаются на виртуализацию операционной системы для запуска нескольких приложений. Это означает, что вы можете запускать больше контейнеров на одном оборудовании, чем виртуальные машины, потому что у вас работает только одна копия ОС, и вам не нужно заранее выделять память и ядра ЦП для каждого экземпляра вашего приложения. Как и любое другое приложение, когда контейнеру требуется ЦП или память, он выделяет их, а затем освобождает их по завершении, позволяя другим приложениям использовать те же ограниченные ресурсы позже.
Они используют пространства имен ядра : каждый контейнер по умолчанию получит среду, в которой указаны следующие пространства имен:
- Mount: filesystems
/
в контейнере будет отличаться от файловой системы /
на хосте.
- PID: идентификаторы процесса, pid 1 в контейнере - это ваше запущенное приложение, этот pid будет отличаться при просмотре с хоста.
- Сеть: контейнеры работают с собственным интерфейсом обратной связи (127.0.0.1) и частным IP-адресом по умолчанию. Docker использует такие технологии, как мостовые сети Linux, для соединения нескольких контейнеров в их собственной частной сети.
- IPC: межпроцессное взаимодействие
- UTS: это включает имя хоста
- Пользователь: при желании вы можете сдвинуть все идентификаторы пользователя с идентификаторами хоста.
Каждое из этих пространств имен также не позволяет контейнеру видеть такие вещи, как файловая система или процессы на хосте или в других контейнерах, если вы явно не удалите эту изоляцию.
И другие инструменты безопасности Linux : контейнеры также используют другие функции безопасности, такие как SELinux, AppArmor, Capabilities и Seccomp, чтобы ограничить пользователей внутри контейнера, включая пользователя root, от возможности покинуть контейнер или негативно повлиять на хост.
Упакуйте свои приложения с их зависимостями для переносимости : упаковка приложения в контейнер включает в себя сборку не только самого приложения, но и всех зависимостей, необходимых для запуска этого приложения, в переносимый образ. Этот образ является базовой файловой системой, используемой для создания контейнера. Поскольку мы только изолируем приложение, эта файловая система не включает ядро и другие утилиты ОС, необходимые для виртуализации всей операционной системы. Таким образом, образ контейнера должен быть значительно меньше, чем образ эквивалентной виртуальной машины, что ускоряет развертывание на узлах сети. В результате контейнеры стали популярным вариантом для развертывания приложений в облаке и удаленных центрах обработки данных.
Может ли он заменить виртуальную машину, предназначенную для разработки?
Это зависит : если ваша среда разработки работает под управлением Linux, и вам либо не нужен доступ к аппаратным устройствам, либо допустимо иметь прямой доступ к физическому оборудованию, тогда вы обнаружите, что переход на контейнер Linux довольно прост. Идеальной целью для контейнера докеров являются такие приложения, как веб-API (например, приложение REST), к которым вы получаете доступ через сеть.
Проще говоря, в чем цель использования Docker в компаниях? Главное преимущество?
Dev or Ops : Docker обычно попадает в среду одним из двух путей. Разработчики ищут способ более быстрой разработки и локального тестирования своих приложений, а также операций, стремящихся выполнять большую рабочую нагрузку на меньшем количестве оборудования, чем это было бы возможно с виртуальными машинами.
Или Devops : одной из идеальных целей является немедленное использование Docker из инструмента развертывания CI / CD, компиляция приложения и немедленное создание образа, который развертывается для разработки, CI, prod и т. Д. Контейнеры часто сокращают время на перемещение приложения от проверки кода до его доступности для тестирования, что делает разработчиков более эффективными. А при правильном проектировании тот же образ, который был протестирован и одобрен разработчиками и инструментами CI, можно развернуть в производственной среде. Поскольку этот образ включает в себя все зависимости приложения, значительно снижается риск поломки в производственной среде, которая работала в процессе разработки.
Масштабируемость : последнее ключевое преимущество контейнеров, о котором я упомяну, заключается в том, что они разработаны с учетом горизонтальной масштабируемости. Когда у вас есть приложения без сохранения состояния при большой нагрузке, контейнеры намного проще и быстрее масштабируются из-за их меньшего размера изображения и меньших накладных расходов. По этой причине вы видите, что контейнеры используются многими крупными веб-компаниями, такими как Google и Netflix.