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

Posted

技术标签:

【中文标题】在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook【英文标题】:Connecting Spyder to Remote Jupyter Notebook in a Docker Container 【发布时间】:2019-11-29 23:21:22 【问题描述】:

我一直在尝试将 Spyder 连接到在远程服务器上运行的 docker 容器并且一次又一次地失败。这是我要实现的目标的快速图表:

目前我正在通过 ssh 在远程机器上启动 docker 容器

docker run --runtime=nvidia -it --rm --shm-size=2g -v /home/timo/storage:/storage -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group --ulimit memlock=-1 -p 8888:8888 --ipc=host ufoym/deepo:all-jupyter

所以我在端口 8888 上转发。然后在我正在运行的 docker 容器内

jupyter notebook --no-browser --ip=0.0.0.0 --port=8888 --allow-root --notebook-dir='/storage' 

好的,现在是 Spyder 部分 - 按照说明 here,我转到 ~/.local/share/jupyter/runtime,在那里我找到以下文件:

kernel-ada17ae4-e8c3-4e17-9f8f-1c029c56b4f0.json  nbserver-11-open.html  nbserver-21-open.html  notebook_cookie_secret
kernel-e81bc397-05b5-4710-89b6-2aa2adab5f9c.json  nbserver-11.json       nbserver-21.json

不知道该拿哪一个,我将它们全部复制到我的本地机器上。

我现在转到控制台->连接到现有内核,这给了我“连接到现有内核”窗口,我照此填写(当然使用我的实际远程 IP 地址):

(这里我选择了Connection info:的第一个json文件)。我按 Enter 键,Spyder 变暗并崩溃。

无论我选择哪个连接信息文件,都会发生这种情况。所以,我的问题是:

1:我做的这些都正确吗?我找到了很多关于如何连接到远程服务器的说明,但到目前为止还没有找到专门连接到远程服务器上 docker 上的 jupyter notebook 的说明。

2:如果是,那么我还能做些什么来解决我遇到的问题?

我还应该注意,通过本地计算机上的浏览器连接到 Jupyter Notebook 没有问题。只是我更愿意使用 Spyder 作为我的 IDE。

非常感谢!

【问题讨论】:

恭喜你画好了:) ...您可以访问或 ssh docker 容器吗? @Stefan 谢谢:P - 我通过 SSH 进入 docker 容器没有问题 我在这里也有同样的问题:***.com/questions/53891567/… 我无法像您在这里描述我的困境! :) @shaunakde 看起来有一个 PyCharm 的解决方法(不适用于 Spyder),如下所述:youtrack.jetbrains.com/issue/PY-33489。我试过了,它可以工作,但它对我来说不是一个解决方案,因为它需要在服务器上进行 sudo 访问(我没有),而且根本不安全,所以即使我也不会使用它做了。 【参考方案1】:

这与其说是一种解决方案,不如说是一种解决方法,但 sshfs 可能会有所帮助

使用 sshfs 将远程机器的主目录挂载到本地目录,然后您的 Spyder 本地副本可以像编辑本地文件一样编辑该文件。

sshfs remotehost.com:/home/user/ ./remote-host/

当您在 Spyder 中点击保存时,将更改上传到 AWS 主机通常需要大约半秒,这对我来说是可以接受的延迟。当需要运行代码时,通过 ssh 进入远程机器,然后从 IPython shell 运行代码。它并不优雅,但确实有效。

我并不认为这是最好的答案,但也许您可以将其用作权宜之计。

【讨论】:

【参考方案2】:

我和你有同样的问题。我让它工作了,也许有点笨拙,因为我对 docker 完全陌生。以下是我的步骤和说明,说明我们的不同之处,希望对您有所帮助:

在远程机器上启动 docker 容器:

docker run --gpus all --rm -ti --net=host -v /my_storage/data:/home/data -v /my_storage/JSON:/root/.local/share/jupyter/runtime repo/张量流:20.03-tf2-py3

我使用第二个卷挂载,以便将 kernel.json 文件获取到我的本地计算机。我无法通过 ssh 直接从 docker 访问,因为它位于 docker 容器的 /root/ 文件夹中,并且只能通过 root 访问。如果您知道如何直接从那里阅读,我将很乐意学习。我的解决方法是: 在远程机器上,创建一个 JSON/ 目录,并将其映射到容器中的“jupyter --runtime-dir”。创建内核后,通过此卷挂载访问 kernel-xxx.json 文件,复制到本地机器并 chmod。

在容器中启动 ipython 内核: ipython内核 您正在启动 jupyter notebook。我怀疑这是你的问题的原因。我不确定 spyder 是否适用于笔记本电脑,但它适用于 iPython 内核。可能,它在 spyder 内核上效果更好。

将 kernel.json 文件从 /remote_machine/JSON 复制到本地机器,chmod 进行访问。

启动 spyder,使用本地 kernel.json 和 ssh 设置。这部分和你的一样。

【讨论】:

以上是关于在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器无法连接到 Redis

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?

如何在 docker 容器之间连接到 oracle 数据库?

Django 不会连接到 Redis Docker 容器

如何从 Docker 容器连接到本地 Redis 服务器?

从 docker 容器连接到主机 mongodb