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

Я только начал изучать Docker, и есть кое-что, что меня очень смущает. Как я читал на веб-сайте 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 и получаем к ней доступ с помощью командной строки.

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

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

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

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

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

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

У контейнера нет гостевой ОС, в этом вы правы.

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

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

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

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

А "docker run ubuntu" - это то же самое, что создать среду chroot.

На мой взгляд, ваши цели в области виртуализации являются ключевыми. Если вам нужны библиотеки, языки и т.д. в ОС, то контейнеры ОС подходят для ваших нужд. Но если вам нужно только приложение в качестве компонентов, нет необходимости использовать ОС в качестве базового образа. Я думаю, что эта статья могла бы четко объяснить это Operating System Containers vs. Application Containers - RisingStack Engineering