【问题标题】:How to connect to a remote Jupyter Notebook running on a docker container?如何连接到在 docker 容器上运行的远程 Jupyter Notebook?
【发布时间】: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。
  • 这不起作用。

标签: docker ssh jupyter-notebook portforwarding ssh-tunnel


【解决方案1】:

这是一个很好的问题。我的日常开发工作流程包括从我的笔记本电脑连接到在 gpu 加速服务器上的 docker 容器上运行的 jupyter notebook。

问题分为三个部分:

  1. 容器

  2. 主机

  3. 远程

第 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 运行正常。此外,它假定您已完成我提到的便利步骤。

  1. SSH 到远程。
  2. 启动 docker 容器。记下容器名称,或者更好地指定它。
  3. 将容器连接到网络。例如docker network connect skynet container-1。您可以通过运行docker network inspect skynet 来检查您的容器是否已附加。请注意,您的网络很可能是 skynet 以外的名称。
  4. SSH 到您的 docker 容器,例如ssh container-1
  5. 启动您的 juypyter 服务器。 jupyter notebook &amp;。我在后台处理该过程,因此我不必打开另一个会话。
  6. 在远程/主机上时,系统:ssh -N -f tunnel-container-1。好的,我们现在有了从主机系统到 docker 容器的 ssh 隧道。
  7. 在您的本地系统上:ssh -N -f tunnel-remote_host
  8. 在本地系统上导航到http://localhost:10000

如果一切正常,您应该连接到您的 jupyter 服务器并在您在 Dockerfile 中指定的根目录中!

如何排除故障。

首先确认您可以使用正确的运行时环境手动启动 docker 容器。确认您可以 ssh 并启动 jupyter notebook。是的,您将无法连接到它,但您会知道所有这些部分都在工作。接下来确认您可以使用您的容器从远程到容器建立 ssh 隧道。您可以使用wget 来确认隧道是否正常工作,以获取您的 jupyter 服务器的登录页面的 html。接下来检查从本地到远程/主机的转发。我花了一些时间试错才能使LocalForward 指令的顺序正确。

我希望这会有所帮助。

【讨论】:

猜你喜欢
  • 2019-07-01
  • 2019-11-29
  • 2020-12-19
  • 2016-12-14
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多