Windows Boot2Docker:can';无法使端口转发工作

Windows Boot2Docker:can';无法使端口转发工作,windows,docker,forwarding,boot2docker,ports,Windows,Docker,Forwarding,Boot2docker,Ports,我正在windows 8.1上玩boot2docker(docker 1.6)。我想让自己成为一个使用ruby的机器容器,并希望能够从windows主机连接到rails服务器。首先从小步开始,我想从boot2docker VM连接到我的容器。我在下面附上我的docker文件,它构建时没有问题,我可以从中运行容器。我是这样做的: docker run -it -p 3000:3000 3564860f7afd /bin/bash 然后在这个容器里我说: cd ~/myapp &&

我正在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
我得到了HTTP500,这很好,我只是想检查服务器是否正在运行。然后使用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开关来运行,但我总是以同样的方式结束——它不起作用

任何帮助都将不胜感激

2015年5月2日更新

我也尝试过Markus W Mahlberg的评论和VonC的回复中描述的事情。我的虚拟机配置似乎还可以,我还检查了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告诉我响应是空的。通过检查容器上的日志,我知道请求从未到达它

更新结束

2015年5月3日更新

我觉得我的问题与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
来自ubuntu的

维护者匿名
LABEL Description=“Ruby容器”
#基于https://gorails.com/setup/ubuntu/14.10
运行apt获取更新
运行apt get-y升级
运行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软件属性libffi dev
运行echo“%sudo ALL=(ALL)NOPASSWD:ALL'>>/etc/sudoers\
&&groupadd匿名\
&&useradd anonymous-m-g anonymous-g sudo
环境主页/主页/匿名
匿名用户
运行git克隆https://github.com/sstephenson/rbenv.git ~/.rbenv
运行echo'export PATH=“$HOME/.rbenv/bin:$PATH”>>~/.bashrc
运行echo'eval“$(rbenv init-”>~/.bashrc
运行exec$SHELL
运行git克隆https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby build
运行echo'export PATH=“$HOME/.rbenv/plugins/ruby build/bin:$PATH”>>~/.bashrc
运行exec$SHELL
运行git克隆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”
运行rbenv安装2.2.1
运行rbenv global 2.2.1
环境路径“$HOME/.rbenv/PATH:$PATH”
运行echo'gem:--no ri--no rdoc'>~/.gemrc
运行gem安装bundler
运行git config--global color.ui true
运行git config--global user.name“mindriven”
运行git config--global user.email“3dcreator”。pl@gmail.com"
运行ssh-keygen-t rsa-N”“-f~/.ssh/id\u rsa-C”3dcreator。pl@gmail.com"
运行sudo apt get-qy安装软件属性公共python软件属性
运行sudo add apt repository ppa:chris lea/node.js
运行sudo apt get-y安装nodejs
运行gem安装rails-v4.2.0
运行~/.rbenv/bin/rbenv rehash
运行轨道-v
运行sudo apt get-qy安装mysql服务器mysql客户端
运行sudo apt get安装libmysqlclient dev
运行rails new~/myapp-d mysql
运行sudo/etc/init.d/mysql start&&cd~/myapp&&rake db:create
Windows(和OSX)上的boot2docker正在运行一个包含Linux的VirtualBox虚拟机。默认情况下,它只公开ssh到VM所需的端口。您需要修改VM以使其公开更多端口

向VM添加端口更多的是关于配置VirtualBox,而不是关于boot2docker(它是VM的一个属性,而不是运行在其中的软件)。有关“端口转发”和其他网络配置,请参阅VirtualBox文档

见:

您可以使用
VBoxManage.exe
命令在boot2docker VM级别打开这些端口,以便您的实际VM主机访问它们。
默认情况下,只有端口2222是打开的,以便
boot2docker ssh
工作并打开交互式ssh boot2docker会话。
只需确保
VirtualBox
位于您的
路径中即可

  • VBoxManage modifyvm
    :在boot2docker虚拟机尚未启动时或在
    boot2docker停止后工作
  • vboxmanagecontrolvm
    :在启动
    boot2docker启动后,当boot2docker虚拟机运行时工作
假设Docker容器公开了端口8000,您希望从LAN上的其他计算机访问它。您可以使用ssh临时执行此操作:

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

或者,您可以设置永久性VirtualBox NAT端口转发:

如果vm已在运行,则应运行以下其他命令:

现在,您可以从主机访问您的容器

这样,您就不必乱动VirtualBox GUI,从左侧列表中选择名为
boot2docker vm
的计算机,从
Machine
菜单中选择
Settings
(或在Mac上按Command-S),选择顶部的
Network
图标,最后单击
$ boot2docker ssh -vnNTL 8000:localhost:8000
$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";
$ VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port8000,tcp,,8000,,8000";
localhost:8000