学习 docker / kubernetes 的时候我曾经想,既然有专门用于编译的 image base,那么要是能够用 docker 进行编译安装配置的尝试就好了,因为如果直接在系统上进行编译安装,如果尝试多次并且有失败或放弃的情况下,包管理器和系统路径(/usr /etc 等等) 下总是会被污染。当然,由于需要进行编译安装配置,要去最好可以用 vscode 连进容器里面进行操作,这样可以借用 vscode 的插件功能、代码高亮等等便捷功能。
那么该怎么实现这一点呢?询问群友,一个方案是自己制作一个包含 sshd 的镜像,然后手动设置好端口映射、volume,之后用 VSCode-Remote 插件像连一个普通远程 Linux 设备一样连上去。这自然是可以,但是启动起来很麻烦。有没有更简单的方法呢?有群友提出 ”VSCode-Dev-Container 插件就是干这个的,工作上在用“。
VSCode-Dev-Container 插件实际上是 VSCode-Remote 这一官方插件的一个子插件 (?),已经在我电脑里躺了很久了,由于宿主机是 Windows 一直没有能正确触发,我也一直没在意。默认教程 Get started with development Containers in Visual Studio Code 实操需要 Docker Desktop 支持,无法使用。于是查阅了一些资料,主要参考这篇官方blog,在 WSL2 上实现了 Dev-Container 的正常使用。
于是记录一下。理论上 WSL2 可用 普通的远程 Linux 平台也没问题。
使用步骤
- 连接到 Linux 服务器 - 和默认做法不同,因为宿主机是 Windows 没有 docker ,要使用远程 Linux (这里是 WSL) 上的 docker 。因此需要先连接到 Linux 服务器。 
- 新建一个文件夹作为 工作目录 - workspace- 这个文件夹内的内容会被完整映射到容器中,方便修改。 
- 确保 docker 正在运行 - WSL2 里面有个特殊情况,它不使用 systemd 管理启动任务,因此安装的 docker 每次开机也不会自己启动。 - 可以使用 - 1 - sudo service docker start - 启动 docker 。 
- 创建容器 meta   - 这是 Remote 插件的 Open a Remote Window 。点击,选择 Add Dev Container Configuration Files;注意整个过程中都不会用到 New Dev Container 这个选项。 - 这时候可以选择想要的开发环境、预装软件包。 - 完成后,在 - workspace中会生成- 1 
 2
 3
 4
 5- . 
 ├── .devcontainer
 │ └── devcontainer.json
 └── .github
 └── dependabot.yml- devcontainer.json中可以设置一些容器属性,例如是否容器内使用 root 等等。详细情况可参考官方教程。
- 连接到容器 - 点击 Remote 插件的 Open a Remote Window ,选择 Reopen in Container ; - 这是将 - workspace映射到容器内。- 过程会经历 拉取、构建,可能需要不少时间,可以打开日志查看。 
- 可以使用了! - 容器启动之后就正式可以使用了! - 在 - workspace的修改就是在 Linux 下的修改,无需同步。在其他文件夹的修改都是在容器内的,不会污染外部。- VSCode-Remote 插件会自动为打开的调试服务构建 Tunnel,可以在宿主机上直接访问。 - 当使用完成后,点击 Remote 插件的 Open a Remote Window ,选择 Close Remote Connection 可以安全退出容器(容器还保存); 
- 删除容器 - 1 - sudo docker ps -a - 查找到对应容器, - 1 - sudo docker rm <id> - 删除。 
