如何连接到在 docker 容器上运行的远程 Jupyter Notebook?
Posted
技术标签:
【中文标题】如何连接到在 docker 容器上运行的远程 Jupyter Notebook?【英文标题】:How to connect to a remote Jupyter Notebook running on a docker container? 【发布时间】:2018-06-16 17:18:54 【问题描述】:我在远程机器 (amazon p2) 上运行的 docker 容器 (ubuntu) 上运行 Jupyter-notebook。 我想通过浏览器 (http://localhost:8883/) 访问笔记本,但我得到:
open failed: connect failed: Connection refused
我的 ssh 配置:
Host p3
HostName <remote machine ip>
User <user>
LocalForward 8883 127.0.0.1:8884
我正在运行容器(在远程机器上):
nvidia-docker run -it -p 8884:8884 <docker image>
在我正在运行的 docker 容器上:
jupyter-notebook --NotebookApp.iopub_data_rate_limit=10000000000 --no-browser --port=8884 --allow-root
我能够连接到远程机器上运行的笔记本(不是在 docker 容器中)。
如何从浏览器连接到在 docker 机器上运行的笔记本?
【问题讨论】:
也许所有这些转发网络流量都会在某处丢失。在远程机器上启动容器后检查它的 IP(应该在 docker inspect这是一个很好的问题。我的日常开发工作流程包括从我的笔记本电脑连接到在 gpu 加速服务器上的 docker 容器上运行的 jupyter notebook。
问题分为三个部分:
容器
主机
远程
第 1 部分:配置容器。
您需要确保可以通过 ssh 访问您的容器。我从 Docker's sshd example. 修改了 Dockerfile 您应该修改 Docker 示例以满足您的需要;例如您的用例是否允许您以 root 身份连接?
我为passwordless ssh 设置了我的容器。请注意,您可以预先制作无密码 ssh 所需的文件,然后在构建映像时将它们复制到适当的目录中。
如果您想在以后节省一些输入,我强烈建议您也修改您的 jupyter 配置文件。
第 2 部分:配置主机
我假设您在主机上运行 linux。您必须创建一个docker network。您应该只需要 --attachable
选项。我喜欢在我的/etc/hosts
中添加一个条目,让生活更轻松,例如:
172.21.0.2 container-1 container-1
您还必须修改主机系统上的 /home/<user>/.ssh/config
文件。
Host container-1
Hostname container-1
IdentityFile ~/.ssh/containers_rsa
User root
Host tunnel-container-1
Hostname container-1
IdentityFile ~/.ssh/containers_rsa
User root
LocalForward 8888 localhost:8888
LocalForward 8000 localhost:8000
Don't you get sick of having to type nvidia-docker
?
这是一个示例/etc/docker/daemon.json
:
"runtimes":
"nvidia":
"path": "nvidia-container-runtime",
"runtimeArgs": []
,
"graph":"/docker-files"
第 3 部分:配置本地系统。
你快到了。您需要能够建立到远程系统的 ssh 隧道。本地系统的示例~/.ssh/config
:
Host remote_host
Hostname remote_host
IdentityFile ~/.ssh/remote_host/remote_rsa
Host tunnel-remote_host
Hostname remote_host
IdentityFile ~/.ssh/remote_host/remote_rsa
LocalForward 10000 localhost:8888
LocalForward 10006 localhost:8000
重要说明。我在本地 /etc/hosts
中有一个用于远程主机的条目。您的实例可能没有静态 IP。因此,您可以在每次启动实例时修改本地 /etc/hosts
,或者使用所有正确的 LocalForward
指令使用 ssh 到远程系统的脚本。
把它们放在一起。
假设您的远程实例已成功启动并且 Docker 运行正常。此外,它假定您已完成我提到的便利步骤。
-
SSH 到远程。
启动 docker 容器。记下容器名称,或者更好地指定它。
将容器连接到网络。例如
docker network connect skynet container-1
。您可以通过运行docker network inspect skynet
来检查您的容器是否已附加。请注意,您的网络很可能是 skynet
以外的名称。
SSH 到您的 docker 容器,例如ssh container-1
。
启动您的 juypyter 服务器。 jupyter notebook &
。我在后台处理该过程,因此我不必打开另一个会话。
在远程/主机上时,系统:ssh -N -f tunnel-container-1
。好的,我们现在有了从主机系统到 docker 容器的 ssh 隧道。
在您的本地系统上:ssh -N -f tunnel-remote_host
。
在本地系统上导航到http://localhost:10000
。
如果一切正常,您应该连接到您的 jupyter 服务器并在您在 Dockerfile 中指定的根目录中!
如何排除故障。
首先确认您可以使用正确的运行时环境手动启动 docker 容器。确认您可以 ssh 并启动 jupyter notebook。是的,您将无法连接到它,但您会知道所有这些部分都在工作。接下来确认您可以使用您的容器从远程到容器建立 ssh 隧道。您可以使用wget
来确认隧道是否正常工作,以获取您的 jupyter 服务器的登录页面的 html。接下来检查从本地到远程/主机的转发。我花了一些时间试错才能使LocalForward
指令的顺序正确。
我希望这会有所帮助。
【讨论】:
这里是一个 github repo 的链接,它把所有这些结合在一起:github.com/VanBantam/one-env以上是关于如何连接到在 docker 容器上运行的远程 Jupyter Notebook?的主要内容,如果未能解决你的问题,请参考以下文章
从 docker 主机外部远程连接到在 docker 容器上运行的 oracle 数据库
在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook