Почему образ докера Ubuntu не является виртуальной машиной

Я понимаю большую разницу между виртуальными машинами и контейнерами. Но это сбило меня с толку тем, как вообще может существовать контейнер Ubuntu. Мне это кажется противоречивым, поскольку Ubuntu — это ОС.

https://hub.docker.com/_/ubuntu

Разве это не целая гостевая ОС? Так что же делает это контейнером над виртуальной машиной? Или грань между контейнером и виртуальной машиной размыта?

Я пытался найти это в Google, но единственные результаты, которые я нашел, - это классические ответы VM vs container, которые на самом деле не то, о чем я спрашиваю, я не думаю.

Изменить - я обновил, чтобы попытаться уточнить мой вопрос.


person Winston Henke    schedule 29.12.2018    source источник
comment
Краткий ответ: Docker разделяет ядро ​​хоста и физические устройства; виртуальная машина имеет дублированное ядро ​​и эмулированное оборудование. Контейнер Docker также обычно не запускает все, что связано с пользовательским пространством, а запускает только некоторое целевое приложение с доступным этим пользовательским пространством. (Похоже на Ubuntu, но не использует systemd, cron, sshd, ...)   -  person David Maze    schedule 29.12.2018
comment
Я обновил свой вопрос, чтобы попытаться уточнить. Я не спрашиваю о разнице между виртуальной машиной и контейнером. Но подробнее о том, как целая ОС, такая как Ubuntu, может быть контейнером, почему она не называется просто виртуальной машиной в этот момент.   -  person Winston Henke    schedule 29.12.2018
comment
Контейнер Docker для Ubuntu не является полноценной ОС; он не запускает собственное ядро. Конечно, это целое пользовательское пространство ОС, но, в общем, работает ли оно со своим собственным кольцом-0 или просто как куча пространств имен внутри чьего-то другого ядра, это как раз и есть различие.   -  person Charles Duffy    schedule 29.12.2018
comment
@CharlesDuffy, который отвечает на мой вопрос, спасибо. Это был мой первый пост на Sack Overflow, и я не уверен, почему за него проголосовали. Я не думаю, что связанный вопрос - это то же самое, что я задаю.   -  person Winston Henke    schedule 29.12.2018
comment
@WinstonHenke, вопрос не в написании кода, и разумно ожидать, что ответ не изменит как вы пишете код (то есть как вы относитесь к практике разработки программного обеспечения, важно сделать это практическим вопросом о разработке программного обеспечения), поэтому здесь это не по теме. В сети Stack Exchange есть и другие сайты, где он вполне может подойти, но это не совсем соответствует рекомендациям для SO.   -  person Charles Duffy    schedule 30.12.2018
comment
... и, честно говоря, ответы на связанный дубликат do на 100 % ясно показывают, что в контейнере Docker ядро ​​используется совместно с хостом.   -  person Charles Duffy    schedule 30.12.2018
comment
@CharlesDuffy Достаточно честно о том, почему этот вопрос не относится к SO. И я согласен с тем, что ответы на связанный дубликат на 100 % ясно показывают, что в контейнере Docker ядро ​​используется совместно с хостом. Но это та часть, которая вызвала мое замешательство. Это заявление не имело для меня никакого смысла с идеей контейнера Ubuntu, пока не было выяснено, что на самом деле это не полноценная Ubuntu с ядром Linux, и я не думаю, что связанная статья объясняет это. Возможно, я тоже не совсем правильно сформулировал вопрос :( но спасибо за ваше время.   -  person Winston Henke    schedule 30.12.2018


Ответы (1)


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

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

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

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

Чтобы ответить на ваш вопрос:

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

  • Вы предположили неправильно. Вам нужно включить ОС в свой Dockerfile, а затем код приложения. Однако в зависимости от вашего приложения в Docker Hub существуют образы ОС разных размеров, например наносервер Windows, если у вас есть только простое консольное приложение, которое вы хотите запустить. Тогда вам не нужна виртуальная машина с полнофункциональной ОС. Еще одна вещь, которую вы можете сделать, — это запустить поэтапные сборки в вашем файле докеров, которые будут компилировать ваше приложение и включать только среду выполнения в ваш образ, эффективно уменьшая его размер.

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

Я могу порекомендовать следующую книгу, если вы работаете с контейнерами Windows, чтобы лучше понять назначение докера: https://www.packtpub.com/virtualization-and-cloud/docker-windows

Если нет, то Packt предлагает другие книги по докеру для Linux.

Надеюсь, это ответит на ваш вопрос :)

person hatati    schedule 29.12.2018
comment
Я отредактировал свой вопрос. На самом деле я не спрашиваю, в чем разница между виртуальной машиной и контейнером, я это понимаю. Чего я не понимаю, так это того, как целая ОС, такая как Ubuntu, может быть контейнером... Разве это не просто виртуальная машина? - person Winston Henke; 29.12.2018
comment
Образ Ubuntu не содержит ОС ВСЮ, а только необходимые элементы, чтобы сделать ее легковесной. Как объяснил Кен Кокрейн в stackoverflow.com/questions/16047306/: полностью виртуализированная система получает свой собственный набор ресурсов, выделенных ей, и использует минимальное совместное использование. Вы получаете больше изоляции, но это намного тяжелее. С Docker вы получаете меньшую изоляцию, но контейнеры легкие. Таким образом, вы можете легко запускать тысячи контейнеров на хосте, и он даже не моргнет. Так что да, это просто виртуальная машина без графического интерфейса. - person hatati; 29.12.2018
comment
Я не могу найти никакой документации по этому поводу. Вы говорите, что образ Ubuntu не содержит ВСЮ ОС. Но я предполагаю, что в нем есть часть или большая часть ядра Linux, что делает его полноценной операционной системой. Что в основном является сердцем моего вопроса. - person Winston Henke; 29.12.2018
comment
Контейнер (Linux) не содержит собственное ядро. Это чрезвычайно существенная разница. - person David Maze; 29.12.2018
comment
@DavidMaze спасибо, что ответили на мой вопрос - person Winston Henke; 29.12.2018