VS Code 远程开发如何配置 SSH、容器和 WSL?
如果你经常遇到“本地能跑,服务器上跑不了”“Windows 路径和 Linux 权限打架”“团队每个人 Node、Python、Docker 版本都不一样”,VS Code 远程开发能省掉不少环境折腾。
它的工作方式很直接:VS Code 界面仍在本地,代码、终端、语言服务、调试器可以运行在 SSH 服务器、Docker 容器或 WSL 里。也就是说,你看到的是本地编辑器体验,实际执行环境却贴近生产或项目约定的开发环境。
先判断该用哪种远程开发模式
VS Code 远程开发常见有三种入口,不建议一上来全装全配,先按场景选。
| 模式 | 适合场景 | 主要依赖 | 典型优势 |
|---|---|---|---|
| Remote SSH | 代码和服务在远程 Linux 服务器上 | SSH 服务、远程账号 | 接近线上环境,适合后端、算法、运维开发 |
| Dev Containers | 项目希望用容器固定依赖版本 | Docker、.devcontainer 配置 | 团队环境一致,换电脑也容易恢复 |
| WSL | Windows 用户需要 Linux 开发环境 | WSL 2、Linux 发行版 | 比虚拟机轻,适合前端、Node、Python、Go 等项目 |
一句话选择:已有远程服务器就用 Remote SSH;想把项目依赖锁进容器就用 Dev Containers;Windows 本机开发 Linux 项目优先用 WSL。
Remote SSH 如何配置
Remote SSH 的重点不是“远程同步文件”,而是 VS Code 会在远程机器上安装一个 VS Code Server。你打开的文件、运行的终端、语言服务都在远程机器上执行,本地只负责显示界面。
远程机器需要先满足这些条件
连接前先确认几件事,比反复重装扩展更省时间:
- 远程服务器开启了 SSH 服务,端口能从本机访问。
- 远程账号有可写的 home 目录,VS Code Server 默认会装到
~/.vscode-server。 - 磁盘空间不能太紧张,语言服务、扩展和缓存会占用一定空间。
- Shell 环境正常,登录后能执行基础命令,如
sh、tar、uname。 - 如果服务器在公司内网或云厂商安全组后面,要先放通对应端口。
本地安装扩展并配置 SSH 主机
在 VS Code 扩展市场安装 Remote - SSH。如果你安装的是 Remote Development 扩展包,也会包含它。
然后编辑本机 SSH 配置文件:
sshconfigHost dev-linux HostName 192.168.1.100 User username Port 22 IdentityFile ~/.ssh/id_rsa ServerAliveInterval 30 ServerAliveCountMax 3
几个字段的含义:
Host是你在 VS Code 里看到的别名,可以随便取。HostName写服务器 IP 或域名。User是远程登录用户。IdentityFile指向私钥路径,建议用密钥登录,不要长期依赖密码。ServerAliveInterval和ServerAliveCountMax可以减少空闲连接被断开的概率。
如果还没有 SSH 密钥,可以先生成一对,再把公钥放到服务器的 ~/.ssh/authorized_keys。私钥权限过宽会导致 SSH 拒绝使用,常见修复是:
bashchmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/config
在 VS Code 中连接远程主机
按 F1 或 Ctrl+Shift+P 打开命令面板,执行:
textRemote-SSH: Connect to Host
选择刚才配置的 dev-linux。首次连接时,VS Code 会在远程机器下载并安装 VS Code Server。成功后左下角会显示远程主机名,这时再选择远程目录作为工作区。
连接后要注意一个细节:集成终端已经在远程服务器上运行。你执行 npm install、pip install、go test,消耗的是远程机器资源,不是本机资源。
远程开发时文件、扩展和终端怎么工作
很多人第一次用 Remote SSH 会误以为 VS Code 在同步本地文件,其实不是。
文件操作发生在远程机器
你打开 /home/username/project 后,保存、搜索、Git 操作默认都针对远程目录。这样做的好处是不会出现“本地改了但服务器忘记同步”的问题。
如果你需要把本地文件传到远程,建议用 Git、SCP、rsync 或直接在远程仓库拉代码,不要把 VS Code 当作文件同步工具。
扩展分本地和远程两类
VS Code 会把扩展大致分成两类:
- 主题、图标、快捷键这类界面扩展留在本地运行。
- ESLint、TypeScript、Python、Go、调试器这类依赖项目环境的扩展会安装到远程。
如果某个语言提示突然失效,先看扩展面板里它是不是装在远程侧。有些扩展旁边会出现 “Install in SSH: xxx” 的按钮,需要手动点一下。
终端环境和远程登录环境不一定完全相同
VS Code 集成终端通常会读取远程用户的 shell 配置,但它和你直接用系统终端 SSH 登录仍可能有差异。比如 Node 版本管理器、conda、nvm 的初始化脚本没有加载,就会出现命令找不到。
遇到这种情况,先在 VS Code 终端里执行:
bashwhich node node -v echo $SHELL
确认路径和版本,再检查 .bashrc、.zshrc 或 profile 配置。
Dev Containers 如何配置
Dev Containers 适合“项目依赖比较重、团队环境容易不一致”的情况。它会把开发环境放进 Docker 容器,VS Code 连接到容器内部工作。
先安装 Dev Containers 扩展。旧教程里常写 “Remote - Containers”,现在扩展名称已经改为 Dev Containers。
项目根目录创建 .devcontainer/devcontainer.json:
json{ "name": "node-dev", "image": "mcr.microsoft.com/devcontainers/javascript-node:18", "customizations": { "vscode": { "extensions": ["dbaeumer.vscode-eslint"] } }, "postCreateCommand": "npm install", "remoteUser": "node" }
配置含义如下:
image指定基础镜像,Node、Python、Go、Java 都有官方 devcontainer 镜像可选。customizations.vscode.extensions指定容器内建议安装的 VS Code 扩展。postCreateCommand在容器首次创建后执行,常用于安装依赖。remoteUser避免容器内文件全由 root 创建,减少权限问题。
配置好后,打开命令面板执行:
textDev Containers: Reopen in Container
VS Code 会构建或拉取镜像,把项目挂载进容器,再重新打开窗口。
Dev Containers 常见坑
容器开发最常见的慢,往往不是 VS Code 慢,而是构建上下文太大。把 node_modules、dist、日志文件、缓存目录写进 .dockerignore,能明显减少构建时间。
如果每次重建容器都要重新安装依赖,可以考虑用 Docker volume 缓存依赖目录。Node 项目尤其要注意,不要把宿主机的 node_modules 直接带进 Linux 容器,平台差异会让二进制依赖出问题。
端口方面,VS Code 通常会自动提示转发。比如容器里启动了 localhost:3000,本机浏览器可以通过转发端口访问。没有提示时,可以在 Ports 面板手动添加。
WSL 远程开发如何配置
WSL 适合 Windows 用户。它比传统虚拟机轻,也比把项目放在 Windows 文件系统里硬跑 Linux 工具顺手。
基本步骤:
- 安装 WSL 2 和一个 Linux 发行版,如 Ubuntu。
- 在 VS Code 安装 WSL 扩展。
- 打开 WSL 终端,进入项目目录后执行
code .。
推荐把项目放在 WSL 的 Linux 文件系统里,例如:
bash~/projects/my-app
不建议长期放在 /mnt/c/Users/... 下开发。跨 Windows 文件系统访问会更慢,文件权限、大小写、监听变更也更容易出问题。前端项目的 node_modules 很多时,这个差异会被放大。
如果你同时用 Docker Desktop,记得开启对应发行版的 WSL integration。否则 VS Code 在 WSL 里可能找不到 Docker,或者连接到了和预期不同的 Docker daemon。
如何减少卡顿和连接中断
远程开发是否顺手,很大程度取决于网络、文件监听和扩展数量。
减少不必要的文件监听
大型项目可以在工作区设置里排除构建产物和依赖目录:
json{ "files.watcherExclude": { "**/node_modules/**": true, "**/.git/objects/**": true, "**/dist/**": true, "**/build/**": true }, "search.exclude": { "**/node_modules": true, "**/dist": true, "**/build": true } }
这不会删除文件,只是减少 VS Code 的监听和搜索负担。
只在远程安装必要扩展
语言服务、调试器、Lint 工具需要远程运行;主题、图标、Markdown 预览这类通常留在本地就够了。远程服务器配置不高时,少装几个后台常驻扩展,比改很多小参数更有效。
SSH 连接优先用密钥和保持活跃配置
密码登录不仅麻烦,也更容易受安全策略影响。推荐使用密钥加 ssh-agent。连接经常断开时,优先检查网络和安全组,再补充 keep alive 配置:
sshconfigHost * ServerAliveInterval 30 ServerAliveCountMax 3
如果公司网络需要跳板机,可以在 SSH config 里配置 ProxyJump,这样 VS Code 也能复用同一套连接方式。
常见问题怎么排查
| 问题 | 优先检查 | 处理思路 |
|---|---|---|
| 连接失败 | SSH 配置、端口、安全组、用户名 | 先用系统终端执行 ssh dev-linux,确认普通 SSH 能连通 |
| 一直卡在 Installing VS Code Server | 远程磁盘、home 权限、下载网络 | 清理 ~/.vscode-server 后重连,或检查服务器是否能访问下载源 |
| 终端命令找不到 | shell 初始化脚本、PATH、nvm/conda | 在 VS Code 终端和普通 SSH 终端分别对比 echo $PATH |
| 保存文件提示权限不足 | 项目目录所有者、容器用户、sudo 创建文件 | 修正目录 owner,Dev Containers 中设置 remoteUser |
| TypeScript、Python 提示失效 | 扩展是否安装在远程、解释器路径 | 在远程扩展区安装语言扩展,并选择正确解释器 |
| WSL 项目很慢 | 项目是否在 /mnt/c 下 | 把项目移动到 WSL Linux 文件系统内 |
| 容器反复重装依赖 | 镜像缓存、volume、postCreateCommand | 使用 .dockerignore 和依赖缓存,避免把无关文件放进构建上下文 |
排查顺序建议从“普通 SSH 或普通终端是否正常”开始。VS Code 远程开发建立在这些基础能力之上,底层连接或环境本身不稳定,编辑器层面很难单独修好。
安全和备份别忽略
远程开发会让本地编辑器直接操作服务器文件,权限边界要想清楚。
- 私钥不要提交到仓库,也不要放进项目目录。
- 谨慎使用 SSH Agent Forwarding,只在确实需要远程服务器继续访问 Git 仓库时开启。
- 生产服务器不建议直接当开发机,至少要使用低权限账号和独立目录。
- 远程环境变量、密钥、数据库配置应放在服务器或密钥管理系统中,不要写进代码。
- 远程代码也要走 Git,不要只依赖服务器上的一份工作区。
最后怎么选
Remote SSH 适合直接在远程 Linux 机器上开发和调试;Dev Containers 适合把依赖、工具链和扩展配置一起固化到项目里;WSL 适合 Windows 用户获得更自然的 Linux 开发体验。
如果是个人项目,WSL 或 Remote SSH 通常最快上手。如果是团队项目,Dev Containers 的前期配置成本更高,但能减少“我这里跑不起来”的沟通成本。真正影响体验的不是装了多少远程扩展,而是环境边界是否清楚:文件在哪里,命令在哪里执行,依赖装在哪个系统里。