Итак, я пытаюсь докеризовать приложение Flask, которое выполняет следующие действия:
- Внутренне запускает сервер Bokeh по адресу 127.0.0.1:5006 контейнера.
- Запускает приложение Flask по адресу 0.0.0.0:5000, чтобы оно было доступно извне контейнера.
- Когда соединение установлено, Flask пытается получить данные с сервера Bokeh (экземпляр которого создается вместе с контейнером). Но при работе в качестве контейнера он никогда не попадает на собственный локальный хост контейнера (даже не задав для него --net = host).
Единственный способ, которым мне удалось заставить его работать, - это также создать сервер Bokeh в 0.0.0.0 и передать IP-адрес хоста контейнера (я в Windows) на адрес, с которого Flask пытается его получить ( см. поле url в autoload_server). Но, очевидно, это не сработает для других машин.
Вот соответствующие фрагменты кода:
server = Server({'/datavisualization': bokeh_app}, io_loop=io_loop, address="127.0.0.1",
allow_websocket_origin=["*"], host=["*"])
@app.route('/')
def bokeh_server():
# Fetch Running Bokeh Server
bokeh_embed = autoload_server(model=None,
app_path="/datavisualization",
url="http://127.0.0.1:5006")
html = render_template('index.html', bokeh_embed=Markup(bokeh_embed))
return html
if __name__ == '__main__':
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from bokeh.util.browser import view
# Serve the Flask app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000, address='0.0.0.0')
io_loop.add_callback(view, "http://0.0.0.0:5000/")
io_loop.start()
Может быть, кто-нибудь с большим опытом работы с Docker может помочь мне понять, что здесь происходит, пожалуйста? Я предполагал, что с точки зрения контейнера все, что опубликовано на localhost, будет видно другим службам, опубликованным из того же контейнера.
заранее спасибо