Описание:
Итак, мы выполнили команды в предыдущем задании, но что именно мы сделали?
В ходе выполнения задания были вызваны следующие команды:
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
- эта команда используется для запуска контейнера. Имеет большое количество параметров, которые позволяют определить поведение контейнера: его разрешения, сетевые настройки и другие параметры. Рассмотрим, что означают аргументы и опции, передаваемые в нашем случае:
-d
- detach - означает, что нужно запустить контейнер и оставить работать его на фоне. Без этого флага контейнер запускается так, как если бы мы запустили команду вручную - логи утилиты отправляются к нам в консоль, других действий при этом совершать мы не можем, а при закрытии консоли приложение останавливается.-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
, добавим к ней новые опции, но в этот раз большая часть работы – ваше практическое задание!
Полезные ссылки:
Задание. Правила:
- Окружение: После нажатия кнопки «Начать выполнение» для вас будет подготовлена виртуальная машина с Linux, а так же предоставлен логин и пароль для входа по SSH. Для получения административных привелегий воспользуйтесь sudo. Выполнять приведенное задание нужно на данной виртуальной машине.
- Время создания: Время создания окружения составляет порядка 10 минут.
- На выполнение задания вам будет отведено определенное время (вы увидите таймер после начала выполнения). По истечении этого времени окружение будет сброшено и вам придется повторить попытку. Количество пересдач не ограничено.
- Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания. Переменные могут отсутствовать, если они не требуются по заданию.
- После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку», и в течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку.
- В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.
- Также, если вы успешно сдали задание, но у вас остались вопросы — вы всегда сможете задать их куратору после проверки или в чате в любое удобное для вас время.
Задание:
- Скачайте конфигурационный файл nginx.
- Запустите контейнер со следующими параметрами:
- должен работать в фоне,
- слушает на хосте
127.0.0.1:8889
, - имеет имя
rbm-dkr-02
, - должен пробрасывать скачанный вами конфигурационный файл nginx внутрь контейнера как основной конфигурационный файл,
- образ -
nginx:stable
.
- Проверьте работу, обратившись к
127.0.0.1:8889
, - в ответ должно возвращать строкуWelcome to the training program RebrainMe: Docker!
- Выведите в консоли список запущенных контейнеров - контейнер должен быть запущен.
- Выполните подсчет
md5sum
конфигурационного файлаnginx
командой:docker exec -ti rbm-dkr-02 md5sum /etc/nginx/nginx.conf
. - Не останавливая контейнер, отправьте задание на проверку