Как войти в Docker контейнер — первые шаги

Задача «как войти в контейнер Docker» аналогична проблеме выхода из Vim. Да, чтобы делать эти вещи необходимо понимать что вы делаете и зачем.

Поэтому в этой статье я не буду расписывать что такое Docker. Я не смогу рассказать лучше чем это уже сделано:

  1. Вот, отличная статья на Хабре: Полное практическое руководство по Docker: с нуля до кластера на AWS;
  2. ещё Хабр — Образы и контейнеры Docker в картинках;
  3. А вот, прекрасное видео-введение в технологию:

После изучения этих материалов, смело ринулся в бой. Слукавлю, если буду говорить, что до этого не работал с контейнерами совсем. Я знаком с технологией LXC — обёрткой над которой, собственно и является Docker.

 

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

Как ни старался я избегать этой технологии, все равно она меня догнала и лягнула копытом в бок.

В один прекрасный день, пришел на боевой сервер, а там NGINX лежит и не хочет вставать, на все вопросы шлет меня проверять открыт ли 80-й порт.

sudo netstat -tulpn

Наблюдаю на 80-м порту висящий контейнер Docker.

Оказалось, внешний подрядчик внес корректировки и вернул сайт в трех контейнерах: back-end (Laravel), front-end (Vue-Nuxt) и база на Postgres.

Вот и свершилось. Придется «уметь» еще и в Docker.

 

Для начала разберем как войти в имеющийся контейнер.

Для выполнения команд в уже запущенных контейнерах существует команда docker exec.

Но чтобы получить доступ к контейнеру нужно знать его имя или идентификатор ID. Получить список всех контейнеров можно командой docker ps.

Как видите, на старом виртуальном серваке у меня установлен великолепный, опенсорсный файл-менеджер Sprut. Разработкой и поддержкой которого занимается отличный хостер Beget. Хостинг я беру только у них, а вот VPS у ребят дороговат.

Кстати! Про установку файлового менеджера Sprut я подробнее написал ЗДЕСЬ.

Столбцы CONTAINER ID или NAMES помогут нам в идентификации контейнера с которым будем производить манипуляции.

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

docker exec -it b5d116ad83cc bash

Мы обратились к Docker с командой exec которая запускает команду в работающем контейнере. Результатом выполнения будет окно терминала Bash нашего контейнера.

Что же произошло?

Для exec мы задали параметры:

«i» (—interactive) — держать STDIN открытым, даже если он не прикреплен.
«t» (—tty) — назначает псевдо-телетайп.

 

Вот синтаксис команды, если все еще не понятно:

 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

 

Весь список параметров для команды exec:

Имя, сокращение Описание
--detach , -d Автономный режим: запускать команду в фоновом режиме
--detach-keys Отменить последовательность клавиш для отсоединения контейнера
--env , -e Установить переменные среды
--env-file Прочитать в файле переменных окружения
--interactive , -i Держите STDIN открытым, даже если он не прикреплен
--privileged Предоставьте расширенные привилегии команде
--tty , -t Назначьте псевдо-телетайп
--user , -u Имя пользователя или UID (формат: <name | uid> [: <group | gid>])
--workdir , -w Рабочий каталог внутри контейнера

 

Для понимания команды exec обратимся к официальной документации.

Итак, команда запущенная через docker exec выполняется только во время работы основного процесса контейнера.

Команда использует каталог по умолчанию или тот, который указан как основной каталог в директиве WORKDIR нашего Dockerfile.

Команда должны быть исполняемым файлом. Пример: docker exec -ti my_container "echo a && echo b"не пойдет, но docker exec -ti my_container sh -c "echo a && echo b" будет.

Если контейнер приостановлен, то docker exec завершится с ошибкой.

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

Запустили псевдо-терминал, через который получили возможность управлять запущенным контейнером.

В следующей статье поговорим про копирование файлов и хранение данных внутри контейнеров.

Надеюсь, эти сведения кому-то помогут. Пишите в комментарии ваши вопросы, я с радостью отвечу на них.

StackUP