Ich möchte den folgenden Infrastrukturfluss erstellen:
Wie kann das mit Docker erreicht werden?
Ich möchte den folgenden Infrastrukturfluss erstellen:
Wie kann das mit Docker erreicht werden?
Antworten:
Zunächst müssen Sie einen SSH-Server in den Images installieren, in die Sie ssh-in möchten. Sie können ein Basis-Image für Ihren gesamten Container verwenden, auf dem der SSH-Server installiert ist. Dann müssen Sie nur noch jeden Container ausführen, der den ssh-Port (Standard 22) einem der Ports des Hosts (Remote Server in Ihrem Image) zuordnet -p <hostPort>:<containerPort>
. dh:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
Wenn dann von außen auf die Ports 52022 und 53022 des Hosts zugegriffen werden kann, können Sie mithilfe der IP-Adresse des Hosts (Remote Server), auf der der Port in ssh mit angegeben ist, direkt zu den Containern ssh -p <port>
. Dh:
ssh -p 52022 myuser@RemoteServer
-> SSH zu container1
ssh -p 53022 myuser@RemoteServer
-> SSH zu container2
Hinweis : Diese Antwort bewirbt ein Tool, das ich geschrieben habe.
Die hier ausgewählte Antwort schlägt vor, in jedem Image einen SSH-Server zu installieren. Konzeptionell ist dies nicht der richtige Ansatz ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
Ich habe einen containerisierten SSH-Server erstellt, an den Sie sich an jeden laufenden Container halten können. Auf diese Weise können Sie mit jedem Container Kompositionen erstellen. Die einzige Voraussetzung ist, dass der Container Bash hat.
Im folgenden Beispiel wird ein SSH-Server gestartet, der an Port 2222 des lokalen Computers verfügbar gemacht wird.
$ 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
Weitere Hinweise und Dokumentationen finden Sie unter: https://github.com/jeroenpeeters/docker-ssh
Dies macht nicht nur die Idee eines Prozesses pro Container zunichte, sondern ist auch ein umständlicher Ansatz bei der Verwendung von Images aus dem Docker Hub, da diese häufig keinen SSH-Server enthalten (und sollten).
Diese Dateien öffnen sshd erfolgreich und führen den Dienst aus, sodass Sie ssh lokal einbinden können. (Sie benutzen Cyberduck, nicht wahr?)
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
Startdämon erstellen / ausführen / in Shell springen.
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
Ich denke es ist möglich. Sie müssen lediglich einen SSH-Server in jedem Container installieren und einen Port auf dem Host verfügbar machen. Das größte Ärgernis wäre, die Zuordnung von Port zu Container beizubehalten / sich daran zu erinnern.
Ich muss mich jedoch fragen, warum Sie dies tun möchten. SSH'ng in Container sollte selten genug sein, dass es kein Problem ist, ssh zum Host zu senden und dann Docker Exec zu verwenden, um in den Container zu gelangen.
Erstellen Sie ein Docker-Image mit openssh-server
vorinstalliertem:
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"]
Erstellen Sie das Bild mit:
$ docker build -t eg_sshd .
Führen Sie einen test_sshd
Container aus:
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
Ssh zu Ihrem Container:
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Quelle: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
ssh root@localhost -p <ssh_host_port>
die Anweisungen hier zu