2017-03-06 14 views
0

저는 Ruby on Rails 환경을 가지고 있으며 Docker에서 실행되도록 변환 중입니다. 이것은 주로 개발 컴퓨터가 Windows 랩탑이고 서버가 그렇지 않기 때문입니다. Docker 컨테이너가 주로 실행 중이며 지금은 RubyMine 디버거에 연결하려고합니다. 이 작업을 수행하려면 컨테이너에 SSH 서버를 설치하는 것이 좋습니다. Windows에서 Docker 컨테이너 내 SSHD에 연결하는 방법은 무엇입니까?

https://intellij-support.jetbrains.com/hc/en-us/community/posts/207649545-Use-RubyMine-and-Docker-for-development-run-and-debug-before-deployment-for-testing-

나는 성공적으로 (가 고정 표시기 - compose.yml의 포트 매핑 작동하지 않았기 때문에) 마이너스 (22)에 노출 https://docs.docker.com/engine/examples/running_ssh_service/#build-an-egsshd-image에서 dockerfile 라인을 사용하여 컨테이너에 SSHD를 추가했다. 내가 로컬 호스트 및 3022에서 PUTTY을 가리 키도록하려고하면 그러나 포트가 로컬 컴퓨터

CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS           NAMES 
6652389d248c  civilservice_web "bundle exec rails..." 16 minutes ago  Up 16 minutes  0.0.0.0:3000->3000/tcp, 0.0.0.0:3022->22/tcp civilservice_web_1 

에 액세스 할 수 없습니다, 서버가 연결이 갑자기 닫혀 있다고 말한다.

무엇이 여기에 있습니까?

이 내 dockerfile

FROM ruby:2.2 
RUN apt-get update && apt-get install -y \ 
    build-essential \ 
    libpq-dev \ 
    nodejs \ 
    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 '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd 

ENV NOTVISIBLE "in users profile" 
RUN echo "export VISIBLE=now" >> /etc/profile 

CMD ["/usr/sbin/sshd", "-D"] 

RUN mkdir /MyApp 
WORKDIR /MyApp 
ADD Gemfile /MyApp/Gemfile 
ADD Gemfile.lock /MyApp/Gemfile.lock 
RUN bundle install 
ADD . /MyApp 

이며,이 내 고정 표시기-compose.yml

version: '2' 
services: 
    web: 
    build: . 
    command: bundle exec rails s -p 3000 -b '0.0.0.0' 
    volumes: 
     - .:/CivilService 
    ports: 
     - "3000:3000" 
     - "3022:22" 
이다
DOCKER_HOST은 환경 변수를

docker version 출력되도록 나타나지

다음

,451,515,
Client: 
Version:  17.03.0-ce 
API version: 1.26 
Go version: go1.7.5 
Git commit: 60ccb22 
Built:  Thu Feb 23 10:40:59 2017 
OS/Arch:  windows/amd64 

Server: 
Version:  17.03.0-ce 
API version: 1.26 (minimum version 1.12) 
Go version: go1.7.5 
Git commit: 3a232c8 
Built:  Tue Feb 28 07:52:04 2017 
OS/Arch:  linux/amd64 
Experimental: true 

docker run -it --rm --net container:civilservice_web_1 busybox netstat -lnt 출력

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
tcp  0  0 0.0.0.0:3000   0.0.0.0:*    LISTEN 
tcp  0  0 127.0.0.11:35455  0.0.0.0:*    LISTEN 

SSHD는 이제 사이드 레일 응용 프로그램에 따라 실행되고 있지만이 서비스를 설정에서 작업 된 조리법 온 리눅스의 맛에 대한 정확하지 않습니다 내 기본 이미지로 https://docs.docker.com/engine/examples/running_ssh_service/#build-an-egsshd-image

사용중인 이미지는 데비안 8을 기반으로합니다. 예제가 나에게 알려준 부분을 지적 해 주시겠습니까?

+2

'echo $ DOCKER_HOST','docker version','docker run -it --rm -net container : civilservice_web_1 busybox netstat -lnt'의 출력으로 질문을 업데이트 할 수 있습니까? – BMitch

+0

@BMitch DOCKER_HOST 환경 변수가없는 것 같습니다만 –

+1

SSHD는 실행되지 않습니다. 컨테이너 당 하나의 CMD. – user2105103

답변

0

sshd 프로세스가 실행되고 있지 않습니다.

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
tcp  0  0 0.0.0.0:3000   0.0.0.0:*    LISTEN 
tcp  0  0 127.0.0.11:35455  0.0.0.0:*    LISTEN 

을하지만 user2105103가 지적한대로, 나는 실현한다 나는 Dockerfile와 고정 표시기-compose.yml을 비교하면 그 : 즉,에서 netstat 출력에서 ​​볼 수 있습니다. 당신은 Dockerfile 라인 이미지의 SSHD 명령을 정의

CMD ["/usr/sbin/sshd", "-D"] 

그러나 고정 표시기-작성 명령을 사용하여 컨테이너를 실행하는 경우 다음 당신은 당신의 이미지 설정을 무시 :

command: bundle exec rails s -p 3000 -b '0.0.0.0' 

그래서, 유일한 당신이 netstat에서 볼 수 있듯이, 3000에서 듣고있는 레일 앱입니다. 실행하기 위해 여러 개의 명령이 필요하다면, docker exec 두 번째 명령을 시작하면됩니다 (이와 같은 두 번째 서비스에는 권장되지 않습니다). 명령을 사용하십시오 백그라운드에서 sshd를 시작하고 전경 (상당히 못생긴)의 레일을 시작하거나 감독관과 같은 것을 고려할 수 있습니다.

개인적으로 sshd를 건너 뛰고 docker exec -it civilservice_web_1 /bin/bash을 사용하면 필요할 때 컨테이너 내부에 프롬프트를 표시 할 수 있습니다.

+0

문제는 디버거가 –

+0

에 접속하기 위해 SSH 서버가 필요하다는 것입니다. 여러 프로세스의 경우 http://supervisord.org/를보십시오. 고정 컨테이너에서 여러 개의 다른 앱을 실행하는 데 권장되는 솔루션은 아닙니다. 그러나 당신이해야하기 때문에, 이것은 더 좋은 방법 중 하나입니다. – BMitch

+0

더 큰 질문이있을 수 있습니다, 나는 여기서 정확하게 Docker를 사용하고 있습니까? Docker에서 개발 환경을 호스팅하지 않고 로컬 IDE에서 디버깅 할 수 있어야합니까? –