创建到远程 docker 容器 运行 Jupyter Notebook 的 ssh 隧道
Create ssh tunnel to remote docker container running Jupyter Notebook
我想创建一个从我的计算机到远程服务器到 docker 容器 运行ning Jupyter Notebook(计算机>服务器>Docker 容器)的 ssh 隧道允许我在计算机上的浏览器中 运行 Jupyter Notebook。
Docker 容器托管在机器 运行ning 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 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
如果我 运行 Jupyter Notebook 在远程机器上 Docker 容器之外的远程机器上,我可以使用此隧道配置在我的客户端浏览器中成功启动 Jupyter Notebooks。
只是为了补充信息,这是我在远程计算机的 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).
我想通了! "A-ha!" 时刻记得远程机器 运行 Docker 是 OS X (El Capitan)。我所有的 Docker builds/tests 都是在 Linux (Ubuntu 14.04) 机器上执行的。事实证明,差异对于解决这个问题至关重要。
Docker 安装在 Ubuntu 上允许您使用 "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
通过此更改,我可以在我的客户端浏览器中成功地 create/use Jupyter 笔记本,这些笔记本实际上托管在远程计算机上的 Docker 容器中,使用 localhost:8888 URL吧.
有同样的问题,尝试通过 ssh 隧道进入 google 云实例,然后进入 docker 容器。
- 本地机器:Ubuntu (14.04)
- 云实例:Debian(9 段)
找到 Debian 分配给 docker (credit) 的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
这给了我第一个 172.18.0.2 运行ning,第二个 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 运行ning。
我想创建一个从我的计算机到远程服务器到 docker 容器 运行ning Jupyter Notebook(计算机>服务器>Docker 容器)的 ssh 隧道允许我在计算机上的浏览器中 运行 Jupyter Notebook。
Docker 容器托管在机器 运行ning 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 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
如果我 运行 Jupyter Notebook 在远程机器上 Docker 容器之外的远程机器上,我可以使用此隧道配置在我的客户端浏览器中成功启动 Jupyter Notebooks。
只是为了补充信息,这是我在远程计算机的 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).
我想通了! "A-ha!" 时刻记得远程机器 运行 Docker 是 OS X (El Capitan)。我所有的 Docker builds/tests 都是在 Linux (Ubuntu 14.04) 机器上执行的。事实证明,差异对于解决这个问题至关重要。
Docker 安装在 Ubuntu 上允许您使用 "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
通过此更改,我可以在我的客户端浏览器中成功地 create/use Jupyter 笔记本,这些笔记本实际上托管在远程计算机上的 Docker 容器中,使用 localhost:8888 URL吧.
有同样的问题,尝试通过 ssh 隧道进入 google 云实例,然后进入 docker 容器。
- 本地机器:Ubuntu (14.04)
- 云实例:Debian(9 段)
找到 Debian 分配给 docker (credit) 的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
这给了我第一个 172.18.0.2 运行ning,第二个 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 运行ning。