Контейнеры и командные строки Docker

Читать первым в Telegram

По умолчанию при запуске контейнера вы также будете использовать терминальные команды, как показано ниже. Мы уже разбирали их в предыдущих главах, когда работали с контейнерами.

На скриншоте выше вы можете заметить, что мы выполнили следующую команду:

sudo docker run –it centos /bin/bash

Мы использовали эту команду, чтобы создать новый контейнер, после чего использовали сочетание клавиш Ctrl+P+Q, чтобы выйти из контейнера. Оно гарантирует, что контейнер всё ещё будет существовать даже после выхода из него.

Мы можем убедиться в том, что контейнер всё ещё существует при помощи команды Docker ps. Если бы нам было необходимо напрямую выйти из контейнера, тогда сам контейнер был бы уничтожен.

Теперь рассмотрим более простой способ подключения к контейнерам и аккуратного выхода без необходимости их уничтожения. Одним из способов достижения этого является использование команды nsenter.

Чтобы запустить команду nsenter, для начала необходимо установить образ nsenter. Сделать это можно при помощи следующей команды:

docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

Перед тем как использовать команду nsenter, нам необходимо получить ID процесса контейнера, так как это требует сама команда nsenter. Получить его можно с помощью команды Docker inspect и отфильтровать его через Pid:

Как видно на скриншоте выше — первым делом мы использовали команду docker ps, чтобы увидеть запущенные контейнеры. Мы видим, что существует один работающий контейнер с идентификатором ef42a4c5e663.

После чего мы используем команду Docker inspect, чтобы проверить конфигурации этого контейнера, а затем используем команду grep для того, чтобы отфильтровать ID процесса. Из вывода видно, что ID процесса равен 2978.

Теперь, когда мы получили ID процесса, мы можем двигаться дальше и использовать команду nsenter для подключения к контейнеру Docker.

nsenter

Данный метод позволяет подключаться к контейнеру не выходя из него.

nsenter –m –u –n –p –i –t containerID command

Детальнее рассмотрим вызов:

  • -u используется для указания пространства имён Uts
  • -m используется для указания пространства имён mount
  • -n используется для указания пространства имён network
  • -p используется для указания пространства имён process
  • -i заставляет контейнер работать в интерактивном режиме.
  • -t используется для подключения потоков ввода-вывода контейнера к операционной системе хоста.
  • containerID — идентификатор контейнера.
  • Command — команда для запуска в контейнере.

Пример

sudo nsenter –m –u –n –p –i –t 2978 /bin/bash

Пример вывода:

Из вывода можно выделить несколько пунктов:

  • Командная строка изменяется непосредственно на оболочку bash, когда мы запускаем команду nsenter.
  • После чего мы используем команду exit. Теперь, если бы вы не воспользовались командой nsenter, контейнер был бы уничтожен. Но обратите внимание, что когда мы запускаем контейнер командой nsenter, он после выхода всё ещё продолжает работать.

Источник: Docker — Containers and Shells

Поддержать проект

Социальные сети проекта:

Подпишись, чтобы ничего не пропустить!