Как подключиться по SSH к Докер?
Я хотел бы создать следующий поток инфраструктуры:
Как это может быть достигнуто с помощью Docker?
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
Я думаю, что это возможно. Вам просто нужно установить 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