Boot2Docker:无法使端口转发工作

我在Windows 8.1上玩boot2docker(docker 1.6)。 我想让自己的机器容器与ruby玩,我想能够从我的Windows主机连接到Rails服务器。 首先从小步骤开始,我想从我的boot2docker虚拟机连接到我的容器。 我附上我的docker文件下面,它build立没有问题,我可以从它运行一个容器。 我这样做:

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虚拟机。 我做错了什么? 我错过了什么? 我广泛search,并尝试了一些东西,如显式暴露端口从dockerfile或添加-P开关运行,但我总是以同样的方式结束 – 这是行不通的。

任何帮助将不胜感激。

更新02.05.2015

我也尝试了Markus W Mahlberg的评论和VonC的回应。 我的虚拟机configuration似乎没问题,我也检查了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 

铬告诉我,答复是空的。 从检查容器上的日志我知道,请求永远不会到它。

更新结束

更新03.05.2015

我的问题与我的电脑configuration没有太大的关系,boot2docker或docker。 我已经多次了解我的docker / boot2dockerconfiguration,我不太可能在那里犯了一个错误。

拼命地我已经重新安装boot2docker和VirtualBox,仍然没有效果。 任何想法如何debugging我的configuration可能是错误的? 我只有其他的想法是在另一台机器上做同样的事情。 但是,即使这样做,我原来的问题也不会让人讨厌。

更新结束

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

请参阅Boot2docker解决方法 :

您可以使用VBoxManage.exe命令在boot2docker VM级别打开这些端口,以便实际的VM主机访问它们。
默认情况下,只有端口2222处于打开状态, boot2docker ssh才能工作并打开一个交互式ssh boot2docker会话。
只要确保VirtualBox在你的PATH

  • VBoxManage modifyvm :在boot2docker虚拟机尚未启动或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上按CommandS ),选择Network图标,最后点击Port Forwarding按钮。

Windows(和OSX)上的boot2docker正在运行带有Linux的VirtualBox虚拟机。 默认情况下,它只公开ssh进入虚拟机所需的端口。 你需要修改虚拟机,让它暴露更多的端口。

向虚拟机添加端口更多的是关于配置VirtualBox而不是关于boot2docker(它是虚拟机的一个属性,而不是内部运行的软件)。 有关“端口转发”和其他网络配置,请参阅VirtualBox文档。 https://www.virtualbox.org/manual/ch06.html