这是一个很好的问题。我的日常开发工作流程包括从我的笔记本电脑连接到在 gpu 加速服务器上的 docker 容器上运行的 jupyter notebook。
问题分为三个部分:
容器
主机
远程
第 1 部分:配置容器。
您需要确保可以通过 ssh 访问您的容器。我从 Docker's sshd example. 修改了 Dockerfile 您应该修改 Docker 示例以满足您的需要;例如您的用例是否允许您以 root 身份连接?
我为passwordless ssh 设置了我的容器。请注意,您可以预先制作无密码 ssh 所需的文件,然后在构建映像时将它们复制到适当的目录中。
如果您想在以后节省一些输入,我强烈建议您也修改您的 jupyter 配置文件。
第 2 部分:配置主机
我假设您在主机上运行 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"
}
第 3 部分:配置本地系统。
你快到了。您需要能够建立到远程系统的 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 指令使用 ssh 到远程系统的脚本。
把它们放在一起。
假设您的远程实例已成功启动并且 Docker 运行正常。此外,它假定您已完成我提到的便利步骤。
- SSH 到远程。
- 启动 docker 容器。记下容器名称,或者更好地指定它。
- 将容器连接到网络。例如
docker network connect skynet container-1。您可以通过运行docker network inspect skynet 来检查您的容器是否已附加。请注意,您的网络很可能是 skynet 以外的名称。
- SSH 到您的 docker 容器,例如
ssh container-1。
- 启动您的 juypyter 服务器。
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 指令的顺序正确。
我希望这会有所帮助。