Me gustaría crear el siguiente flujo de infraestructura:
¿Cómo se puede lograr eso usando Docker?
Me gustaría crear el siguiente flujo de infraestructura:
¿Cómo se puede lograr eso usando Docker?
Respuestas:
En primer lugar, debe instalar un servidor SSH en las imágenes en las que desea ssh-into. Puede usar una imagen base para todo su contenedor con el servidor ssh instalado. Entonces solo tiene que ejecutar cada contenedor mapeando el puerto ssh (predeterminado 22) a uno de los puertos del host (servidor remoto en su imagen), usando -p <hostPort>:<containerPort>
. es decir:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
Luego, si se puede acceder a los puertos 52022 y 53022 de los hosts desde el exterior, puede enviar directamente ssh a los contenedores utilizando la ip del host (servidor remoto) especificando el puerto en ssh con -p <port>
. Es decir:
ssh -p 52022 myuser@RemoteServer
-> SSH al contenedor1
ssh -p 53022 myuser@RemoteServer
-> SSH al contenedor2
Aviso : esta respuesta promueve una herramienta que he escrito.
La respuesta seleccionada aquí sugiere instalar un servidor SSH en cada imagen. Conceptualmente, este no es el enfoque correcto ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
He creado un servidor SSH en contenedor que puede 'pegar' a cualquier contenedor en ejecución. De esta forma puedes crear composiciones con cada contenedor. El único requisito es que el contenedor tenga bash.
El siguiente ejemplo iniciaría un servidor SSH expuesto en el puerto 2222 de la 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 obtener más sugerencias y documentación, consulte: https://github.com/jeroenpeeters/docker-ssh
Esto no solo anula la idea de un proceso por contenedor, sino que también es un enfoque engorroso cuando se utilizan imágenes de Docker Hub, ya que a menudo no contienen (y no deberían) contener un servidor SSH.
Estos archivos abrirán sshd con éxito y ejecutarán el servicio para que pueda ssh in localmente. (estás usando cyberduck ¿no?)
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 / ejecutar start daemon / saltar al 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
Supongo que es posible. Solo necesita instalar un servidor SSH en cada contenedor y exponer un puerto en el host. La principal molestia sería mantener / recordar el mapeo de puerto a contenedor.
Sin embargo, tengo que preguntarme por qué querrías hacer esto. SSH'ng en contenedores debería ser lo suficientemente raro como para que no sea una molestia enviar ssh al host y luego usar docker exec para ingresar al contenedor.
Crea una imagen de Docker con openssh-server
preinstalado:
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"]
Construye la imagen usando:
$ docker build -t eg_sshd .
Ejecutar un test_sshd
contenedor:
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
Ssh a su contenedor:
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Fuente: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
ssh root@localhost -p <ssh_host_port>
seguir las instrucciones aquí