Подтвердить что ты не робот

Как SSH в Docker?

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

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

4b9b3361

Ответ 1

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

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

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

ssh -p 52022 [email protected] → SSH в контейнер1

ssh -p 53022 [email protected] → SSH для контейнера2

Ответ 2

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

Выбранный ответ предлагает установить 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 Hub, поскольку они часто не содержат (и не должны) содержать SSH-сервер.

Ответ 3

Эти файлы будут успешно открывать 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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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

Ответ 4

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

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

Ответ 5

Создайте изображение openssh-server предустановленным 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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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 [email protected] -p 49154
# The password is ''screencast''.
[email protected]:/#

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