簡體   English   中英

連接到在boot2docker中運行的python服務器時出錯(centos容器| Windows 7.1主機)

[英]Error connecting to python server running in boot2docker (centos container | Windows 7.1 host)

我的用例
我們需要以無頭模式運行watir-webdriver腳本,並且我們的開發機運行Windows。

我們的問題要點

我可以在容器中站起python服務器,但是無法從主機的預期位置連接到它: http://192.168.59.103:8084. : http://192.168.59.103:8084. : http://192.168.59.103:8084.

架構

一個紅寶石腳本,“做一些有用的事情並將輸出打印到控制台”,以及一個基本的python服務器,該服務器導入os,然后在我們的索引路由內執行os.system('ruby ourrubyscript.rb')。 我們還引入了用於api路由的flask和flask.cors,以消除潛在的跨源問題。

本地測試(在主機上)

在主機工作空間中運行“ 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()

當我導航到localhost:5000時,“ Hello Stupid”打印到我的屏幕上。
當我路由到localhost:5000 / ruby​​ / test時,我們的腳本運行,並且該腳本打印到我的控制台。


將其移至Docker的過程

我們提取了最新的centos,並安裝了wget,xvfb,git,ruby,python,pip,flask,flask-cors和firefox; 將其提交給名為“ webdev”的本地映像。 然后gem無頭安裝,並將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的端口默認情況下處於鎖定狀態,因此我們需要打開內部端口5000才能將其映射到vm,但隨后我發現centos映像沒有安裝iptables(或防火牆,因為這是CentOS7)默認。 當這種方法被證明是不正確的時,我決定發布帖子,看看是否有人可以在這里提供幫助,因為我沒有想法。

因此,我已經弄清楚了為什么不將其暴露給宿主環境,並且這是很合理的。

在NAT模式下,為虛擬機分配了一個專用的靜態IP地址: 192.168.59.103 (即...為虛擬機分配了該IP)

每個容器都帶有2個適配器:環回和vm可訪問的面向外部的虛擬專用網橋。

當我在端口5000上站立服務器時,它直接綁定到容器內的環回,並且虛擬機無法訪問。

從服務中刪除本地主機綁定,並允許其綁定到默認網關0.0.0.0:5000

使服務在所有適配器上進行偵聽,並允許通過容器站立時創建的虛擬專用網橋在vm和容器的外部適配器之間進行通信。

出於某種原因,將我的虛擬機切換為針對我的NIC以橋接模式運行會導致boot2docker-vm在啟動時崩潰。...所以我暫時降級為NAT,直到我弄清楚如何切換它為止正常。

[編輯1(與橋接有關)]

至少從2014年10月8日開始,boot2docker目前似乎不支持橋接模式。b2d期望用於ssh引導的NAT適配器和用於容器<->容器套接字訪問的主機適配器。

將容器暴露給網絡上主機的當前不受支持的,未記錄的解決方法是向VirtualBox添加第三個網絡接口並與其建立橋接。


[編輯2(針對默認網關運行的示例服務器)]

這是連接到所有接口的Flask服務器的示例:請注意,上方服務器和下方服務器之間的唯一Δ是配置的最后一行。

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM