Я хотів би створити такий потік інфраструктури:
Як цього можна досягти за допомогою 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 входити локально. (Ви використовуєте кібердак, чи не так?)
Докерфайл
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>
слідувати інструкціям тут