Никогда не пользовался докером, но при этом довольно часто пользовался различными виртуальными машинами и вроде понимаю суть виртуализации. Также пользовался и "песочницами".
Очень часто слышу упоминания докера, почитал о нём, очень заинтересовало, теперь пытаюсь разобраться.
Если я правильно понял, то докер это как "умная" виртуальная машина, т.е. если у тебя хост на Windows 10 и ты устанавливаешь в контейнер тот же Windows 10, то он не будет полностью устанавливать всю систему и занимать уйму места на диске, а будет запускать в изолированном контейнере, при этом используя системные файлы с системы хоста. Подобие "песочницы". Т.е. можно например, установить три такие системы, и при этом, в отличие от виртуальных машин - это будет занимать очень мало места, т.к. сохраняться будут только отличающиеся файлы.
Вроде всё выглядит просто, логично и понятно, но... если у меня на хосте Windows а в докере я хочу Ubuntu – так нельзя? Тогда нужна виртуальная машина с Ubuntu, и в неё нужно устанавливать докер?
Зашел в чудесное хранилище образов - hub.docker.com и совсем погряз в вопросах.
Я ожидал увидеть там "готовые образы виртуальных машин" для каких-либо задач, но кроме всего прочего, я увидел, например "phpmyadmin" - это ведь не ОС, не окружение, а всего-то набор php скриптов! Что в этом образе? Ведь для phpmyadmin нужна настроенная ОС, нужен сконфигурированный вебсервер, нужен интерпретатор php, нужна база данных. Я понимаю, что всё это "где-то" должно быть, но где? Все это скачается огромным образом целой ОС? Или все это должно быть на хосте? Или в докере, в родительском контейнере? Почему тогда не указаны какие-то зависимости, или не указано что будет скачиваться вместе с phpmyadmin?
Есть вообще образ для всего одного файла: "adminer" (аналог phpmyadmin, состоящий всего из одного php файла). Зачем нужен целый образ для одного php файла? Он используется как частица для других образов? Т.е. как зависимость, а не как полноценный рабочий образ?
Объясните пожалуйста, ничего не понимаю. Почему в образах с неким софтом не указывается какая нужна ОС и какое окружение? Или целая ОС со всем окружением будет скачиваться как зависимость?
крч поставили пхп, админер ваш, вашу БД, соединили внутри конфигами с досутпами и они работают спокойно
потом развернули в докере их на сервере или др машине (с линуксом или маком, не важно) и они также работают, тк изолирвоаны от вашей ОС и продолжают работать... работают в рамках Докера, который пользуется мощностями и ресурсами вашей машины через свой АПИ и свои реализации под платформу
Максим Федоров, да, кажется я начинаю понимать что я ошибочно мыслю именно виртуалками, а докер это нечто иное, более хитрое и интересное.
Получается, если я хочу заюзать пакет из докерхаба - мне не нужно думать о том что для этого нужно, не нужно беспокоиться чтоб была нужная ОС, чтоб было правильно настроенное окружение, я просто ставлю пакет и всё что для него нужно установится, причем то что можно - возьмет с хост машины, а то чего нет - подтянет.
Docker - это не виртуализация. Это построенная на базе линуксовых namespace и cgroups средство изоляции процессов.
Под Windows и Mac нет линуксовых namespace и cgroups поэтому приходится запускать контейнеры в виртуальной машине, что и создаёт путаницу.
> Почему в образах с неким софтом не указывается какая нужна ОС
Потому что сам образ строится на основе ОС.
Т.е. для этого "некоего софта" может быть несколько образов, на базе Ubuntu, Debian или (если образ правильный : ) на Alpine.
Только ОС в контейнере, как правило, сильно обрезанная. И да, ядро используется хостовой машины.
> если у меня на хосте Windows а в докере я хочу Ubuntu
Соответственно, берите абсолютно любой образ на основе Ubuntu.
> если у меня на хосте Windows
только имейте в виду, что (как минимум, до недавнего времени) Docker под Windows работал настолько через ..., что я, например, для работы с Docker-контейнерами, сидя под Win 10, таки поднимаю виртуалку с Alpine, и там уже поднимаю Docker.
Примерно с момента выхода WSL2 (а это 19 год) докер под винду (если его можно по прежнему называть "под винду") работает прекрасно. Юзать докер в виртуалке - это извращение.
D3lphi, во-первых, 19 - это вполне недавнее время
Во-вторых, для запуска виртуалок (без привязки к Docker), мне нужен VT-x, а виндовому Docker-у нужен Hyper-V, а тут или то, или то.
Кроме того, серваки у меня всегда на Линуксах, так что не надо тут про извращения, слыша звон, да не зная, что звенит.
@Levitskyi
И ещё.
Не рассматривайте Docker как замену виртуалкам.
Он совсем для другого.
Например, для того, чтобы "поднять MySQL" - условно одной командой docker run .../mysql
Или "поднять Gitlab" - docker run .../gitlab
Или "поднять LAMP"..
Впрочем, тут, хотя и действительно возможно так: # Launch a 18.04 based image (есть образы на 16 и 14 Убунте)
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1804
всё-таки более правильно поднять несколько отдельных контейнеров.
Случай, который вы привели с Adminer-ом, замечателен тем, что
- да, действительно, докер и такое позволяет
- это очень крайний случай, но мало ли, кому-то и такой образ может оказаться полезным
- обычно всё-таки до такого не доходит :)
@Levitskyi
И, кстати
Образу, где только Adminer, на самом деое, есть замечательное применение, и я сам, пожалуй, буду его использовать.
Смотрите.
Вы на хосте поднимаете MySQL в докере, и НЕ экспозите его порт 3306 наружу.
Это добавляет безопасности.
Но вам удобно лазить по БД Админером.
Если вы поставите Админер на постоянной основе - вся безопасность не только слетает, но и открывается дыра ещё больше.
Так вот.
Когда надо, вы поднимаете контейнер с Админером, полазили по БД - потушили Админер.
Достаточно хорошее решение.
(21 - 19) / (21 - 13) = 0,25, это не называется "третью"
Точно также как и "почти треть" не является "третью". Цифры были из головы взяты, по примерному ощущению времени.
3. WSL2 официально станет частью Windows 10 сборки 2004, которая будет выпущена 10 мая 2020 года
это не 2019
Однако, доступным WSL2 стал с лета 2019 года. К слову, использовать docker с WSL можно было еще с времен WSL 1 (а это 16 год), другое дело, что это было довольно костыльно.
В 2010 докера не было
Зато в ходу были виртуалки и связанные с ними технологии. Тот же Vagrant.
дорогуша
срать в комментах
Не могли бы вы уже заткнуться?
Серьезно у вас так подгорело, раз перешли на хамство. Достойное поведение.
вы я смотрю ниразу не сталкивались с снесовместимостью некоторого софта с musl
да и при сборке некоторых проектов alpine из-за необходимости пересобирать пакеты под musl может существенно затягивать билд (иногда до получаса)
Василий Назаров, я просто обратил внимание на не совсем корректное подчеркивание правильности образа - именно потому что он на альпайне
Это вызывает желание везде использовать альпайн...и многие это сделают неглядя и не изучая последствия.
p.s. я столкнулся с проблемами когда уже более сотни образов проекта где я работал были переведены на альпайн (благодаря статьям что это круто-здорово-современно), откатится было уже поздно...и пришлось страдать с глюками
Супер-мега-быстрый гайд для джунов.
Есть канал на ютубе = СЛЁРМ. Маст-хев для начинающих с их школой. Там прям все по полочкам разложено. Хочу помочь тебе обратить ВНИМАНИЕ на dockerfile - т.к на нем создается весь конфиг твоего будущего стека. Соответственно можешь загуглить и посмотреть, как он создается. А после его внедрения он получит тот же phpmyadmin, linux, php,js и т.д (ИМЕННО DOCKERFILE(DOCKER-COMPOSE) СЛУЖИТ НАСТРОЙКОЙ ВСЕХ БУДУЩИХ КОМПОНЕНТОВ)
И ты там спрашивал про то, что все компоненты скачиваются с ОС - не совсем, там урезанная версия OC, которая будет запускать только основные компоненты, а остальное ты сам дополняешь через dockerfile. Например тот же alpine весит не больше 15 мб,а остальная движуха по типу htop - ты уже сам закидываешь в dockerfile.
Если еще короче, то: Все, что ты делал ранее на линуксе и настраивал под себя - нужно закинуть в dockerfile. Вдруг ты хочешь свапнутся на другой пк, а у тебя линукс стоит вообще хз где, ты dockerfile забираешь с собой и на другом пк ставишь docker и все. Все действия, которые ты делал на протяжении 3-6 часов компилятся автоматически за тебя и ты получаешь свою ОС с настройками и движухой.
НО по мимо dockerfile, если вы в проде мутите "движуху "- скорее всего понадобится docker-compose. Просто загугли чем отличается одно от другого и там будет вся доступая инфа.
Далее... docker-hub. Это как маркет с приложениями. Уже все готово и если ты не хочешь разворачивать LAMP & WAMP, то просто скачиваешь один из пакетов и все запускается за 2 минуты.
И последнее...Если ты например для дома все это делаешь или тебе нужна вторая ОС для твоих задач, а не просто запустить сервер и готово, то есть WSL2 (привет win10). Туда же можно поставить ubuntu&debian&alpine и т.д
Как по мне...Докер для форточки - это мусор никому не нужный. Что там запускать и тестить - я не знаю. Разве что девопсам опыт получать дома...
UPD: Все твои вопросы описанные в теме - все они относятся к dockerfile. Там и ОС, там и стек, там и настройки.
Docker работает только под Линукс, потому что он работает благодаря namespace и cgroups фич, встроенных в ядро Линукс.
В винде запускается виртуальная машина с Линукс, в которой уже запускается докер.
Контейнер обозначает, что у тебя ядро операционной системы одно, но каждый контейнер считает что он единственный в системе, плюс подстраивается файловая система под образ докера.
В результате операционная система видит просто несколько запущенных процессов, а твоя программа запущенная в докере видит чистую ОС, в которой запущена только она одна, и на диске твой процесс видит только чистую ОС, файлы которые на самом деле есть на диске - не видны, их надо явно монтировать.
Так как разные Линуксы все равно юзают тоже ядро, то в образах и указано что именно установлено в Линукс, и образ PHP обозначает, что там будет образ линукса с установленным PHP
NubasLol,
Эм.. Нету там встроенного ядра.
Есть отдельная WSL подсистема, еще только начиная с десятки сервера, которая запускается как виртуальная машина. Но она не заменяет собой виндовое ядро.
NubasLol, Ну ядро это собственно та самая часть, которая рулит процессами. Она отвечает за многозадачность, за то, что ты можешь запустить собственно .exe или .com файл - их форматы должны уметь распознаваться ядром.
Ну и все остальное, что в ядро впихнет разработчик.
Ядро само по себе тоже программа, но написанная для запуска на платформе, а не на другой операицонке.
Поэтому предположим ты запускаешь виртуальный линукс под виндовс.
В зависимости от того, чем будет виртуализироваться - запускается некая оболочка-враппер, управляющий виртуальной машиной - гипервизор (vmware, virtualbox, и другие), который эмулирует железо и запускает ядро, другой операционки.
Эта другая операционка думает что она одна.
Но для хост системы (основной винды) виртуалка - это просто еще одна запущенная программа.