在远程主机上使用Docker容器进行VS代码开发

2020-06-12 19:05:30

有时,我们希望开发或调试只能在远程功能强大的主机服务器上运行的程序,例如多GPU深度学习培训程序。需要在主机服务器上设置容器化开发环境,并能够通过本地IDE与远程容器化开发环境通信。事实证明,VS代码可以通过其扩展做到这一点。

在这篇博客文章中,我想谈谈如何在远程主机上设置VS Code Docker开发环境,如何从本地VS Code GUI在远程Docker开发环境中开发和调试程序。

按照说明设置到远程主机服务器的基于SSH密钥的身份验证,这样我们就不需要每次登录到远程主机服务器时都需要密码。

具体地说,如果我们没有生成公钥(通常是~/.ssh/id_rsa.pub),我们可以通过在本地计算机上运行以下命令来生成公钥。

一旦我们生成了公钥,我们就必须通过运行以下命令将公钥复制到远程主机。我们需要向远程主机服务器输入一次密码。

一旦设置了基于SSH密钥的身份验证,我们在登录远程主机服务器时就不再需要输入密码。通过SSH连接到远程主机进行验证。

默认情况下,VS代码远程容器使用本地Docker主机。这意味着我们实际上是在本地计算机上运行容器。要使用远程主机服务器上运行的容器,我们必须将";docker.host";:";your-user-name-on-host@hostname";添加到vs Code settings.json。它通常位于~/.config/Code/User/中。

我们必须在远程主机上创建一个目录作为VS代码的工作区。我们可以将现有文件从本地主机传输到远程主机,也可以将新的或修改过的文件从远程主机传输到本地主机。

在本地计算机上,我们使用SCP将文件传输到远程主机。我们还可以使用rsync或任何我们觉得舒服的传输工具。

为VS代码工作区创建一个目录。在子目录.devtainer.json中创建devtainer.json。使用与下面类似的JSON。

//有关格式详细信息,请参阅https://aka.ms/vscode-remote/devcontainer.json或此文件的自述文件,网址为://https://github.com/microsoft/vscode-dev-containers/tree/v0.117.1/containers/docker-existing-dockerfile{";Name";:";vs Code Remote Demo";,//将运行上下文设置为上一级,而不是.devtainer文件夹。";上下文";:";..";,//如果您不使用标准文件名,请更新';dockerFile';属性。";dockerFile";:";../docker/nvidia.Dockerfile";,//在容器创建时设置*default*容器特定的settings.json值。";设置";:{";Terminal al.Integrated.shell.linux";:null},//添加容器创建时需要安装的扩展ID。";Extensions";:[],//使用';ForwardPorts';使容器内的端口列表在本地可用。//";forwardPorts";:[],//创建容器后,取消对要运行命令的下一行的注释-例如安装git。//";postCreateCommand";:";apt-get update&;&;apt-get install-y git";,//使用基于ptrace的调试器(如C++、Go和Rust)时取消注释//";runArgs";:[";--cap-add=SYS_ptrace";,";-security-opt";,";seccomp=unconfined";],";rungs";:[";-。],//取消注释可以从容器内部使用Docker CLI。见https://aka.ms/vscode-remote/samples/docker-in-docker.//";装载";:[";source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind";],//取消注释以非root用户身份连接。见https://aka.ms/vscode-remote/containers/non-root.//";remoteUser";:";vscode";//使用卷//";image";:";ubuntu-remote-test:0.0.1";,//或";dockerFile";//";workspaceFolder";::";/workspace";,//";workspace mount";:";source=remote-workspace,target=/workspace,type=volume";//Using/home/leimao/workspace/vs-remote-workspace/是远程主机上的目录/";workspaceFolder";是Docker容器中作为workspace的文件夹//target=/workspace是主机服务器上的工作区将要绑定到的Docker容器中的文件夹&#。:";source=/home/leimao/Workspace/vs-remote-workspace/,目标=/工作区,类型=绑定,一致性=缓存";,}。

请注意,";dockerFile";必须正确指向我们要使用的本地Dockerfile。我们还为";runArgs";提供了额外的Docker运行参数。

单击Remote-Containers:在Container中打开文件夹。打开包含我们刚刚配置的.devtainer/devtainer.json的本地工作区。

第一次运行可能需要一段时间,因为远程主机服务器必须构建Docker映像并启动Docker容器。一旦成功启动,我们将在VS代码中看到以下布局。我们刚刚传输到远程主机工作区的hello.sh文件也显示在VS Code工作区中。

验证容器是否按预期成功运行。我们可以看到,NVIDIA坞站容器实例已经通过使用NVIDIA-SMI成功运行,并且GPU是GeForce GT 640,这是一个非常旧的GPU,它与我安装在远程主机服务器上的GPU相匹配。

然后,我们可以在VS代码终端中运行程序或在VS界面中调试程序。

在远程主机服务器上安装VS代码扩展也可能有助于开发。

安装后,远程主机服务器上的VS代码扩展将显示在一个独立的面板中。

开发完成后,不要忘记将文件从远程主机传输回本地计算机。

VS代码还具有远程SSH扩展。用户将能够使用SSH进入远程主机服务器,并在本地VS代码GUI上修改远程主机服务器上的文件。但是,这些程序可能无法在主机服务器本机系统上运行,并且VS代码及其有用的调试扩展无法在主机服务器上的Docker容器中直接使用。