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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии про
img
Docker — популярная платформа виртуализации на уровне ОС. Она поставляет приложения в пакетах (контейнерах), которые, представля
img
Хуки в Git — это bash-скрипты, которые запускаются до или после команд Git, например, коммитов и пушей. Они позволяют автоматизи
img
  Nomad и Kubernetes – это две самые популярные платформы оркестровки, предназначенные для оркестровки динамических рабочих нагр
img
  Давайте узнаем о новом Ops-течении – GitOps! DevOps поспособствовал цифровизации многих компаний. Речь идет о командах разрабо
img
  Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускат
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59