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

Как мы видим, общение с Docker демоном производится через REST API, но при первом рассмотрении можно сказать, что общение производится через Docker CLI - команду docker. С помощью этой команды мы и будем общаться с Docker.

Итак, мы разобрались с терминологией и основными понятиями, приступим к личному знакомству с Docker.

Установка Docker

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

Полезные ссылки:

Задание. Правила:

  1. Окружение: После нажатия кнопки «Начать выполнение» для вас будет подготовлена виртуальная машина с Linux, а так же предоставлен логин и пароль для входа по SSH. Для получения административных привелегий воспользуйтесь sudo. Выполнять приведенное задание нужно на данной виртуальной машине.
  2. Время создания: Время создания окружения составляет порядка 10 минут.
  3. На выполнение задания вам будет отведено определенное время (вы увидите таймер после начала выполнения). По истечении этого времени окружение будет сброшено и вам придется повторить попытку. Количество пересдач не ограничено.
  4. Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания. Переменные могут отсутствовать, если они не требуются по заданию.
  5. После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку», и в течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку.
  6. В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.
  7. Также, если вы успешно сдали задание, но у вас остались вопросы — вы всегда сможете задать их куратору после проверки или в чате в любое удобное для вас время.

Задание:

  1. Установите Docker на предоставленную систему, как указано в официальной документации.
  2. Запустите контейнер на порту 28080 из официального образа nginx: docker run -d -p 127.0.0.1:28080:80 --name rbm-dkr-01 nginx:stable.
  3. Выведите в консоли список запущенных контейнеров командой: docker ps.
  4. При помощи утилиты curl, запросите адрес http://127.0.0.1:28080 - должна появиться приветственная страница nginx. Если не появляется, то запуск контейнера неуспешен по какой-то причине.
  5. Остановите ранее запущенный контейнер командой: docker stop rbm-dkr-01.
  6. Выполните команду docker ps, тем самым проверьте произошедшие изменения в списке запущенных контейнеров - список контейнеров должен быть пуст.
  7. При помощи утилиты curl, запросите адрес http://127.0.0.1:28080 - сейчас должна быть ошибка, поскольку мы уже удалили контейнер и ничего не слушается на этом порту.
  8. При помощи команды docker ps -a выведите список всех контейнеров в системе - в списке будет ваш остановленный контейнер