连接到远程服务器上的 docker 中运行的 jupyter notebook

Posted

技术标签:

【中文标题】连接到远程服务器上的 docker 中运行的 jupyter notebook【英文标题】:Connect to jupyter notebook running in docker on a remote server 【发布时间】:2019-07-01 12:25:33 【问题描述】:

我在建立从本地计算机到我在 docker 容器中的远程服务器上运行的 jupyter notebook 实例的连接时遇到问题。

到目前为止我做了什么:

我用ssh username@remoteHostIp连接到远程服务器

我运行 docker container ls 以确保我的容器尚未运行

现在我用docker run -it -p 8888:8888 -p 6006:6006 -v ~/:/host waleedka/modern-deep-learning启动我的容器

我现在在我的容器中使用终端并启动一个无浏览器的 jupyter notebook 实例

jupyter notebook --no-browser --port=8889 --allow-root

启动成功:

The Jupyter Notebook is running at:
[I 11:14:51.979 NotebookApp] system]:8889/

现在我在本地计算机上启动另一个 shell 并创建一个 ssh 隧道:

ssh -N -f -L localhost:8888:localhost:8889 username@ remote_host_name

我的 shell 几秒钟后返回以下内容:

channel 2: open failed: connect failed: Connection refused
channel 2: open failed: connect failed: Connection refused
channel 2: open failed: connect failed: Connection refused

我无法通过 localhost:8888/ 或 localhost:8889/ 访问 jupyter notebook

当我在 docker 容器外的远程服务器上运行 jupyter notebook 并创建 ssh 隧道时,一切正常。

一些附加信息: 远程服务器: 经销商编号:Ubuntu 说明:Ubuntu 16.04.3 LTS 发布时间:16.04 代号:xenial

我的本​​地机器在 osx moave 上运行

【问题讨论】:

我也找到了这个this 线程,但我不确定这对我的问题有什么帮助, 感谢您的回答,但以下命令对我不起作用。 jupyter notebook --no-browser --port=8889 --allow-root。一旦使用 --ip 0.0.0.0 运行它就可以正常工作。 jupyter notebook --ip 0.0.0.0 --port=8889 --allow-root 【参考方案1】:

首先你应该使用

连接到远程服务器
ssh username@remoteHostIp

连接到它后,您应该使用

运行 docker 容器
docker run -it -p 8080:8888 -p 6006:6006 -v ~/:/host waleedka/modern-deep-learning

我在这里考虑端口 8888 是 jupyter notebook 端口,8080 是远程服务器端口

现在在本地机器上打开一个新的终端窗口,使用以下选项再次通过 SSH 连接到远程机器以设置端口转发。

ssh -N -L localhost:8000:localhost:8080 username@remoteHostIp

我在这里考虑端口 8000 是我的本地机器端口,而 8080 如上所述已经是远程服务器端口

现在通过本地浏览器访问远程 jupyter 服务器。打开浏览器并转到:

localhost:8000

【讨论】:

但我看不到他是如何启动 jupyter 的?任何地方都没有“jupyter notebook”命令。 在运行 docker 命令时,jupyter notebook 将启动,因为我们在该命令中将远程服务器端口(8080)连接到 jupyter notebook 端口(8888) 所以,容器 waleedka/modern-deep-learning 在容器启动时运行的脚本中有一个类似“./jupyter notebook”的命令?仅仅因为你打开容器上的端口到主机,jupyter 不必自动启动。 为此,我们需要在创建映像之前将 run_jupyter.sh 脚本文件保存在 Dockerfile 中,例如 (CMD ["/run_jupyter.sh", "--allow-root"] )。创建镜像后,当我们运行容器时,这将允许我们运行 jupyter notebook 并提供连接令牌 对我有用 - 我没有看到 ssh-f 选项 --- 那是为了什么?【参考方案2】:

我自己解决了这个问题,方法是连接到删除服务器并检查 docker 容器 IP 地址:docker inspect <container_name>。 然后我使用该 IP 地址创建 ssh 隧道:

ssh -N -f -L localhost:8889:dockerContainerIpAdress:8889 username@ remote_host_name

现在我可以在本地浏览器中使用 localhost:8889 连接到 jupyter notebook

【讨论】:

以上是关于连接到远程服务器上的 docker 中运行的 jupyter notebook的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JMX 连接到远程 Docker 容器

无法使用桥接网络模式从 docker 容器连接到远程 SQL 服务器

在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook

如何将我的 docker 连接到远程数据库?

如何连接到在 docker 容器上运行的远程 Jupyter Notebook?

如何将安装在主机服务器上的 phpmyadmin 连接到正在运行的 docker 容器内的 maria db? [关闭]