Docker является торговой маркой системы программного обеспечения для управления контейнерами. TL; DR:
- Контейнеры - это концепция упаковки.
- Виртуальные машины - это концепция совместимости.
- Виртуальные машины - это концепция безопасности.
Контейнер - это не процесс, а изоляция набора процессов в образе единой системы. Что изолированно? Прежде всего, пространство имен путей . Процессы в данном контейнере совместно используют пространство имен путей , поэтому они согласны с тем, что / usr / bin / env - это одно и то же. Два процесса в разных контейнерах или, возможно, внутри незагрязненной среды не обязательно будут видеть один и тот же файл для / usr / bin / env. Эта функция была функцией UNIX производных систем в течение как минимум 40 лет; в службе ch root () .
В последнее время контейнеры стали изолировать вещи, которые не находятся в пространстве имен, такие как процессы, идентификаторы пользователей и сетевые интерфейсы. В старых системах на основе ch root запуск ps в контейнере показал бы процессы, которых не было в этом контейнере; хотя специальная обработка была взломана, чтобы предотвратить получение пользователем root root доступа к базовой системе root.
В этих современных системах не только раздел pid разделен, но также идентификаторы пользователей , так что root в контейнере не соответствует root в общей системе.
Все это достигается путем управления многими функциями ядра в одном -системы-изображение. Программное обеспечение, которое управляет этими функциями: Docker, среди прочих.
Виртуальная машина не является частью образа одной системы. Каждая виртуальная машина - это собственный логический компьютер, на котором работает собственное ядро, оболочка и т. Д. c. При некоторой тщательной настройке вы можете сделать так, чтобы различные файлы появлялись во многих виртуальных машинах; но это ничем не отличается от монтирования файловых систем, экспортируемых сетевой файловой системой.
Зачем выбирать один из другого: контейнеры разделяют мою ОС и удобны для выхода из ада .so verionitis вызванные конфликтующими программными системами; Я могу упаковать свое программное обеспечение в контейнер, и оно изолировано от работающей системы. Я не могу, однако, упаковать ядро, в котором я нуждаюсь; так что, если мое программное обеспечение требует Ubuntu 14.02; и я бегу 18.04, контейнеры меня не спасут. Контейнеры - это концепция упаковки.
Виртуальные машины удобны для поддержки нескольких версий или типов операционных систем на одном компьютере. Поскольку каждая виртуальная машина работает с уникальным системным программным обеспечением, я могу запустить свое приложение 14.02 в своей системе 18.04, и ни одна из них не является мудрой. Виртуальные машины представляют собой концепцию совместимости.
Виртуальные машины также удобны в качестве уровня безопасности. Представьте, что на веб-странице есть js -бомба, которая может повредить мое ядро (я знаю, довольно натянуто). Если я запускаю браузер в контейнере, я повредил ядро. Если я запустил его в ВМ, я повредил это ядро ВМ - мне просто нужно удалить его или перемотать, и повреждение исчезло. ВМ - это концепция безопасности.