tag hub example docker containers lxc

hub - ¿Cómo SSH en Docker?



docker hub (5)

Me gustaría crear el siguiente flujo de infraestructura:

¿Cómo se puede lograr eso con Docker?


Cree una imagen del openssh-server preinstalado:

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 ''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 .

Ejecute un contenedor test_sshd :

$ docker run -d -P --name test_sshd eg_sshd $ docker port test_sshd 22 0.0.0.0:49154

Ssh a su contenedor:

$ ssh [email protected] -p 49154 # The password is ``screencast``. root@f38c87f2a42d:/#

Fuente: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image


En primer lugar, debe instalar un servidor SSH en las imágenes en las que desea ingresar. Puede usar una imagen base para todo su contenedor con el servidor ssh instalado. Luego, solo tiene que ejecutar cada contenedor que asigna el puerto ssh (predeterminado 22) a uno a 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 ssh directamente 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


Estos archivos abrirán con éxito sshd y ejecutarán el servicio para que pueda ingresar ssh localmente. (estás usando cyberduck, ¿verdad?)

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 molestia principal sería mantener / recordar la asignación 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.


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 contenedores que puede ''pegar'' a cualquier contenedor en ejecución. De esta manera 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 vence la idea de un proceso por contenedor, sino que también es un enfoque engorroso cuando se usan imágenes del Docker Hub, ya que a menudo no contienen (y no deberían) contener un servidor SSH.