다음 인프라 흐름을 만들고 싶습니다.
Docker를 사용하여 어떻게 달성 할 수 있습니까?
답변:
먼저 ssh-into하려는 이미지에 SSH 서버를 설치해야합니다. ssh 서버가 설치된 모든 컨테이너에 기본 이미지를 사용할 수 있습니다. 그런 다음 -p <hostPort>:<containerPort>
. 즉 :
docker run -p 52022:22 container1
docker run -p 53022:22 container2
그런 다음 호스트의 52022 및 53022 포트에 외부에서 액세스 할 수있는 경우 ssh에서 포트를 지정하는 호스트 (원격 서버)의 IP를 사용하여 컨테이너에 직접 ssh 할 수 있습니다 -p <port>
. 즉 :
ssh -p 52022 myuser@RemoteServer
-> container1에 대한 SSH
ssh -p 53022 myuser@RemoteServer
-> container2에 대한 SSH
알림 :이 답변은 내가 작성한 도구를 홍보합니다.
여기에서 선택한 답변은 모든 이미지에 SSH 서버를 설치하도록 제안합니다. 개념적으로 이것은 올바른 접근 방식이 아닙니다 ( https://docs.docker.com/articles/dockerfile_best-practices/ ).
실행중인 모든 컨테이너에 '고정'할 수있는 컨테이너화 된 SSH 서버를 만들었습니다. 이렇게하면 모든 컨테이너로 컴포지션을 만들 수 있습니다. 유일한 요구 사항은 컨테이너에 bash가 있다는 것입니다.
다음 예제는 로컬 시스템의 포트 2222에 노출 된 SSH 서버를 시작합니다.
$ 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
더 많은 포인터 및 문서는 https://github.com/jeroenpeeters/docker-ssh를 참조하십시오.
이것은 컨테이너 당 하나의 프로세스라는 아이디어를 무너 뜨릴뿐만 아니라 Docker Hub의 이미지를 사용할 때 종종 SSH 서버를 포함하지 않거나 포함해서는 안되기 때문에 번거로운 접근 방식입니다.
이 파일은 sshd를 성공적으로 열고 서비스를 실행하므로 로컬에서 ssh 할 수 있습니다. (당신은 사이버 덕을 사용하고 있지 않습니까?)
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
시작 데몬을 빌드 / 실행 / 쉘로 이동합니다.
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
가능하다고 생각합니다. 각 컨테이너에 SSH 서버를 설치하고 호스트에 포트를 노출하기 만하면됩니다. 주요 성가심은 포트와 컨테이너의 매핑을 유지 / 기억하는 것입니다.
그러나 나는 당신이 왜 이것을하고 싶어하는지 의문을 가지고 있습니다. 컨테이너에 대한 SSH'ng는 호스트에 ssh 한 다음 docker exec를 사용하여 컨테이너에 들어가는 것이 번거롭지 않을 정도로 드 물어야합니다.
openssh-server
사전 설치된 Docker 이미지 만들기 :
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"]
다음을 사용하여 이미지를 빌드합니다.
$ docker build -t eg_sshd .
test_sshd
컨테이너 실행 :
$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22
0.0.0.0:49154
컨테이너에 Ssh :
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
출처 : https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image