Как войти по SSH в контейнер Docker

Как войти по SSH в контейнер Docker

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

В этой статье мы рассмотрим, как получить доступ к локальным и удаленным контейнерам Docker для их обслуживания и обновления.

Зачем нужен доступ к контейнерам

Доступ к контейнерам необходим для эффективного управления и устранения неполадок в контейнерных средах. Он позволяет анализировать журналы и информацию о времени выполнения контейнера, легко выявлять и устранять ошибки.

Доступ к контейнерам также позволяет выполнять команды для быстрого обновления конфигурации, установки пакетов и других административных задач. При отсутствии доступа пришлось бы перестраивать весь образ контейнера с обновленной конфигурацией, что может занять много времени и быть неэффективным.

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

Хотя доступ к контейнерам можно получить и через традиционный протокол Secure Shell (SSH), Docker предоставляет несколько встроенных методов, позволяющих сэкономить время и повысить эффективность. К ним относятся:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

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

Как и зачем использовать команду docker exec

Команда docker exec позволяет получить доступ к сеансу оболочки работающего контейнера и выполнять команды без необходимости запуска нового экземпляра. Обратите внимание, что эта команда не является постоянной, то есть она не будет повторно выполнена, если контейнер выключится или перезапустится.

Чтобы получить доступ к запущенному контейнеру, необходимо знать его имя или идентификатор (его можно получить, выполнив команду docker ps -a). Затем введите его в следующую команду:

docker exec -it  /bin/bash

The docker exec command executed in the terminal to spawn a bash shell inside a container.Доступ к контейнеру с помощью docker exec

Как и зачем использовать команду docker run

Команда docker run позволяет запустить новый контейнер и сразу же получить доступ к его оболочке. По умолчанию этот контейнер не прикрепляется к текущему сеансу оболочки, но его можно прикрепить с помощью опции -it.

Следующая команда позволяет запустить новый контейнер, присоединить его к текущему сеансу оболочки и вызвать оболочку bash:

docker run -it  /bin/bash

The docker run command executed in the terminal to start a container and spawn a bash shell in it.Доступ к контейнеру при помощи docker run.

Как и зачем использовать команду docker attach

Команда docker attach полезна для мониторинга и отладки работы контейнеров. Она позволяет подключаться к работающему контейнеру и просматривать его стандартные потоки ввода, вывода и ошибок в режиме реального времени.

Для ее использования запустите контейнер с помощью команды docker run. Затем отсоединитесь от него, нажав Ctrl+P и Ctrl+Q. Вместо этого можно установить флаг -d для данного контейнера.

После запуска контейнера в фоновом режиме доступ к нему можно получить с помощью следующей команды:

docker attach 

The docker attach executed in the terminal to access a container.Использование docker attach для доступа к контейнеру.

Как и зачем использовать Docker Compose

Docker Compose позволяет создавать и исполнять многоконтейнерные Docker-приложения. С его помощью можно определить сервисы, из которых состоит приложение, в YAML-файле, а затем использовать этот файл для запуска и управления всеми контейнерами вместе. Он подходит для сред разработки и тестирования, где необходимо быстро запускать сложные среды.

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

docker compose exec app /bin/bash

Эта команда запускает новый процесс внутри контейнера, выполняющий указанную команду. С ее помощью можно запустить любую команду внутри контейнера, включая интерактивные оболочки типа bash.

Аналогично, если вы хотите запустить новый контейнер с помощью Docker Compose и получить к нему немедленный доступ, выполните следующую команду:

docker compose run app /bin/bash

Обратите внимание, что docker compose имеет два различных синтаксиса: docker-compose (версия 1) и code>docker compose (версия 2). Синтаксис версии 2 является более гибким и мощным, поэтому рекомендуется использовать его при любой возможности.

The docker compose run and docker compose exec commands executed in the terminal to access containers.Использование Docker Compose для доступа к контейнерам

Как добавить SSH-сервер в контейнер Docker

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

Добавить SSH-сервер можно, включив его в Dockerfile перед сборкой контейнера, а затем подключив его с помощью SSH-клиента. Также можно добавить временный доступ к SSH, породив оболочку внутри работающего контейнера и установив в ней SSH-сервер.

Включение SSH-сервера при сборке контейнера Docker

При сборке контейнера Docker включение SSH-сервера внутрь контейнера может быть полезно, если требуется постоянный SSH-доступ к нему. Это позволяет получить удаленный доступ к контейнеру и отладить его в процессе разработки или устранения неполадок. Также включение SSH-сервера позволяет безопасно передавать файлы в контейнер и из него.

Чтобы включить SSH-сервер во время сборки, внесите несколько изменений в Dockerfile контейнера. Вот пример Dockerfile, включающего SSH-сервер:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

An SSH command executed in the terminal to access a container.Контейнер Docker, построенный с использованием SSH-сервера

Этот код собирает контейнер с последним образом Debian и устанавливает SSH-сервер. Он также создает новый каталог для SSH-сервера, устанавливает пароль root и включает вход root через конфигурацию SSH.

Наконец, он открывает порт 22, порт по умолчанию SSH.

Для использования этого Dockerfile необходимо собрать контейнер с помощью команды docker build, а затем запустить его с помощью docker run. Вот пример:

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

Эта команда создает контейнер с помощью Dockerfile и помечает его именем ssh-container. Для запуска контейнера в отсоединенном режиме используйте команду -d. Далее с помощью команды -p пропишите порт 22 внутри контейнера на порт 2222 на хост-машине.

После запуска контейнера можно подключиться к нему по SSH с помощью команды ssh:

ssh root@localhost-p 2222

Когда появится запрос на ввод пароля, введите пароль, заданный в файле YAML. В данном случае это “root123”. Теперь вы подключены к SSH-серверу, запущенному внутри контейнера. Это означает, что вы можете выполнять удаленную отладку или передавать файлы в контейнер и из него.

Временное добавление SSH-сервера к запущенному контейнеру Docker

Также можно добавить SSH-сервер в работающий контейнер с помощью команды docker exec:

docker exec <container_name_or_id> /bin/bash

Получив доступ к контейнеру, установите сервер OpenSSH и запустите демон SSH:

apt update && apt install openssh-server && /usr/sbin/openssh -D

Это открывает новый экземпляр SSH-сервера внутри контейнера. Теперь вы можете подключиться к нему с помощью SSH-клиента на своей локальной машине.

Обратите внимание, что подключиться к контейнеру по SSH можно только в том случае, если вы или ваша команда открыли порт SSH на этапе выполнения или сборки.

Подключение к SSH-серверу контейнера

Начните с определения IP-адреса или имени хоста контейнера с помощью платформы или сервиса управления контейнерами.

Для подключения к IP-адресу используйте команду ssh:

ssh [username]@[container-ip-address]

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

Теперь вы должны иметь удаленный терминальный сеанс, подключенный к контейнеру.

Резюме

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

Docker также предоставляет универсальный набор встроенных команд для решения различных задач разработки. С помощью этих команд можно оптимизировать рабочий процесс, не прибегая к традиционным методам SSH.