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

Привет, %username% ! Я с недавних пор начал изучать контейнеризацию на базе Docker. И вот в определенный момент мне понадобилось подправить пару файлов внутри готового и запущенного контейнера gitlab . Оказалось это делается довольно просто.
Для того, чтобы выполнять команды внутри контейнера, надо для начала в него попасть. Для моих нужд достаточно одной простой команды. Но перед тем как попасть в контейнер, нам необходимо получить ID необходимого контейнера. Делается это командой:
docker ps
После получения списка всех запущенных контейнеров, мы выбираем (в первом столбце) ID нужного нам контейнера и подставляем в следующую команду вместо :
docker exec -it bash
Данная команда в контейнере запустит bash прямо в вашей консоли. После чего, можно выполнять внутри контейнера все правки, которые нам необходимы. Главное не забыть сделать коммит контейнера перед тем, как его убить или остановить, ибо в противном случае все ваши правки не сохранятся.
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.
- docker
- linux
Как войти в запущенный 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 или как дебажить систему с минимумом проблем
Программы, 49 дней назад
Проверочный список для выпуска промышленных приложений с иллюстрациями
Работа и управление, 90 дней назад
В 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 так долго к этому шёл?

Читеры. Документальный фильм
Читеры в играх – уже обыденность. Тем интереснее узнать об этой индустрии: сколько они стоят, зачем делаются, зачем используются?
Как зайти в контейнер docker
Docker — один из самых известных инструментов по работе с контейнерами. В статье мы расскажем, что такое контейнеры, где они применяются и чем могут быть полезны.
Контейнеры — хорошая альтернатива аппаратной виртуализации. Они позволяют запускать приложения в изолированном окружении, но при этом потребляют намного меньше ресурсов. Благодаря контейнеризации и использованию Docker разработчики больше не задумываются о том, в какой среде будет функционировать их приложение и будут ли в этой в среде необходимые для тестирования опции и зависимости. Достаточно упаковать приложение со всеми зависимостями и процессами в контейнер, чтобы запускать в любых системах: Linux, Windows и macOS. Платформа Docker позволила отделить приложения от инфраструктуры. Контейнеры не зависят от базовой инфраструктуры, их можно легко перемещать между облачной и локальной инфраструктурами.
У контейнеризации и виртуализации есть сходство, но есть и различия. Виртуализация напоминает отдельный компьютер со своим оборудованием и ОС, внутри которого можно запустить еще одну ОС. А контейнеризация предполагает, что виртуальная среда запускается из ядра ОС, не предусматривает виртуализации оборудования и снижает потребление ресурсов.
Как войти в контейнер?
Для того, чтобы выполнять команды внутри контейнера, надо для начала в него попасть. Если коротко отвечать на первую часть вопроса, хватит одной команды docker:
docker exec -ti > /bin/sh
– так мы запустим в интерактивном режиме команду /bin/sh (shell, командная строка) внутри уже запущенного контейнера.
- -i – интерактивный режим, не закрываем STDIN при старте.
- -t – запуск псевдо-терменала.
Опять же, узнать имя контейнера можно с помощью
docker ps -a
– ключ -a покажет нам все контейнеры, в том числе погашенные. В выключенные вы, естественно, не зайдёте. И это первая причина не лезть своими шаловливыми ручками в контейнер. Нет, правда, что вы там хотите посмотреть?
Логи вы можете увидеть через
docker logs >
А если вы их там не видите – а вы вообще правильно используете Docker?
Лезть в Docker-контейнер вредно потому, что вы решите (если решите) проблему для одного конкретного контейнера, который при следующем перезапуске будет перераскатан из образа. Стоит относиться к нему как к процессу без состояния – в любой момент могут быть потеряны все изменения, данные.
Поэтому и ковыряться в контейнере может иметь смысл, если вы разрабатываете в сервис в контейнере, но вносите все фиксы именно в образ.
Используйте внешние специализированные средства
Но что же делать, если вам таки надо иногда смотреть на нагрузку, читать логи и т.д.? Всё это стоит автоматизировать и упаковать в ваши сервисы, которые крутятся в Docker-контейнерах.
К примеру, логи можно собирать через filebeat, метрики через prometheus, а про ошибки узнавать не от пользователей, а через sentry.
Таким образом, на не нужно ходить в контейнер, а данные не потеряются при его дропе / перезапуске / выходе из строя хостовой машины. Вместо этого мы получаем централизованную систему для обработки служебных данных. А учитывая, что один запрос может ходить между несколькими сервисами, так ещё и проще будет разобраться в судьбе этого запроса, чем лезть на десяток машин.
Повторный вход в контейнер в docker
Допустим я запустил контейнер таким образом: docker run -ti my_super_images bash Спустя какое-то время я ввожу exit и выхожу из него. Теперь информация о нем содержится только в docker ps -a . Как мне снова войти в терминал контейнера, зная его id ?
Отслеживать
задан 16 янв 2017 в 8:42
7,688 17 17 золотых знаков 70 70 серебряных знаков 131 131 бронзовый знак
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
docker exec -ti имя_контейнера bash
можно зайти под определенным юзером с директивой -user user_name
Отслеживать
ответ дан 16 янв 2017 в 8:45
371 1 1 серебряный знак 7 7 бронзовых знаков
Error response from daemon: Container 6d7a294a9450b81420c8cf25357a580c3f05f25fae5bc03e890d9b5737c1b266 is not running ¯_(ツ)_/¯
17 янв 2017 в 8:12
Указанный в соседнем ответе пример сработает, чтобы зайти в работающий контейнер и запустить дополнительный процесс, но ничего не сделает с остановленным, как описано в задаче.
docker run -ti --name test-subject ubuntu root@6d7a294a9450:/# exit --- docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d7a294a9450 ubuntu "/bin/bash" 2 minutes ago Exited (0) About a minute ago test-subject --- docker exec -ti test-subject bash Error response from daemon: Container 6d7a294a9450b81420c8cf25357a580c3f05f25fae5bc03e890d9b5737c1b266 is not running
Для того, чтобы зайти в остановленный, его сначала надо запустить
docker start test-subject
В конкретно этом случае контейнер сразу выйдет, потому что его основной процесс — bash, который не сможет читать STDIN и не получил команды, и в этом случае интересует прицепиться к основному прцоессу, нежели запустить в контейнере еще один процесс. Поэтому надо прямо указать docker, что надо подцепить STDIN к тому процессу, который будет запущен через start:
docker start -ia test-subject root@6d7a294a9450:/#