连接到在远程服务器上运行的Docker中的Jupyter笔记本。

9
我在本地机器上连接运行在远程服务器docker容器中的jupyter笔记本实例时遇到了问题。
我的操作步骤如下:
1. 我使用ssh username@remoteHostIp命令连接到远程服务器。
2. 运行docker container ls命令,以确保我的容器尚未运行。
3. 然后使用以下命令启动容器:docker run -it -p 8888:8888 -p 6006:6006 -v ~/:/host waleedka/modern-deep-learning
4. 现在我正在使用容器中的终端,并启动一个无浏览器的jupyter笔记本实例。
jupyter notebook --no-browser --port=8889 --allow-root

启动成功:

The Jupyter Notebook is running at:
[I 11:14:51.979 NotebookApp] system]:8889/

现在我在本地计算机上启动另一个shell,并创建一个ssh隧道:
ssh -N -f -L localhost:8888:localhost:8889 username@ remote_host_name

几秒钟后,我的shell会返回以下内容:

channel 2: open failed: connect failed: Connection refused
channel 2: open failed: connect failed: Connection refused
channel 2: open failed: connect failed: Connection refused

我无法通过localhost:8888/或localhost:8889/访问jupyter笔记本。

当我在docker容器外的远程服务器上运行jupyter笔记本并创建ssh隧道时,一切正常。

一些附加信息: 远程服务器: 发行版ID:Ubuntu 描述:Ubuntu 16.04.3 LTS 版本:16.04 代号:xenial

我的本地机器运行在OSX Moave上。


我也发现了这个链接,但我不确定它如何帮助我解决我的问题。 - QuestionableQuestions
1
谢谢您的回答,但是以下命令对我没有起作用。jupyter notebook --no-browser --port=8889 --allow-root。一旦使用了 --ip 0.0.0.0 参数,它就可以正常工作了。jupyter notebook --ip 0.0.0.0 --port=8889 --allow-root - Shubham
2个回答

10

首先,您应该使用以下命令连接到远程服务器:

ssh username@remoteHostIp

连接成功后,您应该使用以下命令运行Docker容器:

docker run -it -p 8080:8888 -p 6006:6006 -v ~/:/host waleedka/modern-deep-learning

我认为这里的端口8888是Jupyter Notebook端口,而8080是远程服务器端口。

现在在本地计算机上打开一个新的终端窗口,并再次使用以下选项SSH到远程机器以设置端口转发。

ssh -N -L localhost:8000:localhost:8080 username@remoteHostIp

我在这里考虑,端口8000是我的本地机器端口,而8080如上所述是远程服务器端口。

现在通过您的本地浏览器访问远程Jupyter服务器。打开您的浏览器并转到:

localhost:8000

但我不知道他如何启动Jupyter?任何地方都没有“jupyter notebook”命令。 - aquagremlin
在运行docker命令时,Jupyter Notebook将启动,因为我们正在将远程服务器端口(8080)连接到该命令中的Jupyter Notebook端口(8888)。 - srilekha palepu - Intel
那么,容器waleedka/modern-deep-learning是否有一个命令,比如在容器启动时运行的脚本'./jupyter notebook'?仅仅因为你在容器上打开了端口,jupyter并不会自动启动。 - aquagremlin
1
为此,我们需要在 Dockerfile 中保留 run_jupyter.sh 脚本文件,例如(CMD ["/run_jupyter.sh", "--allow-root"]),然后创建镜像。创建镜像后,当我们运行容器时,这将允许我们运行 jupyter notebook,并提供令牌以连接。 - srilekha palepu - Intel
对我来说可以用 - 我没有看到 ssh-f 选项,那是干什么用的? - mishaF

2
我通过连接到远程服务器并检查Docker容器的IP地址来自行解决了这个问题:docker inspect <container_name>。然后,我使用该IP地址创建了SSH隧道:
ssh -N -f -L localhost:8889:dockerContainerIpAdress:8889 username@ remote_host_name

现在我可以通过 localhost:8889 在本地浏览器中连接到 Jupyter Notebook。最初的回答保留 HTML 标签,不提供解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接