Как подключиться по SSH к Докер?


Я хотел бы создать следующий поток инфраструктуры:

Как это может быть достигнуто с помощью Docker?

5 62

5 ответов:

во-первых, вам нужно установить SSH-сервер в образах, которые вы хотите ssh-В. Вы можете использовать базовый образ для всего вашего контейнера с установленным ssh-сервером. Затем вам нужно только запустить каждый контейнер, сопоставляющий порт ssh (по умолчанию 22) с одним из портов хоста (удаленный сервер в вашем образе), используя -p <hostPort>:<containerPort>. я.е:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2

затем, если порты 52022 и 53022 хоста доступны извне, вы можете напрямую ssh к контейнерам, используя ip хоста (удаленный сервер) указание порта в ssh с помощью -p <port>. То есть:

ssh -p 52022 myuser@RemoteServer --> SSH в container1

ssh -p 53022 myuser@RemoteServer --> SSH в container2

обратите внимание: этот ответ продвигает инструмент, который я написал.

выбранный ответ здесь предлагает установить SSH-сервер в каждый образ. Концептуально это не правильный подход (https://docs.docker.com/articles/dockerfile_best-practices/).

Я создал контейнерный SSH-сервер, который вы можете "прикрепить" к любому работающему контейнеру. Таким образом, вы можете создавать композиции с каждым контейнером. Единственное требование что в контейнере есть bash.

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

$ docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

$ ssh -p 2222 localhost

для получения дополнительных указателей и документации см.:https://github.com/jeroenpeeters/docker-ssh

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

эти файлы будут успешно открыты sshd и запустить службу, так что вы можете ssh в локально. (вы используете cyberduck не так ли?)

Dockerfile

FROM swiftdocker/swift
MAINTAINER Nobody

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

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22
CMD ["/usr/bin/supervisord"]

supervisord.conf

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

чтобы построить / запустить демон запуска / перейти в оболочку.

docker build -t swift3-ssh .  
docker run -p 2222:22 -i -t swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

enter image description here

Я думаю, что это возможно. Вам просто нужно установить SSH-сервер в каждом контейнере и предоставить порт на хосте. Главным раздражением было бы сохранение / запоминание отображения порта на контейнер.

однако, я должен спросить, почему вы хотите это сделать. SSH'NG в контейнеры должны быть достаточно редкими, чтобы не было проблем с ssh для хоста, а затем использовать docker exec для входа в контейнер.

создать докер изображение с openssh-server предустановленной:

Dockerfile

FROM ubuntu:16.04

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

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

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

построить изображение с помощью:

$ docker build -t eg_sshd .

запустить test_sshd контейнер:

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22

0.0.0.0:49154

Ssh для вашего контейнера:

$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

источник: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image