Я только начал изучать 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, но при этом будете работать с тем же ядром, даже не с другим экземпляром ядра.
Так легкий виртуализация подобна изолированным отсекам внутри одной и той же ОС. Напротив, настоящая виртуализация предполагает наличие другой полноценной ОС внутри ОС хоста. Вот почему докер не может запускать FreeBSD или Windows внутри Linux.
Если это будет проще, вы можете подумать, что docker - это очень сложная и продвинутая среда chroot.
Контейнеры работают на одном ядре. Другими словами, все контейнеры имеют одно ядро (ОС хоста). С другой стороны, гипервизоры имеют несколько ядер. Каждая виртуальная машина работает на другом ядре.
А «docker run ubuntu» - это как создание chroot-окружения.