Vorrei creare il seguente flusso di infrastruttura:
Come è possibile ottenerlo utilizzando Docker?
Vorrei creare il seguente flusso di infrastruttura:
Come è possibile ottenerlo utilizzando Docker?
Risposte:
In primo luogo è necessario installare un server SSH nelle immagini in cui si desidera eseguire l'SSH. Puoi usare un'immagine di base per tutto il tuo contenitore con il server ssh installato. Quindi devi solo eseguire ogni contenitore mappando la porta ssh (predefinita 22) su una delle porte dell'host (Server remoto nella tua immagine), usando -p <hostPort>:<containerPort>
. cioè:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
Quindi, se le porte 52022 e 53022 degli host sono accessibili dall'esterno, puoi direttamente ssh ai contenitori utilizzando l'ip dell'host (Remote Server) specificando la porta in ssh con -p <port>
. Cioè:
ssh -p 52022 myuser@RemoteServer
-> SSH a container1
ssh -p 53022 myuser@RemoteServer
-> SSH a container2
Avviso : questa risposta promuove uno strumento che ho scritto.
La risposta selezionata qui suggerisce di installare un server SSH in ogni immagine. Concettualmente questo non è l'approccio giusto ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
Ho creato un server SSH containerizzato che puoi "attaccare" a qualsiasi container in esecuzione. In questo modo puoi creare composizioni con ogni contenitore. L'unico requisito è che il contenitore abbia bash.
Il seguente esempio avvia un server SSH esposto sulla porta 2222 della macchina locale.
$ 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
Per ulteriori suggerimenti e documentazione, vedere: https://github.com/jeroenpeeters/docker-ssh
Non solo questo vanifica l'idea di un processo per contenitore, ma è anche un approccio complicato quando si utilizzano immagini dal Docker Hub poiché spesso non (e non dovrebbero) contenere un server SSH.
Questi file apriranno correttamente sshd ed eseguiranno il servizio in modo da poter accedere a ssh localmente. (stai usando cyberduck, vero?)
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
per costruire / eseguire avvia il demone / salta nella 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
Immagino sia possibile. Devi solo installare un server SSH in ogni container ed esporre una porta sull'host. Il fastidio principale sarebbe mantenere / ricordare la mappatura del porto al container.
Tuttavia, devo chiedermi perché vorresti farlo. SSH'ng nei contenitori dovrebbe essere abbastanza raro da non essere un problema per ssh all'host, quindi usa docker exec per entrare nel contenitore.
Crea un'immagine docker con openssh-server
preinstallato:
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"]
Costruisci l'immagine usando:
$ docker build -t eg_sshd .
Esegui un test_sshd
contenitore:
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
Ssh nel tuo contenitore:
$ 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>
seguire le istruzioni qui