Докер, что это такое и для чего

112

Я слышал о Docker несколько дней назад и хотел познакомиться.

Но на самом деле я не знаю, для чего предназначен этот «контейнер»?

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

Может ли он заменить виртуальную машину, предназначенную для разработки?

Проще говоря, в чем цель использования Docker в компаниях? Главное преимущество?

mfrachet
источник
Мне так проще shivab.com/blog/docker/2019/01/10/…
иллюзионист

Ответы:

117

ВМ: Используя программное обеспечение ВМ, например, Ubuntu можно установить внутри Windows. И они оба побежали бы одновременно. Это похоже на создание ПК с его основными компонентами, такими как ЦП, ОЗУ, диски, сетевые карты и т. Д., Внутри операционной системы и сборка их для работы, как если бы это был настоящий ПК. Таким образом, виртуальный ПК становится «гостем» внутри реального ПК, который со своей операционной системой называется хостом.

Контейнер: он такой же, как указано выше, но вместо использования всей операционной системы он сокращает «ненужные» компоненты виртуальной ОС, чтобы создать ее минимальную версию. Это привело к созданию LXC (контейнеров Linux), которые быстрее виртуальных машин.

Докер: контейнер докеров , в отличие от виртуальной машины и контейнера, не требует отдельной операционной системы и не включает в себя ее. Вместо этого он полагается на функциональность ядра Linux и использует изоляцию ресурсов.
Назначение Docker: его основная цель - автоматизировать развертывание приложений внутри программных контейнеров и автоматизацию виртуализации на уровне операционной системы в Linux. Он более легкий, чем стандартные контейнеры, и загружается за секунды. ggg

(Обратите внимание, что в случае Docker не требуется гостевая ОС)

Гурав
источник
1
Я попытался найти ресурсы, касающиеся рабочего процесса разработки-развертывания докеров, но, похоже, ничего не нашел. Допустим, у меня есть среда lampp с laravel + angular4. Могу ли я поделиться определенным файлом с товарищами по команде? Как мне отредактировать исходный код приложения (php html js / ts), если я поместил его в контейнер? Можем ли мы по-прежнему использовать git / svn в нашем исходном коде?
anaval
13
VM означает «Виртуальная машина». Не нужно называть это «ВМ-машиной», потому что тогда она становится «Виртуальной машиной». :)
Dzhuneyt
32

[Обратите внимание, что этот ответ касается контейнеров 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.

BMitch
источник
2
+1 Полностью согласен с вашим ответом, особенно с частью «может ли он заменить виртуальную машину (и)». Я вижу много комментариев в другом месте, в которых подчеркивается, что Docker не является виртуальной машиной, но, по опыту, для многих случаев использования он работает так же хорошо или даже является лучшей альтернативой. Что вы имеете в виду, когда сказали «приемлемо иметь прямой доступ к физическому оборудованию»?
Tyress
2
@tyress, если ваш хост - Linux, вы можете монтировать устройства прямо в контейнер Linux. Я видел это со звуковыми устройствами, но в / dev можно добавить что угодно. Это позволяет обойти некоторую изоляцию контейнера, но имеет смысл для определенных задач, таких как настольные приложения.
BMitch
Это удивительно. Я не думаю, что.
Tyress
@BMitch: очень чистый и элегантный ответ, спасибо !! Думаю, теперь я могу представить себе, что такое контейнер ... однако было бы здорово, если бы вы могли обновить свой ответ, указав, как контейнер связан с докером? По сравнению с контейнером и виртуальной машиной докер эквивалентен гипервизору?
rahulaga_dev
1
Docker - это инструмент, который реализует контейнеры, а также предоставляет остальную часть необходимой экосистемы, такую ​​как реестр в концентраторе докеров и среды рабочего стола, в которые встроена виртуальная машина для запуска контейнеров Linux.
BMitch
6

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

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

Давайте возьмем пример, что мы разрабатываем приложение с использованием служб nodeJs, MongoDB, Redis, RabbitMQ и т. Д. [Вы можете думать о любых других службах].

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

  1. Совместимость сервисов (nodeJs, mongoDB, Redis, RabbitMQ и т. Д.) С ОС (даже после нахождения совместимых версий с ОС, если что-то непредвиденное произойдет, связанное с версиями, нам нужно еще раз проверить совместимость и исправить это).

  2. Если для двух компонентов системы требуется библиотека / зависимость с разными версиями в приложении в ОС (это требует повторного просмотра каждый раз в случае неожиданного поведения приложения из-за проблемы с версией библиотеки и зависимости).

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

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

  4. У нас также есть разные среды, такие как разработка, тестирование и производство. Если одному разработчику удобно использовать одну ОС, а другому - другую ОС И в этом случае мы не можем гарантировать, что наше приложение будет вести себя одинаково в этих двух разных ситуациях. .

Все это усложняет нам жизнь в процессе разработки , тестирования и доставки приложений.

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

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

введите описание изображения здесь

Как Docker решает вышеуказанные проблемы -

  1. Мы можем запускать каждый сервисный компонент (nodeJs, MongoDB, Redis, RabbitMQ) в разных контейнерах со своими зависимостями и библиотеками в одной ОС, но в разных средах.

  2. Нам нужно просто запустить конфигурацию докера один раз, тогда все разработчики из нашей команды смогут начать работу с простой командой запуска докера, мы сэкономили здесь много времени и усилий :) .

Таким образом, контейнеры - это изолированные среды со всеми зависимостями и библиотеками, объединенными вместе с собственными. процессом и сетевыми интерфейсами и креплениями .

Все контейнеры используют одни и те же ресурсы ОС, поэтому им требуется меньше времени на загрузку и эффективное использование ЦП с меньшими затратами на оборудование.

Надеюсь, это будет полезно.

Сиярам Малав
источник
2

Позвольте мне попытаться дать как можно более простые ответы:

Но на самом деле я не знаю, для чего предназначен этот «контейнер»?

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

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

Контейнер отличается от изображения тем, что контейнер является экземпляром среды выполнения изображения - аналогично тому, как объекты являются экземплярами классов среды выполнения, если вы знакомы с ООП.

Может ли он заменить виртуальную машину, предназначенную для разработки?

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

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

Проще говоря, в чем цель использования Docker в компаниях? Главное преимущество?

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

Кроме того, поскольку контейнеры Docker доступны только для чтения, они обеспечивают соблюдение ключевого принципа DevOps: производственные сервисы должны оставаться неизменными.

Некоторые общие преимущества их использования:

  • Отличная изоляция сервисов
  • Отличная управляемость, поскольку контейнеры содержат все, что нужно приложению
  • Инкапсуляция технологии реализации (в контейнерах)
  • Эффективное использование ресурсов (благодаря облегченной виртуализации ОС) по сравнению с виртуальными машинами
  • Быстрое развертывание
Джоэл Х
источник