Eu gostaria de criar o seguinte fluxo de infraestrutura:
Como isso pode ser feito usando o Docker?
Eu gostaria de criar o seguinte fluxo de infraestrutura:
Como isso pode ser feito usando o Docker?
Respostas:
Primeiramente você precisa instalar um servidor SSH nas imagens que deseja fazer o ssh. Você pode usar uma imagem de base para todo o seu contêiner com o servidor ssh instalado. Então você só precisa executar cada container mapeando a porta ssh (padrão 22) para uma das portas do host (servidor remoto em sua imagem), usando -p <hostPort>:<containerPort>
. ie:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
Então, se as portas 52022 e 53022 do host são acessíveis de fora, você pode fazer ssh diretamente para os contêineres usando o ip do host (servidor remoto) especificando a porta em ssh com -p <port>
. Ie:
ssh -p 52022 myuser@RemoteServer
-> SSH para o container1
ssh -p 53022 myuser@RemoteServer
-> SSH para o container2
Aviso : esta resposta promove uma ferramenta que escrevi.
A resposta selecionada aqui sugere instalar um servidor SSH em cada imagem. Conceitualmente, essa não é a abordagem certa ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
Eu criei um servidor SSH em contêiner que você pode "colar" em qualquer contêiner em execução. Desta forma, você pode criar composições com todos os contêineres. O único requisito é que o contêiner tenha bash.
O exemplo a seguir iniciaria um servidor SSH exposto na porta 2222 da máquina local.
$ 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
Para obter mais dicas e documentação, consulte: https://github.com/jeroenpeeters/docker-ssh
Isso não apenas derrota a ideia de um processo por contêiner, mas também é uma abordagem complicada ao usar imagens do Docker Hub, pois muitas vezes não (e não deveriam) conter um servidor SSH.
Esses arquivos abrirão o sshd com sucesso e executarão o serviço para que você possa ssh localmente. (você está usando o cyberduck, não está?)
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
para construir / executar iniciar daemon / saltar para o shell.
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
Eu acho que é possível. Você só precisa instalar um servidor SSH em cada contêiner e expor uma porta no host. O principal incômodo seria manter / lembrar o mapeamento do porto ao contêiner.
No entanto, tenho que questionar por que você deseja fazer isso. O SSH'ng em contêineres deve ser raro o suficiente para que não seja um incômodo fazer o ssh para o host e depois usar o docker exec para entrar no contêiner.
Crie uma imagem docker com openssh-server
pré-instalado:
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"]
Construa a imagem usando:
$ docker build -t eg_sshd .
Execute um test_sshd
contêiner:
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
Ssh para seu contêiner:
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Fonte: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
ssh root@localhost -p <ssh_host_port>
seguir as instruções aqui