Я хочу создать следующий поток инфраструктуры:
Как этого добиться с помощью Docker?
Я хочу создать следующий поток инфраструктуры:
Как этого добиться с помощью Docker?
Ответы:
Во-первых, вам нужно установить 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 в контейнер1
ssh -p 53022 myuser@RemoteServer
-> SSH в контейнер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-сервер.
Эти файлы успешно откроют 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
предустановленными:
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
ssh root@localhost -p <ssh_host_port>
следовать инструкциям здесь