VSCode本身不运行Docker容器,真正执行代码的是容器内环境;Remote-Containers扩展是实现编辑、运行、调试全在容器内的关键,Docker插件仅辅助管理镜像和容器,无法替代其开发功能。

VSCode 本身不运行 Docker 中的代码,真正执行代码的是容器里的环境;Remote-Containers 扩展才是让“编辑、运行、调试”全部发生在容器内的关键,Docker 插件(ms-azuretools.vscode-docker)只负责浏览和轻量操作,不能替代它。
Remote-Containers 扩展必须装,Docker 插件只是辅助
很多人误以为装了 ms-azuretools.vscode-docker 就能进容器开发——它只能列出镜像、启动/停止容器、看日志,点“Exec in Container”进 shell 还经常失败(因为精简镜像没 /bin/bash)。真要写代码、跑服务、打调试断点,必须用 ms-vscode-remote.remote-containers。
- Remote-Containers 启动后,VSCode Server 运行在容器里,终端、Python 解释器、
pip全是容器内的,路径和依赖完全对齐 - Docker 插件连不上 daemon 时会静默空白,而 Remote-Containers 会在命令面板里直接报错,比如
Failed to connect to Docker daemon,提示更明确 - 两个插件可以共存,但分工清晰:Docker 插件管“容器生命周期”,Remote-Containers 管“开发上下文”
devcontainer.json 配置错一个字段,容器就起不来
VSCode 不会自动猜你要进哪个容器,.devcontainer/devcontainer.json 是唯一入口文件。放在项目根目录下,内容必须包含可执行的启动依据:
- 二选一:
"image": "mcr.microsoft.com/vscode/devcontainers/python:3.11"(推荐新手),或"build": { "dockerfile": "Dockerfile" }(自定义强需求) -
"forwardPorts"必须填,比如 Flask 默认端口5000,不写这行,浏览器访问localhost:5000就是连接被拒绝 -
"customizations.vscode.extensions"要显式列全,["ms-python.python", "esbenp.prettier-vscode"]—— 容器里不会继承你本地装的插件 - 别用生产镜像如
python:3.11-slim直接启动,缺curl、git、make,连pip install都可能卡住;优先选官方devcontainers镜像
代码在宿主机,运行在容器里,路径映射必须对得上
你编辑的文件物理存在本地磁盘,但 python app.py 是在容器里执行的。VSCode 默认把项目挂载到 /workspaces/your-project,这就带来两个典型问题:
- 调试断点不命中:launch.json 里没配
sourceFileMap,调试器找不到宿主机路径对应的容器内路径,得加映射:"sourceFileMap": { "/workspaces/your-project": "${workspaceFolder}" } - Python 解释器报错或 pip 权限拒绝:检查
python.defaultInterpreterPath是否指向容器内真实路径(如/usr/local/bin/python),而不是宿主机路径 - 虚拟环境别建在宿主机:在容器终端里执行
python -m venv /workspaces/your-project/.venv,再在设置里指定这个路径
容器里跑不起来服务?先确认监听地址和后台模式
本地能跑的 Flask/FastAPI,在容器里打不开页面,90% 是因为没改监听配置:
- Flask 默认只监听
127.0.0.1:5000,容器里127.0.0.1是它自己,不是你的宿主机;必须改成--host 0.0.0.0:5000 - FastAPI + Uvicorn 示例命令:
uvicorn main:app --reload --host 0.0.0.0:8000 --port 8000,漏掉--host 0.0.0.0就白搭 - 容器进程退出就断开:用
docker run -d启动的容器才常驻;如果只是docker run ubuntu sleep 10,10 秒后容器终止,VSCode 会断连 - 端口转发生效前提:容器内服务必须已启动,且
forwardPorts列出的端口正被监听;可用netstat -tuln | grep :5000在容器终端里验证
最容易被忽略的是:每次修改 devcontainer.json 后,必须执行 Remote-Containers: Reopen in Container(不是 reload window),否则配置不生效;而 Docker 插件右键“View Logs”看到的日志,其实是容器 stdout 的快照,不是实时流——真要看滚动日志,还是得进容器终端敲 docker logs -f。


















