【问题标题】:Create ssh tunnel to remote docker container running Jupyter Notebook为运行 Jupyter Notebook 的远程 docker 容器创建 ssh 隧道
【发布时间】:2016-10-01 06:23:12
【问题描述】:

我想创建一个从我的计算机到远程服务器到运行 Jupyter Notebook(计算机>服务器>Docker 容器)的 docker 容器的 ssh 隧道,它允许我在我的计算机上的浏览器中运行 Jupyter Notebook。

Docker 容器托管在运行 OS X (El Capitan) 的机器上。 Docker 使用的是默认机器 IP:192.168.99.100。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.11.1  

我能够实际坐在运行 Docker 容器的服务器上,并使用我的浏览器 (192.168.99.100:8888) 从该 Docker 容器创建 Jupyter Notebooks。这将验证我的 Docker 端口绑定是否有效,并且我正在正确运行 Jupyter Notebook。

但是,我不知道如何建立从客户端计算机到远程计算机的 Docker 容器的 ssh 隧道,并在客户端计算机上的浏览器中启动 Jupyter Notebook。

输出来自:

$ docker ps

产生以下内容:

CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                              NAMES
48a8ac126c72        kubu4/bioinformatics:v11   "/bin/bash"         55 minutes ago      Up 55 minutes       8787/tcp, 0.0.0.0:8888->8888/tcp   stupefied_pasteur

当我尝试在客户端机器 (localhost:8888) 上的浏览​​器中启动 Jupyter Notebook 时,我尝试创建到远程机器的 Docker 容器的 ssh 隧道导致终端中出现以下错误消息:

channel 3: open failed: connect failed: Connection refused

我目前在我的 .ssh/config 文件中使用以下内容来创建隧道:

Host tunnel3
HostName remote.ip.address
User user
ControlMaster auto
ServerAliveInterval 30
ServerAliveCountMax 3
LocalForward localhost:8888 localhost:8888

如果我在远程计算机上的 Docker 容器之外的远程计算机上运行 Jupyter Notebook,我可以使用此隧道配置在我的客户端浏览器中成功启动 Jupyter Notebook。

只是为了补充信息,这是我在远程机器的 Docker 容器中启动 Jupyter Notebook 时的输出:

$ jupyter notebook
[I 18:23:32.951 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 18:23:33.072 NotebookApp] Serving notebooks from local directory: /usr/local/bioinformatics
[I 18:23:33.073 NotebookApp] 0 active kernels 
[I 18:23:33.073 NotebookApp] The Jupyter Notebook is running at: http://0.0.0.0:8888/
[I 18:23:33.074 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

【问题讨论】:

    标签: ssh docker osx-elcapitan jupyter-notebook


    【解决方案1】:

    我想通了! “啊哈!”那一刻我想起了运行 Docker 的远程机器是 OS X (El Capitan)。我所有的 Docker 构建/测试都是在 Linux (Ubuntu 14.04) 机器上执行的。事实证明,这种差异对于解决这个问题至关重要。

    在 Ubuntu 上安装 Docker 允许您使用“localhost”来寻址 Docker 容器。 Docker 安装在 OSX 上会生成一个 IP 地址,用于寻址 Docker 容器。

    意识到这一点,我在客户端计算机上的 .ssh/config 文件中更改了我的 ssh 隧道配置。

    旧隧道配置:

    Host tunnel3
    HostName remote.ip.address
    User user
    ControlMaster auto
    ServerAliveInterval 30
    ServerAliveCountMax 3
    LocalForward localhost:8888 localhost:8888
    

    新的隧道配置:

    Host tunnel3
    HostName remote.ip.address
    User user
    ControlMaster auto
    ServerAliveInterval 30
    ServerAliveCountMax 3
    LocalForward localhost:8888 192.168.99.100:8888
    

    通过此更改,我可以在我的客户端浏览器中成功创建/使用 Jupyter Notebooks,这些笔记本实际上托管在远程机器上的 Docker 容器中,使用 URL 栏中的 localhost:8888。

    【讨论】:

      【解决方案2】:

      遇到了同样的问题,尝试通过 ssh-tunnel 进入谷歌云实例,然后进入 docker 容器。

      • 本地机器:Ubuntu (14.04)
      • 云实例:Debian (9-stretch)

      查找 Debian 分配给 docker 的 IP 地址 (credit):

      docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
      

      这给了我 172.18.0.2 用于第一个运行的实例,172.18.0.3 用于第二个,..0.4、..0.5 等。
      注意: 如果我在同一个实例上运行多个容器,则以下内容不起作用。由于我只需要运行一个容器,我不打算弄清楚如何修复它)

      ssh 进入计算实例
      确保在 Docker 容器和计算实例之间公开端口(我使用 8888:8888),然后(credit):

      gcloud compute ssh {stuff to your instance} -- -L 8888:172.18.0.2:8888
      

      运行 jupyter

      jupyter-notebook --no-browser --ip=0.0.0.0 --allow-root
      

      现在我可以打开本地浏览器到 localhost:8888/?token... 并使用在我的 gcloud 实例上的容器中运行的 jupyter。

      【讨论】:

      • 嗨isaac_r,有没有办法使用vscode通过SSH连接到GCP上的docker容器,并在vscode中打开jupyter?你能给些建议么?谢谢!
      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 2017-01-22
      • 1970-01-01
      • 2020-10-16
      • 2018-06-16
      • 2020-07-13
      • 2016-09-25
      • 2022-01-12
      相关资源
      最近更新 更多