Docker — программа, позволяющая операционной системе запускать процессы в изолированном окружении на базе специально созданных образов. Несмотря на то, что технологии, лежащие в основе Docker появились до него, именно Docker произвел революцию в том, как сегодня создается инфраструктура проектов, собираются и запускаются сервисы.
В этом курсе рассматриваются основы работы с Docker. Разбираются темы запуска и управления контейнерами. Рассказывается о том как опубликовать свой собственный образ на hub.docker.com.
Зачем нужен Docker
Docker — универсальный способ доставки приложений на машины (локальный компьютер или удаленные сервера) и их запуска в изолированном окружении.
Если вам приходилось собирать программы из исходников, то вы помните, что этот процесс включает в себя следующие шаги:
- Установить все необходимые зависимости под вашу операционную систему (их список еще надо найти)
- Скачать архив, распаковать
- Запустить конфигурирование
make configure
- Запустить компиляцию
make compile
- Установить
make install
Этот процесс нетривиальный и далеко не всегда быстрый. Иногда даже невыполнимый из-за непонятных ошибок. И это не говоря про загрязнение операционной системы.
Docker позволяет упростить эту процедуру до запуска одной команды, причем с почти 100%-й гарантией успеха.
Предположим, что мы решили разработать статический сайт на основе Jekyll. Jekyll — популярный генератор статических сайтов, написанный на Ruby. Например, гайды Хекслета находятся (вернее находились, но это не столь важно) на статическом сайте, сгенерированном с его помощью. И при его генерации использовался Docker (об этом можно прочитать в гайде: как делать блог на Jekyll).
Старый способ использования Jekyll требовал установки на вашу основную систему как минимум Ruby и самого Jekyll в виде гема (gem — название пакетов в Ruby). Причем, как и всегда в подобных вещах, Jekyll работает только с определенными версиями Ruby, что вносит свои проблемы при настройке. С Docker запуск Jekyll сводится к одной команде, выполняемой в директории с блогом.
Docker стал универсальным средством доставки софта независимо от его структуры, зависимостей и способа установки. Все, что нужно программам, распространяемым через Docker, находится внутри образа и не пересекаться с основной системой и другими контейнерами. Важность этого факта невозможно переоценить. Теперь обновление версий программ никак не задействует ни саму систему, ни другие программы. Сломаться больше ничего не может. Все, что нужно сделать, это скачать новый образ той программы, которую требуется обновить. Другими словами, Docker убрал проблему dependency hell и сделал инфраструктуру неизменяемой (immutable).
Больше всего Docker повлиял именно на серверную инфраструктуру. До эры Docker управление серверами было очень болезненным мероприятием, хотя уже существовали такие программы по управлению конфигурацией, как Chef, Puppet и Ansible.
Основная причина всех проблем — изменяемое состояние. Программы ставятся, обновляются, удаляются. Все это происходит в разное время на разных серверах и немного по-разному. Например, обновить версию PHP, Ruby или Python — это целое рискованное приключение. Проще поставить рядом новый сервер и переключиться на него. Идейно Docker позволяет сделать именно такое переключение, забыть про старое и поставить новое. Каждый запущенный контейнер живет в своем окружении, причем откат в такой системе очень прост: нужно всего лишь остановить новый контейнер и поднять старый на базе предыдущего образа.
Самостоятельная работа
Чтобы начать пользоваться Docker, необходимо установить движок — Docker Engine. На странице Install Docker Engine доступны ссылки для скачивания под все популярные платформы. Выберите вашу и установите Docker.
Если у вас по каким-то причинам не получается этого сделать или вы хотите попробовать поработать с ним онлайн, то воспользуйтесь сервисом play-with-docker. Выполните там регистрацию и начните экспериментировать с командами прямо в браузере.
В работе Docker есть одна деталь, которую важно знать при установке на Linux. По умолчанию Docker работает через unix сокет. В целях безопасности сокет закрыт для пользователей, не входящих в группу docker. И хотя установщик добавляет текущего пользователя в эту группу автоматически, Docker сразу не заработает. Дело в том, что если пользователь меняет группу сам себе, то ничего не изменится до тех пор, пока пользователь не перелогинится. Такова особенность работы ядра. Для проверки того, в какие группы входит ваш пользователь, можно набрать команду id
. Более подробно о добавлении пользователя в группу docker по ссылке в дополнительных материалах к уроку.
Если все было выполнено верно, команда docker version
выведет информацию о Docker:
docker version
Client: Docker Engine - Community
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:08:29 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.9
API version: 1.41 (minimum version 1.12)
Go version: go1.16.8
Git commit: 79ea9d3
Built: Mon Oct 4 16:06:37 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.11
GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.