Docker:如何在Docker容器内运行Bokeh服务器并暴露输出

3
我有一个Bokeh Python代码,可以从Excel文件中导入数据并在Google地图上显示我的供应商位置。Excel文件存储在本地主机的C:\Python文件夹中,Python代码从该文件夹中选择它。当我打开命令提示符并使用命令"Bokeh serve --show Gmaps_Bokeh.py"时,此代码可以正常工作。然而,当我构建Docker文件并将端口5006映射到2000时,在浏览器中无法看到任何内容。
我在主机上创建了一个名为Docker的文件夹,其中包含Gmaps_Bokeh.py、Sid.xls和Dockerfile,在Dockerfile中,我将容器的/Python目录中的所有内容复制过去。
Docker终端显示如下:
$ docker run -p 5006:2000 sid
2019-11-03 20:38:43,329 Starting Bokeh server version 1.3.4 (running on 
Tornado 6.0.3)
2019-11-03 20:38:43,334 Bokeh app running at:    
http://localhost:5006/Gmaps_Bokeh
2019-11-03 20:38:43,334 Starting Bokeh server with process id: 1

Dockerfile contents

 FROM python
 RUN pip install bokeh
 RUN pip install gmaps
 RUN pip install pandas
 RUN pip install xlrd
 WORKDIR /Python
 COPY . /Python
 EXPOSE 2000
 CMD ["bokeh", "serve","/Python/Gmaps_Bokeh.py"]

你有没有查看Bokeh的docker-tools - Tony
难道不应该是反过来的吗 docker run -p 2000:5006 - Tony
你的 bokeh serve 命令中不应该使用 --address 0.0.0.0 吗? - Tony
你能告诉我我的 Docker 文件有什么问题吗?我会非常感激任何帮助,因为我找不到任何与 Bokeh 相关的 Docker 命令。每个链接都谈论 Bokeh/Flask 然后是 Docker。我想完全避免 Flask。 - Sid1980
很难说...你应该发布更多信息,比如:你的 docker psdocker inspect <your-docker-container-id> 返回了什么?你是否尝试使用 --name 运行 docker,然后进入 docker 容器 (docker exec -it <name> bash) 并查看是否与 Bokeh 服务器通信?Docker 网络可能很复杂,也可以参考这里获取一些信息。 - Tony
2个回答

0
要访问主机上的文件夹,您需要使用Docker卷将主机的c:/python映射到某个Linux路径。此外,您需要重新配置应用程序以使用该路径(在容器上),而不是c:/python(或任何其他直接主机Windows路径)。

1
我可以将Sid.xls复制到容器的/app文件夹中,让运行在容器内的Bokeh可以访问这个文件吗? - Sid1980
是的,这也是一个选项。要在主机和容器之间复制文件(反之亦然),请使用docker cp命令(https://docs.docker.com/engine/reference/commandline/cp/)。 - Miq

0

看起来你的端口混乱了。要分别考虑主机和容器端口。

当你在容器内运行容器时,可以在控制台输出中看到,bokeh会发布在5006端口(这里的localhost是从容器的角度来看的)。这就是你需要在Dockerfile中公开的内容(因此应该是EXPOSE 5006)。到目前为止,你还不知道2000端口的任何信息。

如果你想将容器端口5006(bokeh服务所在的端口)暴露给主机系统端口2000,你可以像@Tony的评论中那样,在docker run命令中使用-p 2000:5006,并在浏览器中查找http://localhost:2000

一个重要的澄清,应该将所有这些联系在一起:当从主机系统(运行浏览器的地方)请求localhost时,与从容器(bokeh控制台输出来自的地方)请求localhost是不同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接