当前位置: 首页 > 知识库问答 >
问题:

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

柴砚文
2023-03-14

我想创建一个ssh隧道,从我的计算机到远程服务器,再到运行Jupyter Notebook(计算机)的docker容器

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笔记本。

输出来自:

$ 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笔记本时,尝试创建到远程计算机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笔记本时的输出:

$ 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).

共有2个答案

陈寒
2023-03-14

也有同样的问题,试图通过ssh隧道进入google云实例,然后进入docker容器。

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

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

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),然后(信用证):

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。

法子昂
2023-03-14

我想通了!“啊哈!”时刻记得运行Docker的远程机器是OS X(埃尔卡皮坦)。我所有的Docker构建/测试都是在Linux(Ubuntu 14.04)机器上进行的。事实证明,这种差异对解决这个问题至关重要。

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

意识到这一点后,我在客户端计算机the.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。

 类似资料:
  • 问题内容: 使用ubuntu tusty,在远程计算机上运行了一项服务,我可以通过SSH隧道通过端口转发访问该服务。 我正在运行一个Docker容器。我需要通过主机的隧道从容器内部访问该远程服务。 我尝试使用进行从容器到主机的隧道传输,然后从容器内部通过访问服务失败。为了检查端口映射是否打开,我尝试了 在此之后,parag。2,但即使 在集装箱处也没有察觉的交流 我还尝试通过映射端口,但是这报告绑

  • 我有一个码头集装箱在运行。我需要通过主机的隧道从容器内访问远程服务。 我尝试用从容器中隧道到主机,然后通过从容器中访问服务失败。为了检查端口映射是否打开,我尝试 接下来,帕拉格。2但是,即使在容器上执行也没有感觉到通信 2-测试连接是否正常的快速方法是什么?最好是通过巴什。 谢了。

  • 我将Spring Data JPA与Hibernate一起作为持久化提供程序,并将远程MySQL5服务器用于定期复制内部数据子集的作业。该作业(即Quartz调度的java应用程序)每个dai运行一次,大约需要。30秒完成同步)。出于安全原因,我们不想打开远程服务器进行外部直接连接(即。本地主机以外)。 我已经看到了使用Jsch以编程方式设置ssh隧道的示例,但无法找到关于如何将Jsch与spri

  • 我想通过SSH隧道访问jupyter笔记本,并遵循以下方法 要总结-: 1.登录远程机器 2.在新航站楼: 3.然后转到浏览器,然后转到 现在我的问题是:我只能在两个步骤中访问远程机器 jupyter笔记本电脑只安装在我的电脑上。 当我用较长的登录过程替换第一步的第一行时,第二步应该写什么? 当我插入remote_user=username和remote_user=my_pc_name时,我从ju

  • 问题内容: 我正在学习python。我需要使用隧道创建者来从数据库中读取信息并关闭隧道。我使用paramiko,但是我没有使用tonelem示例。请举一个创建隧道的简单代码示例。 提前致谢! 问题答案: 在工作中,我们通常创建ssh隧道转发端口。我们的方法是使用标准命令,使子进程在单独的线程中运行。我找到了这个有用的链接:https : //github.com/paramiko/paramiko

  • 我想从运行在Machine1上的Visual Studio2017调试运行在machine2上的应用程序。我只能通过SSH连接到machine2。从machine1到machine2的ssh连接工作良好。 在machine2上,我运行Visual Studio 2017远程调试器,端口号4022,“无身份验证”和“允许任何用户调试”。 端口号可能是4023,因为machine2是运行32位应用程序