VSCode连Docker容器失败主因是缺Remote-Containers扩展、.devcontainer/devcontainer.json配置及Docker daemon权限;必须安装ms-vscode-remote.remote-containers官方扩展,确保docker info无permission denied,并将devcontainer.json置于项目根目录且填对image或build等必填字段。

VSCode 连 Docker 容器失败,90% 不是缺“虚拟化支持”,而是缺 Remote-Containers 扩展 + .devcontainer/devcontainer.json + Docker daemon 权限三件套。Windows/macOS 用户开 Docker Desktop 就默认启用 WSL2/Hyper-V,不用手动开 BIOS 虚拟化;Linux 用户压根不依赖 CPU 虚拟化指令,靠的是内核的 cgroups 和 namespace。
Remote-Containers 扩展装错 ID 或根本没装
必须安装 Microsoft 官方扩展 ms-vscode-remote.remote-containers,不是 vscode-docker(那是管理镜像/容器列表的),也不是任何第三方叫 “Remote Container” 的仿品。装错后点 Reopen in Container 会卡在“正在重载窗口”或状态栏始终不出现 Dev Container 提示。
- 打开 VSCode 扩展面板(
Ctrl+Shift+X),搜remote containers,认准发布者是 Microsoft - 卸载所有名字含 “container” 但发布者不是 Microsoft 的插件,避免冲突
- 装完不要重启 VSCode —— 它会在首次使用时自动激活
docker info 报 permission denied 就别往下试
Remote-Containers 扩展底层调用的是你本地的 docker 命令,不是走 SSH 或 HTTP API。如果终端里执行 docker info 出现 permission denied,VSCode 一定连不上。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- Linux:运行
sudo usermod -aG docker $USER后,必须完全退出当前桌面会话(关掉所有终端、登出重进),newgrp docker不生效 - macOS/Windows:确认 Docker Desktop 已启动,且右下角鲸鱼图标是稳态(非旋转中);若提示 “WSL2 backend not enabled”,进 Docker Desktop 设置 → General → 勾选 “Use the WSL2 based engine”
- 验证命令:
docker run --rm hello-world必须成功输出,否则配置无效
.devcontainer/devcontainer.json 放错位置或字段空着
VSCode 只识别项目根目录下的 .devcontainer/devcontainer.json,放错路径(比如放在 src/.devcontainer/)、文件名拼错(devcontainer.json.txt)、或漏掉必填字段,都会导致“Reopen in Container”弹出空白镜像选择框,或者直接报错 Failed to resolve configuration。
- 路径必须是:
./.devcontainer/devcontainer.json(注意双点开头、斜杠分隔) -
"image"和"build"字段二者必须且只能填一个;都空着或都写,会构建失败 - 用
"build"时,"dockerfile"路径是相对于.devcontainer/的,例如"dockerfile": "Dockerfile"表示.devcontainer/Dockerfile - 没写
"forwardPorts",容器里跑的flask run就不会在 VSCode 右下角显示可点击链接,宿主机也打不开localhost:5000
容器内 UID/GID 不匹配,文件保存或 git 就报 Permission denied
VSCode 默认以宿主机当前用户的 UID 启动容器进程。但绝大多数基础镜像(如 python:3.11-slim)只有 root 用户,没有对应 UID 的普通用户,结果就是:你在编辑器里新建文件,ls -l 看到属主是 root:root;但本地 git commit 是以你自己的 UID 运行,权限对不上,直接拒绝。
- 最简解法:在
devcontainer.json里加"remoteUser": "vscode"和"runArgs": ["--user", "vscode"] - 如果用了自定义
Dockerfile,必须在里面创建该用户:RUN useradd -m -u 1001 -G sudo vscode,再USER vscode - 别用
sudo code启动 VSCode —— 这会让容器内所有操作继承 root 权限,反而加剧权限混乱
真正卡住人的从来不是“怎么开虚拟化”,而是 docker info 是否通、devcontainer.json 是否在对的位置、以及容器里那个用户到底存不存在。这三个点对了,剩下的只是等镜像拉完、Server 装好、插件同步完成——它本来就不该是个玄学过程。

















