以远端的容器作为开发环境
潘忠显 / 2025-10-28
背景:前两周因为要调试一个模型服务,需要用到带显卡的开发环境,AnyDev上没有申请到GPU容器,就在组内一台有显卡的CVM上启动容器,以该容器作为开发环境。之前使用 JetBrains 的软件直接连过远程服务器,但是还没有连过服务器上容器。
最近使用 VS Code 连接远程容器作为开发环境,非常简单,稍作记录。
为了更聚焦,这里类比真实开发场景进行了简化:
- 远端服务器:1.13.173.171,无Go环境,有Docker 和
golang:1.20镜像 - 代码仓库:远端目录
~/data/demo_repo只有一个 main.go 文件
VS Code 连接到远端机器、远端容器的原理如下,可以先有一个清晰的认识:
1. 连接到远程服务器
这一步太简单了,相信你左侧的面板里一定有一个 「远程/SSH」 的选项卡。
不过我这里还是简单介绍一下。
VS Code 中使用 Command + Shift + P (在 macOS 上) 或 Ctrl + Shift + P (在 Windows/Linux 上) 调用出来的那个窗口叫做:命令面板 (Command Palette)。
可以直接通过命令面板找到 SSH config:
如果你使用密码登录,可以直接这样配置:
Host 1.13.173.171
User root
# 强制禁用公钥认证
PreferredAuthentications password
PubkeyAuthentication no
保存配置文件之后就可以在左侧出现对应的远程主机,双击即可连接,输入密码即可连接。
但是,最安全、最方便、最推荐的方法是使用 SSH 密钥进行认证,而不是保存密码或重复输入密码(需要在远程主机上关联公钥),本地配置如下:
Host 1.13.173.171
Port 22
User ubuntu
IdentityFile ~/.ssh/id_ed25519
连接成功之后,便可以打开项目目录。
2. 安装 Dev Containers
需要点击左侧的插件按钮,安装 「Dev Containers」 插件才能进行使用。
3. 非root用户的权限设置
如果你不是使用 root 登录的远端服务器,需要将用户加入到 Docker 用户组才行,不然没有权限访问容器(本质是没有权限直接调用 docker run 等指令)。
sudo usermod -aG docker $USER
执行完上边的指令之后,需要重启 VS Code。
如果是你自己的机器,直接用 root 也很方便,不需要此步骤。
4. 配置开发容器
如果你有现成的镜像,可以直接创建文件配置。如果你没有现成的容器镜像,可以通过交互式的方式找到合适的镜像,进而创建环境。
交互式配置开发容器
通过命令面板找到 「Add Dev Container Configuration Files…」:
选择一个模板,比如可以选择 Go 的:
然后进一步选择具体的版本:
上边步骤操作完之后,会产生一个 .devcontainer/ 目录,在下边产生一个 devcontainer.json 文件。
直接配置开发容器
从上边介绍可以看到,以上交互操作,是通过图形界面操作,最终生成一个 .devcontainer/devcontainer.json 文件。
如果你有现成的开发环境镜像,完全可以直接创建配置文件:
mkdir -p .devcontainer/
touch .devcontainer/devcontainer.json
然后编辑内容:
{
// 使用自己的开发镜像和名称
"name": "go1.20",
"image": "golang:1.20"
}
5. 进入容器开发与构建
通过命令面板搜索:Dev Containers: Open Folder in Container:
选择相应目录之后,便进入到了容器。
通过新创建的 Terminal 便可以直接执行指令,进行构建。
6. 其他操作
Dev Containers 面板介绍
常用的操作都可以在左侧 Remote 的面板中通过右键或者右上角的图标操作。
上方可以切换是使用 Dev Containers 还是使用普通的 SSH。
特殊指令需要通过命令面板。
更新开发容器
如果你更新了 devcontainer.json 文件,通常右下角会提醒是否要重新构建环境,点击 Rebuild 即可构建:
你也可以通过面板搜索 「Dev Containers: Rebuild Container」:
清理开发容器
如果经常使用多个不同的容器,可以搜索 「Clean Up Dev Containers」,对不再需要的已停止的开发容器进行清理操作。
因为构建过程可能产生比较大的中间镜像层。清理一下可以释放系统资源(主要是磁盘空间),保持环境整洁。
小结
通过上述步骤,可以快速的在本地连接到远程服务器上的容器中,以此作为开发编译环境,大大提高开发效率。
