img

Как подключиться к Docker-контейнеру через SSH – Secure Shell VS. Docker Attach

 

На сегодняшний день контейнеры – это то, без чего не обходится запуск приложений. А самая популярная контейнерная технология – это 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 больше ограничений, так как она подключает стандартный ввод и вывод вашего терминала к основному процессу запущенного контейнера и позволяет отслеживать на нем ошибки. 

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии проекта. В статье рассказываем, как ее использовать.
img
Мы рассмотрим несколько простых способов, с помощью которых вы можете управлять и отслеживать логи для своих контейнеров.
img
Узнайте, как использовать Git Hooks для автоматизации задач в рабочем процессе: от проверки коммитов до автоматического тестирования, и как настроить хуки для совместной работы в команде.
img
Откройте для себя, как канареечное развертывание может минимизировать риски при обновлении ПО. Узнайте, как постепенно внедрять новые функции и обеспечивать стабильность продукта с помощью этого метода.
img
Откройте для себя GitOps — революционный подход к управлению инфраструктурой через Git. Узнайте, как этот метод упрощает развертывание приложений и повышает надежность с помощью автоматизации и масштабируемости.