В продолжение статьи установка Docker из серии программного обеспечения для DevOPS.

Для запуска контейнера не обязательно предварительно скачивать образ. Если он доступен, то будет загружен автоматически. Давайте попробуем запустить контейнер с Ubuntu. Мы не будем указывать репозиторий, и будет скачан последний официальный образ, поддерживаемый Canonical.

Помимо команды run, мы указали две опции: -i – контейнер должен запуститься в интерактивном режиме и -t – должен быть выделен псевдотерминал. Как видно из вывода, в контейнере мы имеем привилегии пользователя root, а в качестве имени узла отображается идентификатор контейнера. Последнее может быть справедливо не для всех контейнеров и зависит от разработчика контейнера. Проверим, что это действительно окружение Ubuntu:

Команду uname -a для подобных целей использовать не получится, поскольку контейнер работает с ядром хоста. В качестве одной из опций можно было бы задать уникальное имя контейнера, на которое можно для удобства ссылаться, помимо ID-контейнера. Она задается как —name <имя>. В случае если опция опущена, имя генерируется автоматически.
Автоматически генерируемые имена контейнеров не несут смысловой нагрузки, однако как интересный факт можно отметить, что имена генерируются случайным образом из прилагательного и имени известного ученого, изобретателя или хакера. В коде генератора для каждого имени можно найти краткое описание того, чем известен данный деятель.
Посмотреть список запущенных контейнеров можно командой docker ps. Для этого откроем второй терминал:

В случае если необходимо запустить контейнер с процессом, не предполагающим интерактивное взаимодействие, например с демоном, используется опция -d. Так и поступим со следующим контейнером:

Однако если отдать команду docker ps, контейнера, созданного из образа mysql, мы не обнаружим. Воспользуемся опцией -a, которая показывает все контейнеры, а не только запущенные:

В качестве статуса значится Exited. Для того чтобы разобраться с причиной, можно обратиться к журналу:

Очевидно, что при запуске контейнера не были указаны обязательные параметры. Ознакомиться с описанием переменных среды, необходимых для запуска контейнера, можно, найдя официальный образ MySQL на Docker Hub.
Повторим попытку, используя опцию -e, которая задает переменные окружения в контейнере:

При помощи следующей команды можно подключиться к работающему контейнеру:

Последним параметром выступает команда, которую мы хотим исполнить внутри контейнера. В данном случае это командный интерпретатор Bash. Опции -it аналогичны по назначению использованным ранее в команде docker run.
Фактически после запуска этой команды в контейнер mysql-test добавляется еще один процесс – bash. Это можно наглядно увидеть при помощи команды pstree. Сокращенный вывод до команды docker exec:

Также можно воспользоваться командой docker top, поскольку из полученного вывода pstree не очевидно, что процессы mysqld и bash принадлежат одному и тому же контейнеру:

Вывод после запуска команды docker exec:

Теперь посмотрим на вывод команды docker ps, которая покажет список запущенных контейнеров:

Мы видим, что в качестве команды, запущенной при старте контейнера, использовался скрипт docker-entrypoint.sh. Это достаточно распространенный способ инициализации программного обеспечения в контейнере. Если бы мы хотели в отладочных целях запустить контейнер, но вместо скрипта просто получить приглашение командной строки, мы бы модифицировали команду запуска уже известным вам образом:

Обратите внимание на одинаковый для двух контейнеров вывод в столбце COMMAND команды docker ps:

Однако команда pstree, запущенная в контейнере, покажет нам разницу в запуске контейнеров. Для mysql-test:


и для mysql-test2:

Отсюда мы видим, что во втором случае база данных MySQL запущена не была.
Мы познакомились с внутренними механизмами контейнеров и запустили первый контейнер Docker.

Если у Вас есть необходимость в установке и поддержке контейнеризации, обращайтесь office@itfb.com.ua