我的用例:
我们需要在无头模式下运行 watir-webdriver 脚本,并且我们的开发机器运行 Windows。
我们的问题的要点:
我可以在容器内建立 python 服务器,但我无法在主机的预期位置连接到它:http://192.168.59.103:8084.
架构:
一个“做一些有用的事情并将输出打印到控制台”的 ruby 脚本和一个基本的 python 服务器,它导入 os 然后在我们的索引路由中执行 os.system('ruby ourrubyscript.rb')。我们还引入了用于 api 路由的 flask 和 flask.cors 以消除潜在的跨源问题。
本地测试(在主机上):
在我们的主机工作区中运行“python server.py”会在端口 5000 上建立一个 python 服务器。从浏览器路由到它会执行我们的路由并将预期的输出打印到控制台。
服务器.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()
当我导航到 localhost:5000 时,“Hello Stupid”会打印到我的屏幕上。
当我路由到 localhost:5000/ruby/test 时,我们的脚本运行并且该脚本打印到我的控制台。
将其移至 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。我几乎“啊哈!!” 有一刻认为 iptables 默认锁定了端口,我们需要打开内部端口 5000 以便将其映射到 vm,但后来我发现 centos 映像没有安装 iptables(或 firewalld,因为这是 CentOS7)默认。当这种方法被证明不正确时,我决定发帖看看是否有人可以在这里提供帮助,因为我没有想法。