[HowTo] Как зайти в контейнер и выполнить команду внутри

Привет, %username% ! Я с недавних пор начал изучать контейнеризацию на базе Docker. И вот в определенный момент мне понадобилось подправить пару файлов внутри готового и запущенного контейнера gitlab . Оказалось это делается довольно просто.
Для того, чтобы выполнять команды внутри контейнера, надо для начала в него попасть. Для моих нужд достаточно одной простой команды. Но перед тем как попасть в контейнер, нам необходимо получить ID необходимого контейнера. Делается это командой:
docker ps
После получения списка всех запущенных контейнеров, мы выбираем (в первом столбце) ID нужного нам контейнера и подставляем в следующую команду вместо :
docker exec -it bash
Данная команда в контейнере запустит bash прямо в вашей консоли. После чего, можно выполнять внутри контейнера все правки, которые нам необходимы. Главное не забыть сделать коммит контейнера перед тем, как его убить или остановить, ибо в противном случае все ваши правки не сохранятся.
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.
- docker
- linux
Как выполнить подключение к контейнеру в Docker
Контейнер Docker — легковесная и изолированная среда, в которой можно запускать приложения и их зависимости. Он использует контейнеризацию для упаковки приложений и всех необходимых компонентов (таких как библиотеки, файлы конфигурации и т. д.) в единый объект, который можно перенести и запустить на любой системе, поддерживающей Docker.
Для чего необходимо подключение к контейнеру?
Подключение к контейнеру в Docker позволяет взаимодействовать с ним, выполнять команды, настраивать и тестировать приложения, а также отслеживать и анализировать работу контейнера. Это полезно для разработчиков при отладке и тестировании приложений, а также для администраторов при управлении и мониторинге контейнеров. Подключение к контейнеру также позволяет получить доступ к его файловой системе, логам и другим ресурсам для анализа и устранения проблем.
Подключаемся к контейнеру
Для подключения к контейнеру в Docker необходимо выполнить следующие шаги:
1. Убедитесь, что Docker установлен и запущен на вашем компьютере.
2. Откройте командную строку или терминал.
3. Запустите контейнер, к которому вы хотите подключиться, с помощью команды docker run. Например:
docker run -it
Здесь -it означает, что вы хотите запустить контейнер в интерактивном режиме с поддержкой терминала.
4. Если контейнер успешно запущен, вы будете перенаправлены в его внутреннюю оболочку или командную строку.
5. Теперь вы можете выполнять команды и взаимодействовать с контейнером так, как будто это обычный компьютер или сервер.
6. Чтобы выйти из контейнера, нажмите сочетание клавиш Ctrl + D или выполните команду exit.
Обратите внимание, что для успешного подключения к контейнеру вы должны знать его имя или идентификатор. Вы также можете использовать флаги и параметры команды docker run для настройки подключения к контейнеру, например, для проброса портов или монтирования директорий.
Как войти в Docker контейнер — первые шаги

DockerЗаметки линуксойда
Задача «как войти в контейнер Docker» аналогична проблеме выхода из Vim. Да, чтобы делать эти вещи необходимо понимать что вы делаете и зачем.
Поэтому в этой статье я не буду расписывать что такое Docker. Я не смогу рассказать лучше чем это уже сделано:
- Вот, отличная статья на Хабре: Полное практическое руководство по Docker: с нуля до кластера на AWS;
- ещё Хабр — Образы и контейнеры Docker в картинках;
- А вот, прекрасное видео-введение в технологию:
После изучения этих материалов, смело ринулся в бой. Слукавлю, если буду говорить, что до этого не работал с контейнерами совсем. Я знаком с технологией 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 (формат: [: ]) |
| —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.
Запустили псевдо-терминал, через который получили возможность управлять запущенным контейнером.
В следующей статье поговорим про копирование файлов и хранение данных внутри контейнеров.
Надеюсь, эти сведения кому-то помогут. Пишите в комментарии ваши вопросы, я с радостью отвечу на них.
Как войти в запущенный Docker-контейнер и почему так делать не надо
– ключ -a покажет нам все контейнеры, в том числе погашенные. В выключенные вы, естественно, не зайдёте. И это первая причина не лезть своими шаловливыми ручками в контейнер. Нет, правда, что вы там хотите посмотреть?
Логи вы можете увидеть через
А если вы их там не видите – а вы вообще правильно используете Docker?
О вреде старых привычек
Часто вижу «оригинальные» подходы а ля «запущу ка я supervisord как entry point, а в нём подниму все остальные процессы». Спорить не буду – такой финт ушами пройдёт, но он возникает в основном от того, что лень разбираться с Docker, что повлечёт весьма странное поведение системы.
Используйте стандартные средства, не скупитесь на контейнеры: один контейнер – один небольшой простой процесс.
И если вам нужно перезапускать упавшие сервисы (некоторые пеняют на это) – используйте политики перезапуска Docker.
О шаловливых ручонках
Лезть в Docker-контейнер вредно потому, что вы решите (если решите) проблему для одного конкретного контейнера, который при следующем перезапуске будет перераскатан из образа. Стоит относиться к нему как к процессу без состояния – в любой момент могут быть потеряны все изменения, данные.
Поэтому и ковыряться в контейнере может иметь смысл, если вы разрабатываете в сервис в контейнере, но вносите все фиксы именно в образ.
Используйте внешние специализированные средства
Но что же делать, если вам таки надо иногда смотреть на нагрузку, читать логи и т.д.? Всё это стоит автоматизировать и упаковать в ваши сервисы, которые крутятся в Docker-контейнерах.
К примеру, логи можно собирать через filebeat, метрики через prometheus, а про ошибки узнавать не от пользователей, а через sentry.
Таким образом, на не нужно ходить в контейнер, а данные не потеряются при его дропе / перезапуске / выходе из строя хостовой машины. Вместо этого мы получаем централизованную систему для обработки служебных данных. А учитывая, что один запрос может ходить между несколькими сервисами, так ещё и проще будет разобраться в судьбе этого запроса, чем лезть на десяток машин.
Безопасность
Заметки об обеспечении безопасности в информационных системах. Настройка брендмауэров (фаерволов) на операционных системах Linux, Windows, MacOS, Unix. Новости об интересных уязвимостях в системах, мониторинге использования ресурсов, алертинге подозрительных действий. Работа …

Об управлении и настройках средства контейнеризации Docker (докер). Команды для настройки и эксплуатации Docker. Настройка сети, сборка образов, запуск программ в контейнере. Запускаем несколько сервисов в одной сети с помощью …

Виртуализация
Средства виртуализации, средства управления виртуальными серверами

Также может быть вам интересно:
- Как сделать свою middleware в Django (с примерами)
- Настройка журналирования (логирования) в Python с примерами
- Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable
- Разграничение прав доступа на Django сайте
- Пользователи и их создание в Django — своя регистрация на сайте
Свежее на «Цифре»
MessageId или как дебажить систему с минимумом проблем
Программы, 09.09.2023
Проверочный список для выпуска промышленных приложений с иллюстрациями
Работа и управление, 30.07.2023
В Google Pixel и Windows Snipping Tool есть возможность восстановления обрезанных изображений
Новости, 23.03.2023
Два подарка «под ёлочку» от Heroes of Might and Magic
Новости, 25.12.2022
Вышел Pulsar – редактор кода на основе Atom
Новости, 25.12.2022
Ленивый backup PostgreSQL
Программы, 17.12.2022
Google анонсировала OSV-Scanner: сканер уязвимостей в программных проектах
Новости, 16.12.2022

Найдена уязвимость в утилите ping для FreeBSD
Во FreeBSD найдена уязвимость, позволяющая выполнить код от пользователя root. Самое забавное, что на этот раз «дыра» была обнаружена в …
Консольные команды
adb • Android Debug Bridge: связь с …
Общие команды
bat • Выводит и объединяет файлы. Как …
Общие команды
beep • Утилита для подачи звукового сигнала …
fuck • Исправляет предыдущую команду в консоли. …
Общие команды
losetup • Установка и настройка петлевых устройств. …
sort • Сортирует строки в текстовом файле. …
Общие команды
virsh • Менеджер гостевых систем virsh. Примечание: …
Общие команды

Как удалить все Docker образы и контейнеры
Не всегда нужно удалять всё, но объяснение данного «рецепта» объяснит как в целом удалять образы и контейнеры.

Решаем проблему ERROR 1348 column password is not updatable при обновлении пароля root в MySQL / MariaDB
В MySQL есть временами непонятные ограничения, которые не позволяют привычным нам образом его использовать. Однако, если разобраться, то всё начинает …

Решаем проблему ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number и Error Code: 1064 в MySQL / MariaDB
MySQL и её новая сестричка из мира СПО – MariaDB довольно сильно распространены на хостингах, да и LAMP никто не …

От Google не уйти!?
Гугл плохой — выкачивает деньги, следит за нами, передаёт кому-надо информацию. Естественно, нельзя от него уйти, ведь он уникален! Судите …

У коммерческой Ubuntu увеличится время поддержки до 10 лет
Стоит ли удивиться, что время поддержки увеличит доход? Или же тому, что Canonical так долго к этому шёл?

Читеры. Документальный фильм
Читеры в играх – уже обыденность. Тем интереснее узнать об этой индустрии: сколько они стоят, зачем делаются, зачем используются?