我正在在远程计算机(amazon p2)上运行的docker容器(ubuntu)上运行Jupyter笔记本。
我想通过浏览器(http://localhost:8883/)访问笔记本,但得到:

open failed: connect failed: Connection refused

我的ssh confing:
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计算机上运行的笔记本?

最佳答案

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

该问题分为三个部分:

  • 容器
  • 主机
  • 远程

  • 第1部分:配置容器。

    您需要确保可以ssh到您的容器。我从Docker's sshd example.修改了Dockerfile。例如用例是否允许您以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指令将其切入远程系统。

    全部放在一起。

    假设您的远程实例已成功启动并且Docker运行正常。此外,它假设您已完成我提到的便捷步骤。
  • SSH到远程。
  • 启动docker容器。注意容器名称,甚至更好地指定它。
  • 将您的容器连接到网络。例如docker network connect skynet container-1。您可以通过运行docker network inspect skynet来检查容器是否已附加。请注意,您的网络很可能会使用skynet之外的其他名称。
  • SSH到您的docker容器,例如ssh container-1
  • 启动juypyter服务器。 jupyter notebook &。我为该过程提供了背景信息,因此不必打开另一个 session 。
  • 在远程主机上,系统: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指令的顺序正确,我花了一些时间尝试错误。

    我希望这有帮助。

    关于docker - 如何连接到在Docker容器上运行的远程Jupyter Notebook?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48138260/

    10-14 15:03
    查看更多