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

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

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

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

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

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

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

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

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

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

84
задан 2 March 2017 в 21:51
3 ответа

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

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

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

68
ответ дан 28 November 2019 в 19:25

Container werden auf einem einzelnen Kernel ausgeführt. Mit anderen Worten, alle Container haben einen einzelnen Kernel (Host-Betriebssystem). Auf der anderen Seite haben Hypervisoren mehrere Kernale. Jede virtuelle Maschine wird auf einem anderen Kernel ausgeführt.

Und "Docker Run Ubuntu" ist genau wie das Erstellen einer Chroot-Umgebung.

1
ответ дан 28 November 2019 в 19:25

Я мучился с тем же вопросом, который вы задаете, и вот к чему я пришел понимать.

В контейнере нет гостевой ОС, тут вы правы.

Тогда почему мы основываем контейнер на образе ОС?

Потому что вы захотите использовать некоторые команды, такие как (apt, ls, cd, pwd). Эти команды являются вызовами двоичных файлов, которые могут быть доступны вам в вашей основной ОС без какой-либо установки. Чтобы вы могли запускать эти команды внутри вашего образа докера, у вас должны быть двоичные файлы для них внутри вашего образа, из-за изоляции вы не просто выполняете двоичные файлы из основной ОС.

См. этот ответ, чтобы лучше понять, зачем нам вообще нужен базовый образ: https://stackoverflow.com/a/62384611

1
ответ дан 9 October 2020 в 03:28

Теги

Похожие вопросы