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


답변:


69

먼저 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


그리고 이러한 포트를 외부 세계에 노출하는 방법은 무엇입니까? nginx없이 구성 할 수 있다면?
Kamil Lelonek

2
@squixy : 호스트의 포트 일뿐입니다. 다른 응용 프로그램과 동일한 방식으로 노출하십시오. 그냥 작동하거나 방화벽에서 포트를 열어야 할 수도 있습니다.
Adrian Mouat 2015 년

저는 도메인 이름을 포트에 매핑하는 가장 좋은 방법이 무엇인지 궁금합니다.하지만 NginX가 제가 쉽게 구현할 수있는 솔루션이라고 생각합니다.
Kamil Lelonek 15.01.25

container1은 무엇입니까? "docker run <name>"을 수행하면 <name>이 이미지 이름으로 해석되므로 docker는 repos에서 이미지를 찾습니다. 내 컨테이너 ID가 docker run에서 작동하지 않습니다. 컨테이너를 시작하기 위해 "docker start <containerID>"를 사용하지만 docker start는 -p 매개 변수를 허용하지 않습니다.
mvmn 2011

1
Docker 사용자가 "root"인 경우 "passwd root"를 통해 사용자 root에 암호를 제공해야합니다. 또한이 작품을 발견했습니다 : docker run -p 52022 : 22 container1 service ssh start -D FOREGROUND
CMP

42

알림 :이 답변은 내가 작성한 도구를 홍보합니다.

여기에서 선택한 답변은 모든 이미지에 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 서버를 포함하지 않거나 포함해서는 안되기 때문에 번거로운 접근 방식입니다.


6
정답이되어야합니다. 원하는 모든 이미지에 SSH 서버를 설치하는 것은 Docker 수준에 위배됩니다. 컨테이너 당 하나의 서비스 만 있어야하며 서비스 / 컨테이너에서 애플리케이션을 작성해야합니다.
babbata

2
@JeroenPeeters "Docker 소켓이 컨테이너에 매핑되어 컨테이너가 Docker 엔진에 액세스 할 수 있습니다."라는 또 다른 전제 조건이 있다고 생각합니다.
Nam G VU

1
위의 명령어에서 'jeroenpeeters'는 무엇입니까? 컨테이너의 사용자 이름입니까?
Pratik Patil

1
@PratikPatil은 이미지 이름의 일부입니다. hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters

13

이 파일은 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

여기에 이미지 설명 입력


2
안녕하세요, 좋은 대답입니다. 내 컨테이너가 나타나고 로그인하라는 메시지가 표시되지만 자격 증명은 "root"와 "password"입니까? 그것은 나를 위해 작동하지 않는 것 같지만 귀하의 솔루션이 마음에 들며 사용하고 싶습니다.
Jabari Dash

확실하지 않음-포트 22를 누르는 데 문제가 발생했습니다. 해당 포트와 충돌하기 위해 로컬 장치에서 자주 열릴 수 있으므로 포트 2222를 사용하는지 확인하십시오.
johndpope

/ etc / ssh / sshd_config의이 줄 ( 'PermitRootLogin without-password')은 기본적으로 주석 처리되므로 대신 's / # PermitRootLogin without-password / PermitRootLogin yes /'를 사용하십시오. Ubuntu 16.04+의 경우 '비밀번호 없음'대신 '비밀번호 금지'를 사용해야 할 수도 있습니다. 컨테이너에 exec하여 미리 확인할 수 있습니다.
ItsJack

10

가능하다고 생각합니다. 각 컨테이너에 SSH 서버를 설치하고 호스트에 포트를 노출하기 만하면됩니다. 주요 성가심은 포트와 컨테이너의 매핑을 유지 / 기억하는 것입니다.

그러나 나는 당신이 왜 이것을하고 싶어하는지 의문을 가지고 있습니다. 컨테이너에 대한 SSH'ng는 호스트에 ssh 한 다음 docker exec를 사용하여 컨테이너에 들어가는 것이 번거롭지 않을 정도로 드 물어야합니다.


따라서 프로젝트별로 컨테이너를 만드는 방식으로 환경을 모델링하고 싶습니다. 따라서 각 프로젝트에는 자체 환경, 사용자, 데이터베이스, 파이썬 / 루비 버전 등이 있습니다. 여러 서버를 만들지 않고 프로젝트를 격리하고 싶습니다.
Kamil Lelonek

1
@squixy; 확인. 일반적으로 도커 컨테이너는 단일 프로세스 만 보유합니다. 관용적으로는 mysql, php 및 apache에 대해 별도의 컨테이너가 있어야합니다. 이것이 당신에게 얼마나 잘 될지 잘 모르겠습니다.
Adrian Mouat 2015 년

제 사건에 대한 더 나은 해결책을 알고 있습니까?
Kamil Lelonek 15.01.25

1
@squixy 그것은 많은 것들에 달려 있습니다. 각 컨테이너를 여러 컨테이너로 나누는 것이 좋습니다. ssh가 필요한 이유는 무엇입니까? 유지 보수 일뿐이라면 왜 호스트에 ssh를 한 다음 docker exec를 사용할 수 없습니까? 나는 두려워하는 코멘트에 대답하기에는 너무 큰 질문입니다.
Adrian Mouat 2015 년

Adrian이 쓴 것처럼 Docker 사용에 익숙해지면 컨테이너! = 가상 머신을 알게됩니다. 실행중인 컨테이너에 대한 대화 형 액세스 권한을 얻을 필요가 거의 없습니다.
mzedeler 2015 년

8

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


Mac os x의 경우 여기ssh root@localhost -p <ssh_host_port> 지침을 따르십시오
Claudio Santos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.