如何连接到在 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 输出中。然后在 LocalForward 规则中直接使用这个 IP 进行 ssh。这样你就不会在远程机器上通过 iptables NAT。 这不起作用。 【参考方案1】:

这是一个很好的问题。我的日常开发工作流程包括从我的笔记本电脑连接到在 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/&lt;user&gt;/.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 &amp;。我在后台处理该过程,因此我不必打开另一个会话。 在远程/主机上时,系统: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?的主要内容,如果未能解决你的问题,请参考以下文章

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

从 docker 主机外部远程连接到在 docker 容器上运行的 oracle 数据库

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

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

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

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