我想创建一个从我的计算机到远程服务器的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笔记本。这验证了我的Docker端口绑定是否正常工作以及我是否正确运行了Jupyter笔记本。
但是,我不知道如何建立从客户端计算机到该远程计算机的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
当我尝试在客户端计算机上的浏览器中启动Jupyter Notebook时,我尝试创建到远程计算机的Docker容器的ssh隧道会导致终端中出现以下错误消息:localhost:8888: / p>
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笔记本。
只是为了补充信息,这是我在远程机器的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).
答案 0 :(得分:4)
我明白了! " A-ha!"片刻记得运行Docker的远程机器是OS X(El Capitan)。我的所有Docker构建/测试都是在Linux(Ubuntu 14.04)机器上执行的。事实证明,差异对解决这个问题至关重要。
在Ubuntu上安装Docker允许你使用" localhost"解决Docker容器。 OSX上的Docker安装生成用于寻址Docker容器的IP地址。
意识到这一点,我在客户端计算机上的.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笔记本,这些笔记本实际上托管在远程计算机上的Docker容器中,使用URL栏中的localhost:8888。
答案 1 :(得分:0)
遇到相同的问题,尝试通过ssh-tunnel进入Google云实例,然后进入docker容器。
查找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等。
(注意:< / strong>如果我在同一实例上运行多个容器,则下面的命令不起作用。由于我只需要运行一个容器,因此我不打算解决该问题)
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。