Chciałbym utworzyć następujący przepływ infrastruktury:
Jak można to osiągnąć za pomocą Dockera?
Chciałbym utworzyć następujący przepływ infrastruktury:
Jak można to osiągnąć za pomocą Dockera?
Odpowiedzi:
Najpierw musisz zainstalować serwer SSH na obrazach, do których chcesz ssh-do. Możesz użyć obrazu podstawowego dla całego kontenera z zainstalowanym serwerem ssh. Następnie wystarczy uruchomić każdy kontener mapujący port ssh (domyślnie 22) do jednego z portów hosta (serwer zdalny na obrazie), używając -p <hostPort>:<containerPort>
. to znaczy:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
Następnie, jeśli porty 52022 i 53022 hostów są dostępne z zewnątrz, możesz bezpośrednio ssh do kontenerów za pomocą adresu IP hosta (serwera zdalnego), określając port w ssh za pomocą -p <port>
. To znaczy:
ssh -p 52022 myuser@RemoteServer
-> SSH do kontenera1
ssh -p 53022 myuser@RemoteServer
-> SSH do kontenera 2
Uwaga : ta odpowiedź promuje napisane przeze mnie narzędzie.
Wybrana tutaj odpowiedź sugeruje zainstalowanie serwera SSH w każdym obrazie. Koncepcyjnie nie jest to właściwe podejście ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
Utworzyłem kontenerowy serwer SSH, który możesz „przykleić” do dowolnego działającego kontenera. W ten sposób możesz tworzyć kompozycje z każdym pojemnikiem. Jedynym wymaganiem jest to, aby kontener miał bash.
Poniższy przykład spowoduje uruchomienie serwera SSH udostępnionego na porcie 2222 komputera lokalnego.
$ 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
Aby uzyskać więcej wskazówek i dokumentacji, zobacz: https://github.com/jeroenpeeters/docker-ssh
To nie tylko podważa ideę jednego procesu na kontener, ale jest także uciążliwym podejściem podczas korzystania z obrazów z Docker Hub, ponieważ często nie zawierają one (i nie powinny) zawierać serwera SSH.
Te pliki pomyślnie otworzą sshd i uruchomią usługę, dzięki czemu możesz ssh lokalnie. (używasz cyberkaczki, prawda?)
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
zbudować / uruchomić uruchomić demona / wskoczyć do powłoki.
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
Myślę, że to możliwe. Wystarczy zainstalować serwer SSH w każdym kontenerze i udostępnić port na hoście. Główną przeszkodą byłoby utrzymanie / zapamiętanie mapowania portu do kontenera.
Muszę jednak zapytać, dlaczego chcesz to zrobić. SSH'ng do kontenerów powinno być na tyle rzadkie, że nie jest problemem ssh do hosta, a następnie użyj docker exec, aby dostać się do kontenera.
Utwórz obraz Dockera z openssh-server
preinstalowanym:
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"]
Zbuduj obraz używając:
$ docker build -t eg_sshd .
Uruchom test_sshd
kontener:
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
Ssh do twojego kontenera:
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Źródło: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
ssh root@localhost -p <ssh_host_port>
postępować zgodnie z instrukcjami tutaj