繁体   English   中英

创建到运行Jupyter Notebook的远程Docker容器的ssh隧道

[英]Create ssh tunnel to remote docker container running Jupyter Notebook

我想创建一条从我的计算机到远程服务器的SSH隧道,再到运行Jupyter Notebook的Docker容器(计算机>服务器> Docker容器),使我可以在计算机上的浏览器中运行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 Notebook。 这可以验证我的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).

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

在Ubuntu上安装的Docker允许您使用“ localhost”来寻址Docker容器。 在OSX上安装的Docker会生成一个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

进行此更改后,我可以使用URL栏中的localhost:8888在客户端浏览器中成功创建/使用实际上托管在远程计算机的Docker容器中的Jupyter Notebook。

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

  • 本地计算机:Ubuntu(14.04)
  • 云实例:Debian(9拉伸)

查找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容器和Compute实例之间暴露了端口(我使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM