DKR 01: Basics. Знакомство с Docker
Описание:
Добро пожаловать на практикум по Docker!
В этом задании мы узнаем, что такое Docker, усвоим ключевые понятия и запустим наш первый контейнер.
Для того, чтобы хорошо понимать друг друга, введем терминологию, с которой нам будет нужно работать. Итак, начнем:
- Docker - это инструмент, упрощающий разработку, тестирование и выкладку приложений в контейнерах.
- Контейнер - это изолированная среда, в которой осуществляется полезная нагрузка (как правило - какое-то приложение), запущенная из образов.
- Образ - это упакованное в архив приложение со всеми требующимися зависимостями - как системными (скажем, библиотеки для работы с БД), так и с зависимостями приложения (Ruby Gems/NodeJS modules/...).
- Хостовая система - система, в которой запущен контейнер.
Здорово, с главными понятиями мы разобрались. Теперь оставим терминологию и подробно посмотрим, как работает Docker.
Docker – это инструмент, являющийся удобным интерфейсом для работы с контейнерами. Архив с ранее сформированным приложением (образ) запускается в изолированной от самой системы среде (контейнере) с использованием ядра системы, на которой и производится запуск контейнера.
Контейнер можно сравнить со следующими технологиями:
- Sandbox (песочница) - изолированная среда, в которой можно безопасно выполнять все нужные действия. Окружение привязано к какой-то сущности над ним – например, к браузеру, но действия в нем не приводят к каким-то изменениям в управляющей среде.
- Виртуальные машины - изолированная среда, которая работает независимо от вышестоящей сущности (хост-системы) со своей операционной системой, приложениями, сетью, дисками.
Docker. Основы Виртуализации
Docker. Внутреннее устройство
Разница между приведенными выше технологиями состоит в том, что контейнер является изолированной средой, однако использует ядро операционной хостовой системы, то есть исполняемая внутри среда обязательно использует то же ядро и это нельзя изменить, в отличие от виртуальных машин. При этом не требуется запуск большинства сервисов, необходимых при работе виртуальных машин: системы инициализации, логирования, системы работы с устройствами и любой другой системы, необходимой для работы операционной системы.
Из этого следует, что контейнеризация использует для своей работы часть технологий, которые предоставляются хостовой системой. Именно из-за этого есть жесткая привязка к среде, для которой создавался Docker, то есть к Linux.
Docker использует следующие возможности Linux:
- namespaces - технология, позволяющая изолировать:
- сеть
- процесс
- межпроцессорное взаимодействие
- файловые системы
- ядро ОС
- cgroups - позволяет ограничивать контейнер по ресурсам (RAM, CPU, I/O)
- UnionFS - тип файловой системы, позволяющий накладывать состояние файловой системы как слои: каждый последующий слой использует предыдущий в режиме Copy-on-write, то есть хранит изменения только от предыдущего слоя. Основые поддерживаемые реализации: aufs, btrfs, overlay2.
Важно отметить, что Docker подразумевает хранение образов в своем формате (libcontainer
). На данный момент этот формат стал де-факто форматом образов.
Появляется вопрос - если у меня система, отличная от Linux, то я не могу быть посвящен в дивный новый мир Docker?
Ответ - и да, и нет:
- Да - технологии, используемые в Docker, действительно жестко привязаны к Linux, поэтому без него запуск невозможен.
- Нет - запуск как под Mac OS X, так и под Windows возможен при помощи существующих средств так, как если бы у вас был Linux (нативные средства виртуализации в помощь).
Архитектура Docker выглядит следующим образом:

Как мы видим, общение с Docker демоном производится через REST API, но при первом рассмотрении можно сказать, что общение производится через Docker CLI - команду docker
. С помощью этой команды мы и будем общаться с Docker.
Итак, мы разобрались с терминологией и основными понятиями, приступим к личному знакомству с Docker.
Установка Docker
В данном задании мы запустим свой первый контейнер. Выполните команды, которые указаны в задании - подробнее каждый параметр мы разберем в следующем задании. Для этого и всех следующих заданий (где это требуется) сохраняйте команду, которую вы выполняете и её вывод. Это необходимо для проверки правильности выполнения.
Полезные ссылки:
- What is Docker
- Docker overview (official docs)
- Install Docker
- How does Docker run a Linux kernel under macOS host? (stackoverflow)
- Let me explain Docker for Mac in a little more detail (ycombinator)
- How does Docker for Windows run Linux containers? (stackoverflow)
- Разработка под Docker. Локальное окружение. Часть 1 (habr)
- Зачем и как использовать контейнеры: разбираемся с Docker, Kubernetes и другими инструментами
Задание. Правила:
- Окружение: После нажатия кнопки «Начать выполнение» для вас будет подготовлена виртуальная машина с Linux, а так же предоставлен логин и пароль для входа по SSH. Для получения административных привелегий воспользуйтесь sudo. Выполнять приведенное задание нужно на данной виртуальной машине.
- Время создания: Время создания окружения составляет порядка 10 минут.
- На выполнение задания вам будет отведено определенное время (вы увидите таймер после начала выполнения). По истечении этого времени окружение будет сброшено и вам придется повторить попытку. Количество пересдач не ограничено.
- Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания. Переменные могут отсутствовать, если они не требуются по заданию.
- После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку», и в течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку.
- В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.
- Также, если вы успешно сдали задание, но у вас остались вопросы — вы всегда сможете задать их куратору после проверки или в чате в любое удобное для вас время.
Задание:
- Установите Docker на предоставленную систему, как указано в официальной документации.
- Запустите контейнер на порту
28080
из официального образа nginx:docker run -d -p 127.0.0.1:28080:80 --name rbm-dkr-01 nginx:stable
. - Выведите в консоли список запущенных контейнеров командой:
docker ps
. - При помощи утилиты curl, запросите адрес
http://127.0.0.1:28080
- должна появиться приветственная страница nginx. Если не появляется, то запуск контейнера неуспешен по какой-то причине. - Остановите ранее запущенный контейнер командой:
docker stop rbm-dkr-01
. - Выполните команду
docker ps
, тем самым проверьте произошедшие изменения в списке запущенных контейнеров - список контейнеров должен быть пуст. - При помощи утилиты curl, запросите адрес
http://127.0.0.1:28080
- сейчас должна быть ошибка, поскольку мы уже удалили контейнер и ничего не слушается на этом порту. - При помощи команды
docker ps -a
выведите список всех контейнеров в системе - в списке будет ваш остановленный контейнер