vscode remote explorer 看不到 docker 容器,需安装启用 docker 扩展、确保 docker daemon 运行;ssh 主机列表为空则检查 ~/.ssh/config 路径、权限(600)、host 命名规范及 proxycommand 可执行性。

Remote Explorer 里看不到 Docker 容器?
VSCode 的 Remote Explorer 默认不自动发现本地运行的容器,必须先安装并启用 Docker 扩展(不是 Remote - SSH 或 Remote - Containers 单独那个),且 Docker daemon 必须正在运行。
常见错误现象:No containers found、列表为空、刷新后仍无响应。
- 确认
docker ps在终端能列出容器;如果连这个都失败,Remote Explorer肯定看不到 - 检查 VSCode 左下角状态栏是否显示
Docker图标 —— 没有说明扩展未激活或初始化失败 - Windows 用户注意:WSL2 后端的 Docker Desktop 需开启
Use the WSL 2 based engine,否则 VSCode(尤其在 Windows 原生界面下)可能无法通信 - Mac/Linux 用户若用 rootless Docker,需确保 VSCode 是用同一用户启动,且
DOCKER_HOST环境变量未被覆盖
点击容器后打不开,提示“Failed to connect to the remote extension host”
这不是网络问题,而是容器里缺少 VSCode Server 运行依赖。Remote - Containers 扩展会在你首次连接时自动注入服务端组件,但前提是容器满足基本条件。
典型触发场景:基于 alpine、scratch 或极简基础镜像构建的容器;或容器内没装 curl/tar/gzip 等工具。
- 最直接验证方式:在容器中执行
docker exec -it <container> sh -c 'which curl tar'</container>,缺任一就大概率失败 - 临时修复:进容器手动装依赖(如
apk add curl tar gzip),但不推荐长期用 —— 应该改Dockerfile或使用官方 devcontainer 基础镜像(如mcr.microsoft.com/vscode/devcontainers/python:latest) - 如果你用的是自定义
devcontainer.json,确认其中remoteUser存在且有 shell 权限,onCreateCommand不要阻塞启动流程
Remote Explorer 中 SSH 主机列表为空或不更新
Remote Explorer 显示 SSH 主机,依赖的是 VSCode 读取本地 ~/.ssh/config 文件,不是靠扫描或自动发现。
容易踩的坑集中在路径、权限和格式上:
- Windows 用户注意:VSCode 默认读取
%USERPROFILE%\.ssh\config,不是 WSL 里的/home/xxx/.ssh/config;跨环境编辑时容易搞混 -
config文件权限必须是600(Linux/macOS),否则 VSCode 会静默跳过(OpenSSH 本身也拒绝读取宽松权限的 config) - Host 条目不能包含下划线
_,只允许字母、数字、连字符-和点.;写成my_dev_server就不会出现在列表里 - 如果用了 ProxyJump 或 ProxyCommand,确保相关命令(如
nc、ssh)在本地 PATH 中可执行,否则主机名会显示但连接失败
容器和 SSH 主机图标混在一起,怎么区分当前连的是哪个?
Remote Explorer 顶部有三个标签页:SSH Targets、Containers、Virtual Machines。但默认打开时,它可能只显示一个活跃标签页,而你没注意到切换按钮。
更隐蔽的问题是:当你从命令面板(Ctrl+Shift+P)用 Remote-Containers: Attach to Running Container... 连上容器后,左侧资源管理器仍显示本地文件树 —— 这不是 bug,是 VSCode 的「窗口级远程」机制:只有整个窗口重载为远程上下文,侧栏才会真正切换为容器视角。
- 判断依据看左下角状态栏:显示
Dev Container: xxx或SSH: xxx才算真正连接成功 - 如果只是右键容器选了
Attach Visual Studio Code,但没等进度条走完就操作,VSCode 可能卡在“半连接”状态,此时重启窗口最稳妥 - 多个容器同名时(比如都叫
app),Remote Explorer会按 container ID 截断显示,但点击后实际连的是第一个匹配项 —— 建议用docker rename显式命名,避免歧义
真正的麻烦往往藏在 Docker daemon 和 SSH config 的细节里,而不是 UI 上那个“刷新”按钮。











