Задача «как войти в контейнер Docker» аналогична проблеме выхода из Vim. Да, чтобы делать эти вещи необходимо понимать что вы делаете и зачем.
Поэтому в этой статье я не буду расписывать что такое Docker. Я не смогу рассказать лучше чем это уже сделано:
- Вот, отличная статья на Хабре: Полное практическое руководство по Docker: с нуля до кластера на AWS;
- ещё Хабр — Образы и контейнеры Docker в картинках;
- А вот, прекрасное видео-введение в технологию:
После изучения этих материалов, смело ринулся в бой. Слукавлю, если буду говорить, что до этого не работал с контейнерами совсем. Я знаком с технологией LXC — обёрткой над которой, собственно и является Docker.
Этой статьей начну писать про практическое использование Docker, точнее, про мой личный опыт.
Как ни старался я избегать этой технологии, все равно она меня догнала и лягнула копытом в бок.
В один прекрасный день, пришел на боевой сервер, а там NGINX лежит и не хочет вставать, на все вопросы шлет меня проверять открыт ли 80-й порт.
1 |
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 помогут нам в идентификации контейнера с которым будем производить манипуляции.
Итак, у мы знаем уже достаточно, чтобы подключиться к контейнеру:
1 |
docker exec -it b5d116ad83cc bash |
Мы обратились к Docker с командой exec которая запускает команду в работающем контейнере. Результатом выполнения будет окно терминала Bash нашего контейнера.
Что же произошло?
Для exec
мы задали параметры:
«i» (—interactive) — держать STDIN открытым, даже если он не прикреплен.
«t» (—tty) — назначает псевдо-телетайп.
Вот синтаксис команды, если все еще не понятно:
1 |
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.
Запустили псевдо-терминал, через который получили возможность управлять запущенным контейнером.
В следующей статье поговорим про копирование файлов и хранение данных внутри контейнеров.
Надеюсь, эти сведения кому-то помогут. Пишите в комментарии ваши вопросы, я с радостью отвечу на них.