我在远程机器(amazon p2)上运行的docker容器(ubuntu)上运行Jupyter-notebook。 我想通过我的浏览器(http://localhost:8883/)访问笔记本,但我得到了:
open failed: connect failed: Connection refused
我的ssh confing:
Host p3
HostName <remote machine ip>
User <user>
LocalForward 8883 127.0.0.1:8884
我正在运行容器(在远程计算机上):
nvidia-docker run -it -p 8884:8884 <docker image>
在我正在运行的docker容器上:
jupyter-notebook --NotebookApp.iopub_data_rate_limit=10000000000 --no-browser --port=8884 --allow-root
我可以连接到远程计算机上运行的笔记本(而不是在docker容器中)。
如何从浏览器连接到docker机器上运行的笔记本电脑?
答案 0 :(得分:2)
这是一个很好的问题。我的日常开发工作流程涉及从笔记本电脑连接到在gpu加速服务器上的docker容器上运行的jupyter笔记本电脑。
问题分为三个部分:
容器
主机
远程
您需要确保可以ssh到您的容器。我从Docker's sshd example.修改了Dockerfile,您应该修改Docker示例以适合您的需求;例如您的用例是否允许您以root用户身份连接?
我为passwordless ssh设置了容器。请注意,您可以预先制作无密码ssh所需的文件,并在构建映像时将它们复制到适当的目录中。
如果以后想保存自己的输入内容,强烈建议您也修改jupyter配置文件。
我假设您正在主机上运行linux。您必须创建一个docker network。您只需要使用--attachable
选项。我喜欢在/etc/hosts
中添加一个条目,以使生活更轻松,例如:
172.21.0.2 container-1 container-1
您还必须在主机系统上修改/home/<user>/.ssh/config
文件。
Host container-1
Hostname container-1
IdentityFile ~/.ssh/containers_rsa
User root
Host tunnel-container-1
Hostname container-1
IdentityFile ~/.ssh/containers_rsa
User root
LocalForward 8888 localhost:8888
LocalForward 8000 localhost:8000
Don't you get sick of having to type nvidia-docker
?
这是一个示例/etc/docker/daemon.json
:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"graph":"/docker-files"
}
您快到了。您需要能够建立到远程系统的ssh隧道。本地系统的示例~/.ssh/config
:
Host remote_host
Hostname remote_host
IdentityFile ~/.ssh/remote_host/remote_rsa
Host tunnel-remote_host
Hostname remote_host
IdentityFile ~/.ssh/remote_host/remote_rsa
LocalForward 10000 localhost:8888
LocalForward 10006 localhost:8000
重要提示。我在本地/etc/hosts
中有一个远程主机条目。您的实例可能没有静态IP。因此,您可以在每次启动实例时修改本地/etc/hosts
,也可以使用脚本来使用所有正确的LocalForward
指令将其切入远程系统。
假设您的远程实例已成功启动并且Docker运行正常。另外,它假设您已经完成了我提到的便捷步骤。
docker network connect skynet container-1
。您可以通过运行docker network inspect skynet
来检查容器是否已连接。请注意,您的网络很可能会使用skynet
之外的其他名称。 ssh container-1
。jupyter notebook &
。我为该过程提供了背景信息,因此不必打开另一个会话。 ssh -N -f tunnel-container-1
。好的,我们现在有了一条从主机系统到docker容器的ssh隧道。ssh -N -f tunnel-remote_host
。 http://localhost:10000
。如果一切正常,则应连接到jupyter服务器并在Dockerfile中指定的根目录中!
首先确认您可以在正确的运行时环境下手动启动Docker容器。确认您可以ssh并启动jupyter Notebook。是的,您将无法连接到它,但是您将知道所有这些部件都在工作。接下来,确认您可以与容器建立从远程到容器的ssh隧道。您可以使用wget
来获取Jupyter服务器的登录页面html,以确认隧道是否正常工作。接下来检查从本地到远程/主机的转发。为了使LocalForward
指令的顺序正确,我花了一些时间尝试错误。
我希望这会有所帮助。