Описание:

Итак, мы выполнили команды в предыдущем задании, но что именно мы сделали?

В ходе выполнения задания были вызваны следующие команды:

  • docker run -d -p 127.0.0.1:28080:80 --name rbm-dkr-01 nginx:stable
  • docker ps
  • docker stop rbm-dkr-01

Мы видим, что все команды начинаются с вызова утилиты docker - это как раз тот Docker CLI, который на картинке с архитектурой из прошлого задания был на внешнем круге нашей схемы. Под капотом Docker CLI обращается к Docker REST API, который отправляет системные запросы к Docker Daemon для исполнения ваших команд.

Перед разбором команд определимся с условными обозначениями:

  • $VAR_NAME - переменная, задаваемая вне задачи, она может иметь любое значение в зависимости от контекста. К примеру: docker run $IMAGE.
  • [] - необязательное содержимое внутри квадратных скобок, команда может работать без него. К примеру: docker run [-d] $IMAGE[:$TAG].
  • [() ...] - тоже необязательное содержимое внутри квадратных скобок, но команда внутри круглых скобок может повторяться сколько угодно раз. К примеру: если в шаблон docker run [-d] [(-p $HOST_PORT:$CONTAINER_PORT) ...] $IMAGE[:$TAG] выполнить подстановку значений (у вас значения могут отличаться), в этом случае будет такой результат docker run -d -p 80:80 -p 443:443 nginx:stable - далее разберем параметры детальнее.
  • ($VAR1|$VAR2) - возможные значения - VAR1 или VAR2.

Каждая команда поддерживает вывод справки с добавлением флага --help в конце, что приводит к выводу абсолютно всех ключей, которые можно передавать конкретной команде с кратким описанием. Более развернутое описание можно найти в официальной документации.

А теперь приступим к детальному разбору каждой из вышеприведенных команд:

run

docker run - эта команда используется для запуска контейнера. Имеет большое количество параметров, которые позволяют определить поведение контейнера: его разрешения, сетевые настройки и другие параметры. Рассмотрим, что означают аргументы и опции, передаваемые в нашем случае:

  1. -d - detach - означает, что нужно запустить контейнер и оставить работать его на фоне. Без этого флага контейнер запускается так, как если бы мы запустили команду вручную - логи утилиты отправляются к нам в консоль, других действий при этом совершать мы не можем, а при закрытии консоли приложение останавливается.
  2. -p 127.0.0.1:28080:80 - данный параметр определяет перенаправление сетевых портов (port mapping), то есть показывает, как мы можем получить доступ к приложению внутри нашего контейнера из хостовой системы так, будто оно было запущено на самой хостовой системе.

Общий синтаксис флага следующий:

-p [[$HOST_LISTEN_ADDRESS:]$HOST_LISTEN_PORT:]$CONTAINER_LISTEN_PORT[/$PROTOCOL] , где

  • HOST_LISTEN_ADDRESS - адрес, на котором должен быть проброшен порт на хосте. По умолчанию - 0.0.0.0, то есть запросы слушаются на всех адресах. Возможные значения: (ip4|ipv6) адрес.
  • HOST_LISTEN_PORT - порт, на который должен быть проброшен порт на хосте. При отсутствии использует случайный порт.`.
  • CONTAINER_LISTEN_PORT - порт, который должен быть проброшен на хост. Возможные значения: (0 .. 65535).
  • PROTOCOL - протокол, который требуется пробросить. Возможные значения: (udp|tcp).

После подстановки значений (у вас они могут отличаться), флаг будет выглядеть таким образом: -p 192.168.1.100:8080:80/tcp. 3. --name rbm-dkr-01 - имя контейнера. В случае, если опция не задана, Docker сгенерирует случайное имя. 4. nginx:stable - имя образа и его тег. Из названия видно, что образ запускает nginx из ветки stable (версии с четной минорной версией). Пока условимся, что у нас есть только такой образ, - в последующих заданиях мы поясним это подробно.

ps

docker ps - это команда, которая выводит список работающих контейнеров, их имена, используемый для запуска образ, порты и прочую информацию, не слишком важную для нас сейчас. По умолчанию команда выводит именно работающие контейнеры, однако с использованием флага -a можно получить список всех контейнеров, которые есть в нашей системе, в том числе и остановленные.

rm

docker rm --force - эта команда используется для удаления остановленных контейнеров.

В вызове мы использовали флаг --force, без которого, если мы попытаемся вызвать команду на работающий контейнер, нам будет указано на необходимость предварительной остановки контейнера, а только потом можно сделать удаление.

Как правило, использование docker rm --force сродни использованию git push --force, то есть использование возможно, но только обдуманное.

В этом задании мы рассмотрели ограниченное количество команд, но это не все, с чем работает Docker. В следующих заданиях мы с вами познакомимся и с другими командами.

Теперь усложним задачу - мы расширим текущую команду run, добавим к ней новые опции, но в этот раз большая часть работы – ваше практическое задание!

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

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

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

Задание:

  1. Скачайте конфигурационный файл nginx.
  2. Запустите контейнер со следующими параметрами:
  • должен работать в фоне,
  • слушает на хосте 127.0.0.1:8889,
  • имеет имя rbm-dkr-02,
  • должен пробрасывать скачанный вами конфигурационный файл nginx внутрь контейнера как основной конфигурационный файл,
  • образ - nginx:stable.
  1. Проверьте работу, обратившись к 127.0.0.1:8889, - в ответ должно возвращать строку Welcome to the training program RebrainMe: Docker!
  2. Выведите в консоли список запущенных контейнеров - контейнер должен быть запущен.
  3. Выполните подсчет md5sum конфигурационного файла nginx командой: docker exec -ti rbm-dkr-02 md5sum /etc/nginx/nginx.conf.
  4. Не останавливая контейнер, отправьте задание на проверку