连接到在boot2docker(centos容器| Windows 7.1主机)上运行的python服务器时出错
我的用例 :
我们需要在无头模式下运行watir-webdriver脚本,我们的开发机器运行Windows。
我们问题的要点 :
我可以站在容器内的python服务器,但我不能连接到它的主机预期的位置: http://192.168.59.103:8084.
: http://192.168.59.103:8084.
: http://192.168.59.103:8084.
架构 :
一个ruby脚本,它“做一些有用的事情并将输出打印到控制台”和一个导入os的基本python服务器,然后在我们的索引path中执行os.system('ruby ourrubyscript.rb')。 我们还提供了api routing和flask.cors的烧瓶,以消除潜在的交叉产地问题。
本地testing(在主机上) :
在我们的主机工作区运行“python server.py”,在端口5000上站起来一个python服务器。从浏览器到它的路由执行我们的路由,并将预期输出打印到控制台。
server.py
from flask import Flask from flask import request from flask.ext.cors import CORS import os app = Flask(__name__) CORS(app, resources={r'/': {"origins": "*"}}, headers='Content-Type') app.config['CORS_HEADERS'] = 'Content-Type' @app.route('/') def index(): return "<h1>Hello Stupid</h1>" @app.route('/ruby/test', methods=['GET']) def runRubyScript(): return os.system("ruby script.rb") if __name__ == "__main__": app.run()
当我导航到本地主机:5000,“你好愚蠢”打印到我的屏幕上。
当我路由到本地主机:5000 /ruby/testing,我们的脚本运行,脚本打印到我的控制台。
将其移动到docker的过程
我们拉最新的centos并安装wget,xvfb,git,ruby,python,pip,flask,flask-cors和firefox; 对一个名为“webdev”的本地图像做出了承诺。 然后gem安装了headless,并且把phantomjs安装到了$ PATH然后我们把我们的src仓库克隆到容器中的“/ opt / testapp”。 这个仓库包含我们的“server.py”文件和一个“script.rb”文件。
docker@boot2docker:~$ docker run -d -p 5000:5000 --name wd webdev python /opt/testapp/server.py
所以,我把我的boot2docker-vm绑定到私有IP 192.168.59.103
,我可以通过导航到运行不同容器的不同端口来确认这个IP是有效的; 但是,当我导航到5000时,我得到一个ERR_CONNECTION_REFUSED。 我有一个几乎“AHA !!” 当时认为iptables默认端口是locking的,我们需要打开内部端口5000来映射到vm,但是我发现centos映像没有安装iptables(或者firewalld,因为这是CentOS7)默认。 当这种方法结果不正确的时候,我决定张贴一下,看看有没有人可以在这里协助,因为我没有想法。
所以我想出了为什么这个东西没有暴露在主机环境下,这是非常有意义的。
在NAT模式下,虚拟机被分配一个私有静态IP地址: 192.168.59.103
(即… 虚拟机被分配该IP)
每个容器都有两个适配器:一个环回和一个面向虚拟机的面向外部的虚拟专用网桥。
当我站在服务器的端口5000时,它直接绑定到容器内的环回,并且虚拟机无法访问。
从服务中删除本地主机绑定,并允许它绑定到默认网关
0.0.0.0:5000
使服务侦听所有适配器,并允许vm和容器的外部适配器之间的通信,通过在容器站立时创build的虚拟专用桥。
出于某种原因,切换我的虚拟机在桥接模式下运行对我的网卡导致boot2docker-VM崩溃开始….所以我被降级到NAT暂时,直到我可以找出如何切换正常。
[编辑1(与桥接有关)]
至less从2014年10月8日起,Bridge模式似乎在boot2docker中不受支持。b2d期望使用ssh bootstrapping的NAT适配器和容器< – >容器套接字访问的主机适配器。
当前的,不受支持的,未公开的解决方法将容器公开给networking上的主机是向VirtualBox添加第三个networking接口并与之build立桥接。
[编辑2(示例服务器运行在默认网关上)]
以下是连接到所有接口的瓶式服务器的示例:请注意,上面的服务器和下面的服务器之间唯一的Δ是configuration的最后一行。
app.run()
需要变成app.run(host='0.0.0.0')
from flask import Flask from flask import request from flask.ext.cors import CORS import os app = Flask(__name__) CORS(app, resources={r'/': {"origins": "*"}}, headers='Content-Type') app.config['CORS_HEADERS'] = 'Content-Type' @app.route('/') def index(): return "<h1>Hello Stupid</h1>" @app.route('/ruby/test', methods=['GET']) def runRubyScript(): return os.system("ruby script.rb") if __name__ == "__main__": app.run(host='0.0.0.0')