На сегодняшний день контейнеры – это то, без чего не обходится запуск приложений. А самая популярная контейнерная технология – это Docker.
Умение подключаться к контейнерам по SSH пригодится для использования, отладки и эксплуатации контейнеров в вашей локальной операционной системе или при удаленной настройке.
В этой статье описаны различные методы такого подключения, а также ограничения, которые есть у каждого из них.
Метод 1 – Подключение к запущенному контейнеру с помощью docker exec
Самая распространенная и самая полезная команда для получения доступа к оболочке контейнера - docker exec -it. Она, в свою очередь, запускает в контейнере новую команду, которая позволяет запустить новую интерактивную оболочку:
# start a container { // запускаем контейнер }
$ docker run --name nginx --rm -p 8080:80 -d nginx
# create and connect to a bash shell in the container { // создаем и подключаемся к bash-оболочке в контейнере }
$ docker exec -it nginx bash
root@a84ad71521b1:/#
Выйти из текущей оболочки можно, нажав control + d или введя exit.
Эта команда работает так:
- docker exec запускает новую команду,
- -i добавляет поток стандартного ввода,
- -t добавляет терминальный драйвер,
- -it объединяет -i и -t, и, таким образом, вы можете взаимодействовать с процессом.
Бывает, что в контейнере не установлена оболочка Bash. Если у вас не получается запустить bash-оболочку, попробуйте запустить оболочку sh:
docker exec -it nginx sh
Кроме того, в контейнере может вообще не быть установленной оболочки. А значит, вы не сможете получить доступ к оболочке в контейнере в обычном Docker, и вы не сможете ее запустить.
Но вы все равно можете получить доступ к контейнеру, правда, все зависит от вашего инструмента оркестровки. Например, все большую популярность завоевывают distroless-контейнеры, так как они занимают меньше памяти. Если вы используете Kubernetes, то вы можете отлаживать поврежденные контейнеры и контейнеры без оболочки с помощью такой вещи, как эфемерные контейнеры.
Метод 2 – Подключение к запущенному контейнеру с помощью docker attach
Команда docker attach позволяет подключить стандартный ввод и вывод вашего терминала к запущенному контейнеру и отслеживать на нем ошибки с помощью идентификатора или имени контейнера.
По сути это значит, что все, что вы вводите, будет отправляться в контейнер, и все, что будет печататься, будет отображаться в вашей консоли.
А теперь, подключимся к запущенному контейнеру:
$ docker attach nginx
172.17.0.1 - - [18/Mar/2022:08:37:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" "-"
Запустив эту команду, вы можете открыть http://localhost:8080. Так как контейнер печатает журналы доступа на каждой открытой странице, вы увидите вывод в своем терминале.
Кроме того, ввод будет отправляться в контейнер. Так что, если вы нажмете control + c, то сработает сигнал уничтожения, и ваш контейнер завершит свою работу.
$ docker attach nginx
172.17.0.1 - - [18/Mar/2022:08:37:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" "-"
^[[A^C2022/03/18 08:39:50 [notice] 1#1: signal 2 (SIGINT) received, exiting
2022/03/18 08:39:50 [notice] 32#32: exiting
Отключиться от контейнера – не такая простая задача, так как для того, чтобы это сделать, вам также понадобиться сочетание клавиш control + c. Для того, чтобы иметь возможность отключиться от контейнера, не останавливая его, вам нужно подключиться к контейнеру, отключив перенаправление сигналов:
# start the container again { // снова запускаем контейнер }
docker run --name nginx --rm -p 8080:80 -d nginx
# attach with proxying signals { // подключаемся, проксируя сигналы }
docker attach --sig-proxy=false nginx
Заключение
Для того, чтобы подключиться к контейнеру, вам потребуются две простые команды Docker - docker exec и docker attach.
Команда docker exec более популярна, так как вы можете запустить новую команду и создать с ее помощью новую оболочку. Вы можете контролировать процессы, файлы и работать так, как будто вы находитесь в вашей локальной среде.
У команды docker attach больше ограничений, так как она подключает стандартный ввод и вывод вашего терминала к основному процессу запущенного контейнера и позволяет отслеживать на нем ошибки.