Boot2Docker:无法实现端口转发

3

我正在使用Windows 8.1上的boot2docker(docker 1.6)进行尝试。我想创建一个容器来玩ruby,并且希望能够从Windows主机连接到rails服务器。首先,我想从我的boot2docker VM连接到我的容器,以逐步学习。下面是我的docker文件,它能够顺利构建,我可以从中运行一个容器。操作如下:

docker run -it -p 3000:3000 3564860f7afd /bin/bash

然后在这个容器中我说:
cd ~/myapp && bundle exec rails server -d

为了确认一切正常运行,我执行以下操作:

~/myapp$ sudo apt-get install wget && wget localhost:3000

我得到了http 500错误,这很正常,我只是想检查服务器是否在运行。然后我使用ctrl+p、ctrl+q退出。但是在boot2docker机器上,我再次执行相同操作。

wget localhost:3000

并获得

Connecting to localhost:3000 (127.0.0.1:3000)
wget: error getting response: Connection reset by peer

看起来端口3000没有正确地转发到boot2docker VM。我做错了什么?我错过了什么?我进行了广泛的谷歌搜索并尝试了一些事情,比如明确从dockerfile中公开端口或添加-P开关运行,但我总是以同样的方式结束 - 它不起作用。
非常感谢任何帮助。
更新02.05.2015
我还尝试了Markus W Mahlberg和VonC的评论中描述的内容。我的VM配置似乎没问题,在VirtualBox的GUI中也进行了检查,看起来很好。一些更多的信息:当我开始时
boot2docker ssh -vnNTL 3000:localhost:3000

然后在我的Windows主机上打开localhost:3000,我可以在boot2docker控制台的跟踪日志中看到以下内容:

debug1: channel 1: free: direct-tcpip: listening port 3000 for localhost port 3000, connect from 127.0.0.1 port 50512 to 127.0.0.1 port 3000, nchannels 3

Chrome告诉我响应为空。从查看容器日志中,我知道请求从未到达它。
更新结束
更新日期:03.05.2015
我认为我的问题与boot2docker或docker关系不大,而是与我的计算机配置有关。我检查过docker/boot2docker配置很多次了,所以犯错的可能性很小。
我绝望地重新安装了boot2docker和VirtualBox,但仍然没有效果。你有什么想法来调试我的配置有什么问题吗?我唯一的其他想法是在另一台机器上尝试做同样的事情。但是即使这样可以解决问题,我的原始问题也同样令人烦恼。
更新结束
这是我的dockerfile:
FROM ubuntu
MAINTAINER anonymous <anonymous@localhost.com>
LABEL Description="Ruby container"
# based on https://gorails.com/setup/ubuntu/14.10
RUN apt-get update
RUN apt-get -y upgrade
RUN apt-get -y install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
    && groupadd anonymous \
    && useradd anonymous -m -g anonymous -g sudo
ENV HOME /home/anonymous
USER anonymous

RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
RUN echo 'eval "$(rbenv init -)"' >> ~/.bashrc
RUN exec $SHELL

RUN git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
RUN exec $SHELL
RUN git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash

ENV PATH "$HOME/.rbenv/bin:$HOME/.rbenv/plugins/ruby-build/bin:$PATH"

RUN rbenv install 2.2.1
RUN rbenv global 2.2.1

ENV PATH "$HOME/.rbenv/shims:$PATH"

RUN echo 'gem: --no-ri --no-rdoc' > ~/.gemrc
RUN gem install bundler

RUN git config --global color.ui true
RUN git config --global user.name "mindriven"
RUN git config --global user.email "3dcreator.pl@gmail.com"
RUN ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa -C "3dcreator.pl@gmail.com"

RUN sudo apt-get -qy install software-properties-common python-software-properties
RUN sudo add-apt-repository ppa:chris-lea/node.js
RUN sudo apt-get -y install nodejs

RUN gem install rails -v 4.2.0
RUN ~/.rbenv/bin/rbenv rehash
RUN rails -v

RUN sudo apt-get -qy install mysql-server mysql-client
RUN sudo apt-get install libmysqlclient-dev
RUN rails new ~/myapp -d mysql
RUN sudo /etc/init.d/mysql start && cd ~/myapp && rake db:create

端口仅暴露给运行docker守护进程的虚拟机。详情请参见http://acaird.github.io/computers/2014/11/16/docker-virtualbox-host-networking/。 - Markus W Mahlberg
@MarkusWMahlberg 谢谢你提供的链接,但我之前已经做过所有这些了。仍然有可能是我做错了什么,但我不知道是什么。在设置端口转发后,在 VM GUI 中看到了正确的配置。 - mindriven
3个回答

4
请查看Boot2docker解决方案
您可以使用VBoxManage.exe命令在boot2docker VM级别上打开这些端口,以便您的实际VM主机访问它们。
默认情况下,只有端口2222是开放的,用于boot2docker ssh工作并打开交互式ssh boot2docker会话。
只需确保VirtualBoxPATH中即可。
  • VBoxManage modifyvm:当boot2docker VM尚未启动或在boot2docker stop之后工作时。
  • VBoxManage controlvm:在boot2docker VM运行并进行boot2docker start之后工作。

假设您的Docker容器公开端口8000,并且您希望从局域网中的其他计算机访问它。 您可以使用ssh暂时实现:

运行以下命令(并保持其打开):

$ boot2docker ssh -vnNTL 8000:localhost:8000

或者您可以设置永久的VirtualBox NAT端口转发:
$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";

如果虚拟机已经在运行,则应运行以下命令:
$ VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port8000,tcp,,8000,,8000";

现在您可以在主机上访问容器,路径为:
localhost:8000

这样一来,你就不必在VirtualBox的GUI中操作了,无需从左侧的列表中选择名为boot2docker-vm的计算机,在Machine菜单中选择Settings(或者在Mac上按下Command-S),在顶部选择Network图标,最后点击Port Forwarding按钮。


谢谢您的回复。您在回答中总结的大致是我迄今为止尝试过的。当我启动"boot2docker ssh -vnNTL 3000:localhost:3000",然后在Windows主机上打开localhost:3000时,我会在控制台跟踪日志中看到:'debug1: channel 1: free: direct-tcpip: listening port 3000 for localhost port 3000, connect from 127.0.0.1 port 50512 to 127.0.0.1 port 3000, nchannels 3'。Chrome告诉我响应为空。通过检查容器日志,我知道请求从未到达容器。有什么方法可以调试这个? - mindriven
@mindriven 试试使用 boot2docker stop 命令和正确端口的 modifyvm 命令。然后再运行简单的 boot2docker start 命令。 - VonC
我刚刚又做了一遍(这已经是第7次了)。我使用VirtualBox GUI检查配置是否正确添加,结果是正确的。但是没有效果。我认为我已经正确设置了我的boot2docker,但似乎有些东西阻止我看到效果。您有什么想法应该检查什么? - mindriven
1
@mindriven 不确定:如果容器映射其端口到Linux主机并且VM打开相同的端口...它应该可以工作。如果不行,主机上的其他因素会阻止访问(例如防火墙或某些网络设置)。 - VonC

1
在Windows(和OSX)上,boot2docker运行一个带有Linux的VirtualBox VM。默认情况下,它仅公开ssh到VM所需的端口。您需要修改VM以公开更多端口。
向VM添加端口更多地涉及配置VirtualBox,而不是boot2docker(它是VM的属性,而不是其中运行的软件)。请参阅VirtualBox文档中的“端口转发”和其他网络配置。https://www.virtualbox.org/manual/ch06.html

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接