Перейти к содержимому

Как зайти в контейнер docker

  • автор:

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

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. Настройка сети, сборка образов, запуск программ в контейнере. Запускаем несколько сервисов в одной сети с помощью …

Фото 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

Найдена уязвимость в утилите ping для FreeBSD

Во FreeBSD найдена уязвимость, позволяющая выполнить код от пользователя root. Самое забавное, что на этот раз «дыра» была обнаружена в …

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

Фото Как удалить все Docker образы и контейнеры

Как удалить все Docker образы и контейнеры

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

Фото Решаем проблему ERROR 1348 column password is not updatable при обновлении пароля root в MySQL / MariaDB

Решаем проблему 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

Решаем проблему ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number и Error Code: 1064 в MySQL / MariaDB

MySQL и её новая сестричка из мира СПО – MariaDB довольно сильно распространены на хостингах, да и LAMP никто не …

Фото От Google не уйти!?

От Google не уйти!?

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

Фото У коммерческой Ubuntu увеличится время поддержки до 10 лет

У коммерческой 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:/# 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *