img

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

На сегодняшний день контейнеры – это то, без чего не обходится запуск приложений. А самая популярная контейнерная технология – это Docker.

icon strelka icons icons

узнай больше на курсе

DevOps-инженер с нуля
Стань DevOps-инженером с нуля и научись использовать инструменты и методы DevOps
Подробнее о курсе
Полный курс по сетевым технологиям
Полный курс по сетевым технологиям от Мерион Нетворкс - учим с нуля сетевых инженеров и DevOPS специалистов
Подробнее о курсе
Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
icon strelka icons icons

узнай больше на курсе

DevOps-инженер с нуля
Стань DevOps-инженером с нуля и научись использовать инструменты и методы DevOps
Подробнее о курсе
Полный курс по сетевым технологиям
Полный курс по сетевым технологиям от Мерион Нетворкс - учим с нуля сетевых инженеров и DevOPS специалистов
Подробнее о курсе
Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе
Онлайн-курс по кибербезопасности
Полный курс по кибербезопасности от Мерион Нетворкс - учим с нуля специалистов по информационной безопасности. Пора стать безопасником!
Подробнее о курсе
Java-разработчик с нуля
Освойте backend-разработку и программирование на Java, фреймворки Spring и Maven, работу с базами данных и API
Подробнее о курсе
Этичный хакинг
Научись работать с Kali Linux, изучи самые распространенные уязвимости, разверни виртуальную лабораторию для пентестинга
Подробнее о курсе
Еще по теме:
img
10 крутых AI промптов для быстрого решения проблем Kubernetes, CI/CD, Terraform и мониторинга
img
Наверняка ты постоянно слышишь про микросервисы. Микросервисы то, микросервисы сё, переписали все на микросервисы, развернули микросервисы в контейнерах. А че это вообще такое? Ща все объясним.
img
О том, как создать локальную DevOps-лабораторию с Docker, Kubernetes, Vagrant, Ansible и Terraform на обычном ноутбуке без затрат, смс, и прочего.
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии проекта. В статье рассказываем, как ее использовать.
img
Мы рассмотрим несколько простых способов, с помощью которых вы можете управлять и отслеживать логи для своих контейнеров.
ЛЕТНИЕ СКИДКИ
30%
40%
50%
До конца акции: 30 дней 24 : 59 : 59