2017-03-06 46 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-

我成功地使用從https://docs.docker.com/engine/examples/running_ssh_service/#build-an-egsshd-image所述dockerfile線減去EXPOSE 22(因爲它不與搬運工-compose.yml端口映射工作)加入SSHD到容器中。但端口不在本地機器

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 

上訪問當我嘗試在本地主機和3022點PUTTY,它說,服務器意外關閉了連接。

我在這裏錯過了什麼?

這是我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輸出以下

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現在沿着一側的Rails應用程序運行,但我是從建立服務工作的配方是不適用於Linux的是附帶的味道正確與我的基本形象https://docs.docker.com/engine/examples/running_ssh_service/#build-an-egsshd-image

我使用的圖像是基於Debian 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進程沒有運行。這是可見的netstat的輸出:

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指出,我應該意識到,如果我比你的搬運工,compose.yml與Dockerfile。您可以定義圖像中的sshd的命令與Dockerfile線:

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

但你與泊塢窗,撰寫命令運行容器時覆蓋您的圖像設置:

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

所以,唯一的事情運行,就像你在netstat中看到的那樣,是在3000上監聽的rails應用程序。如果你需要多個命令來運行,那麼你可以docker exec啓動第二個命令(不建議像這樣的第二個服務),使用命令在後臺運行sshd,在前臺運行rails(相當醜陋),或者你可以考慮像supervisord這樣的東西。

就個人而言,我會跳過sshd,只需使用docker exec -it civilservice_web_1 /bin/bash即可在需要時在容器中獲得提示。

+0

問題是調試器需要SSH服務器才能連接到 –

+0

對於多進程,請查看http://supervisord.org/。不是推薦的解決方案,可以在Docker容器中運行多個不同的應用程序。但是,既然你需要,這是更好的方法之一。 – BMitch

+0

更大的問題可能是,我在這裏正確使用Docker嗎?我是否應該試圖在Docker中託管我的開發環境,希望能夠從本地IDE調試它? –

相關問題