Как подключиться к контейнеру Docker по SSH — CloudSavvy IT

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

Стоит ли использовать SSH с контейнерами Docker?

Использование SSH в контейнере Docker, как правило, является плохой практикой, которой следует избегать. Почти всегда лучше использовать команду docker exec, чтобы получить оболочку внутри контейнера.

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

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

Вместо того, чтобы добавлять SSH в отдельные контейнеры, установите его один раз на физическом хосте, на котором работает Docker. Используйте SSH для подключения к вашему хосту, затем запустите docker exec -it my-container bash для доступа к отдельным контейнерам.

Хотя docker exec является предпочтительным подходом, все же есть сценарии, в которых SSH может быть полезен. Вы можете представить это как временную меру для интеграции с устаревшими системами развертывания. Он также может использоваться некоторыми IDE и инструментами сборки для обеспечения возможности перезагрузки в реальном времени во время разработки.

Установка SSH-сервера в Docker-контейнер

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

Вот пример файла Dockerfile для образа на основе Debian:

RUN apt-get update && apt-get install -y openssh-server RUN sed -i ‘s / PermitRootLogin prohibit-password / PermitRootLogin yes /’ / etc / ssh / sshd_config ENTRYPOINT service ssh start && bash

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

ЗАПУСТИТЬ useradd -m -s / bin / bash sshuser

Это создает нового пользователя с именем sshuser с домашним каталогом (-m). Параметр -s устанавливает в качестве оболочки входа пользователя по умолчанию значение Bash.

Использование ENTRYPOINT гарантирует, что служба SSH всегда запускается вместе с контейнером. Затем выполнение передается Bash как процессу переднего плана контейнера. Вы можете заменить это двоичным файлом вашего приложения.

Настройка аутентификации

Далее вам нужно настроить систему аутентификации. Вы можете назначить пароль своей учетной записи sshuser и войти с ним:

RUN echo «sshuser: Changeme» | changepasswd

Более безопасный способ — настроить аутентификацию по ключу SSH. Вам нужно будет создать пару ключей на вашем клиентском компьютере, а затем скопируйте общедоступную часть в контейнер. Таким образом, демон SSH может проверить личность вашего компьютера при подключении.

Измените файл Dockerfile, чтобы настроить папку конфигурации .ssh для вашего пользователя. Скопируйте открытый ключ из вашего рабочего каталога с помощью команды docker cp или инструкции COPY в Dockerfile. В последнем случае ключ будет встроен в изображение и будет виден всем, у кого есть доступ.

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys RUN chown -R sshuser: sshuser /home/sshuser/.ssh RUN chmod 600 /home/sshuser/.ssh/authorized_keys

Эта последовательность команд создает файл authorized_keys SSH с открытым ключом id_rsa.pub в вашем рабочем каталоге. Разрешения файловой системы настраиваются в соответствии с требованиями SSH.

Подключение к контейнеру

Теперь вы готовы подключиться к своему контейнеру. Запустите контейнер с портом 22, привязанным к хосту:

docker run -p 22:22 мое-изображение: последнее

Запуск ssh sshuser@example.com предоставит вам оболочку внутри вашего контейнера.

Вы можете пропустить привязку порта, если вы будете подключаться с компьютера, на котором размещен контейнер Docker. Используйте docker inspect, чтобы получить IP-адрес вашего контейнера, а затем передайте его команде подключения SSH.

docker inspect | grep ‘IPAddress’ | голова -n 1

Используйте клиент SSH на вашем компьютере для подключения к контейнеру:

ssh root@172.17.0.1 # ИЛИ ssh sshuser@172.17.0.1

Вам нужно будет использовать альтернативный порт, если вы используете отдельный SSH-сервер на хосте или у вас есть несколько контейнеров, которым нужен порт 22. Вот как инициировать соединение, когда SSH привязан к порту 2220:

docker run -p 22: 2220 my-image: последний ssh ​​root@172.17.0.1 -p 2220

Настройка ярлыков контейнера с помощью SSH Config

Вы можете управлять своим файлом конфигурации SSH, чтобы упростить подключение к отдельным контейнерам. Отредактируйте ~ / .ssh / config, чтобы определить сокращенные хосты с предварительно настроенными портами:

Хост мой-контейнер HostName 172.17.0.1 Порт 2220 Пользователь sshuser

Теперь вы можете запустить ssh my-container, чтобы попасть прямо в ваш контейнер. Это упрощает управление несколькими подключениями без запоминания IP-адресов и портов контейнеров.

Вместо этого используйте Dockssh для упрощения управления контейнерами

В Dockssh проект делает еще один шаг вперед, предоставляя еще один демон, который позволяет запускать ssh my-container@example.com без какой-либо ручной настройки SSH. Вам не нужно устанавливать SSH-сервер в свои контейнеры; Dockssh автоматически проксирует соединения SSH и вместо этого запускает правильную команду docker exec.

Вы должны сначала установить Redis для хранения данных конфигурации Dockssh:

sudo apt install redis

Затем определите контейнеры, которые вы хотите предоставить, добавив запись Redis с именем контейнера и паролем для SSH-соединений:

redis-cli set dockssh: my-container: pass «контейнер-пароль-здесь»

Затем загрузите Dockssh:

sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O / usr / local / bin / dockssh sudo chmod + x / usr / local / bin / dockssh sudo ufw allow 22022 # Запустить DockSSH server dockssh

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

ssh my-container@example.com -p 22022

Dockssh по умолчанию прослушивает порт 22022. Брандмауэр открывается, чтобы разрешить входящие соединения, использующие порт.

При подключении вам будет предложено ввести пароль контейнера. Это было установлено как контейнер-пароль здесь в нашей записи Redis выше.

Использование Dockssh упрощает подключение по SSH к большому количеству контейнеров Docker. Этот подход идеален, когда вы регулярно подключаетесь к своим контейнерам с удаленного хоста, поскольку он упрощает двухэтапную последовательность «SSH, затем docker exec» в одну запоминающуюся команду.

Зарегистрируйте Dockssh как системную службу для долгосрочного использования:

sudo nano /etc/systemd/system/dockssh.service
[Unit]Описание = Dockssh-сервис After = network.target
[Service]type = simple Restart = всегда RestartSec = 1 Пользователь = root ExecStart = / usr / local / bin / dockssh
[Install]WantedBy = multi-user.target

Включите службу с помощью systemctl:

sudo systemctl включить dockssh.service sudo systemctl start dockssh

Dockssh теперь запускается автоматически при загрузке вашей системы.

Резюме

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

Системные администраторы, которые хотят удаленно управлять большим количеством контейнеров Docker, могут попробовать Dockssh. Он позволяет запускать знакомые команды ssh с помощью бесшовного скрытого сопоставления с docker exec, предоставляя вам лучшее из обоих миров с использованием немодифицированных образов.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *