如何从Windows连接到Docker容器内的SSHD?

我有一个Ruby on Rails环境,并将其转换为在Docker中运行。 这主要是因为开发机器是Windows笔记本电脑,而服务器则不是。 我有Docker容器主要运行,现在我想连接RubyMinedebugging器。 为了达到这个目的,build议在容器中设置一个SSH服务器。

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减去EXPOSE 22中的dockerfile行成功地将SSHD添加到容器中(因为它不能与端口一起工作在docker-compose.yml中映射)。 但是端口不能在本地机器上访问

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 

当我试图指向PUTTY在本地主机和3022,它说,服务器意外closures连接。

我在这里错过了什么?

这是我的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 '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 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 

这是我的docker-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似乎不是一个环境variables

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 /#集结的-egsshd图像

我正在使用的图像是基于Debian 8的。有人能指出我的例子在哪里崩溃?

你的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指出,我应该已经意识到,如果我把你的docker-compose.yml与Dockerfile比较。 使用Dockerfile行定义图像中的sshd命令:

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

但是,当你用docker-compose命令运行容器时,你会覆盖你的图像设置:

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

所以,正如你在netstat中看到的那样,唯一能运行的是Rails应用程序监听3000.如果你需要多个命令来运行,那么你可以通过docker exec启动第二个命令(不build议像第二个服务一样这个),使用一个命令,在后台启动sshd和rails在前台(相当丑陋),或者你可以考虑像supervisord。

就个人而言,我会跳过sshd,只需使用docker exec -it civilservice_web_1 /bin/bash在需要时在容器中获取提示。