[docker] Docker에 SSH를 사용하는 방법은 무엇입니까?

다음 인프라 흐름을 만들고 싶습니다.

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 이미지 만들기 :

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"]

다음을 사용하여 이미지를 빌드합니다.

$ 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


답변