Почему мы используем базовый образ ОС с Docker, если в контейнерах нет гостевой ОС?

84

Я только начал изучать Докер, и меня это смущает. Как я читал на сайте Docker, контейнер отличается от виртуальной машины. Как я понял, контейнер - это просто песочница, внутри которой запускается целая изолированная файловая система.

Я также читал, что в контейнере не установлена ​​гостевая ОС. Вместо этого он опирается на ядро ​​ОС.

Все это хорошо. Меня смущает, что существуют образы Docker, названные в честь операционных систем. Мы видим такие изображения, как Ubuntu, Debian, Fedora, CentOS и так далее.

Моя точка зрения: что это за изображения на самом деле? Чем отличается создание контейнера на основе образа Debian от создания виртуальной машины и установки Debian?

Я думал, что в контейнерах не было гостевой ОС, но когда мы создаем образы, мы основываем их на некотором образе, названном в честь одной ОС.

Кроме того, в примерах, которые я видел, когда мы это делаем docker run ubuntu echo "hello world", кажется, что мы раскручиваем виртуальную машину с Ubuntu и заставляем ее запускать команду echo "hello world".

Таким же образом, когда мы это делаем docker run -it ubuntu /bin/bash, кажется, что мы раскручиваем виртуальную машину с Ubuntu и обращаемся к ней с помощью командной строки.

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

Идея состоит в том, что мы просто разделяем ядро ​​с хост-ОС (и, следовательно, у нас есть доступ к аппаратным ресурсам базовой машины, без необходимости виртуализации оборудования), но все еще используем файлы и двоичные файлы каждой отдельной системы в контейнерах для поддерживать любое приложение, которое мы хотим запустить?

user1620696
источник
2
На мой взгляд, ваши цели в виртуализации являются ключевыми. Если вам нужны библиотеки, языки и т. Д. В ОС, тогда контейнеры для ОС подойдут вам. Но если вам нужно только приложение в качестве компонентов, вам не обязательно использовать ОС в качестве базового образа. Я думаю, что эта статья могла бы объяснить это ясно blog.risingstack.com/…
метаморф

Ответы:

68

Поскольку все дистрибутивы Linux работают с одинаковым (да, немного упрощенным) ядром Linux и отличаются только пользовательским программным обеспечением, довольно легко смоделировать другую среду распространения - просто установив это пользовательское программное обеспечение и притворившись, что это другой дистрибутив. В частности, установка контейнера CentOS внутри ОС Ubuntu будет означать, что вы получите пользовательское пространство от CentOS, при этом продолжая работать с тем же ядром, а не с другим экземпляром ядра.

Таким образом, легкая виртуализация похожа на наличие изолированных отсеков в одной ОС. В отличие от настоящей виртуализации, в хост-системе установлена ​​еще одна полноценная ОС. Вот почему Docker не может запускать FreeBSD или Windows в Linux.

Если это будет проще, вы можете подумать, что docker - это очень сложная и продвинутая среда chroot.

drookie
источник
3
Вот почему я могу разместить свой скомпилированный код golang в пустом контейнере Scratch - потому что скомпилированному коду требуется только ядро?
Фрэнсис Нортон
Итак, как гостевая ОС узнает, как использовать ядро ​​операционной системы (и как это сделать)? AFAIK, базы образов докеров используют стандартные образы ОС. В вашем примере не похоже, что есть специальная сборка CentOS, которая знает, как использовать родительское ядро? Или это так же просто, как трюк с файловой системой (aufs), когда Docker перенаправляет гостевые (CentOS ') чтения / boot на хост (Ubuntu)? В этом случае гость (CentOS) установит свою собственную копию / boot, но она никогда не будет прочитана?
Джеймс С
Мне нравится ваше объяснение, но как вы объясните, как работают контейнеры Linux в Windows? Есть ли в Server 2016 и Windows 10 ядро ​​Linux для использования Docker? Вот почему эти версии необходимы?
duct_tape_coder
Это просто: они просто работают под полноценным стеком виртуализации Hyper-V, внутри собственной виртуальной машины Linux: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
Друки
1

Контейнеры работают на одном ядре. Другими словами, все контейнеры имеют одно ядро ​​(Host OS). В то время как гипервизоры с другой стороны имеют несколько ядер. Каждая виртуальная машина работает на разных ядрах.

А «Docker Run Ubuntu» - это то же самое, что создание среды chroot.

Шив Сандху
источник