Docker+Linux+VS Code远程开发环境搭建指南
1. 为什么这三件套组合是个人开发者绕不开的“效率分水岭”
我第一次在本地 Windows 上用 VS Code 连上远端 Ubuntu 服务器,再把 Python 项目跑进 Docker 容器里调试时,手抖删错了半行配置,结果整个环境崩了——不是代码崩,是开发链路崩了。那天我花了三小时重装 Python 环境、重配 SSH 密钥、重拉镜像、重装 VS Code 插件……最后发现只是
~/.ssh/config
里少了个
IdentitiesOnly yes
。这件事让我彻底意识到:Docker + Linux 服务器 + VS Code 远程开发,从来不是三个独立工具的简单叠加,而是一套
可复现、可隔离、可迁移、可协作的现代开发基础设施
。它解决的不是“能不能跑起来”的问题,而是“能不能稳定、快速、无感地反复验证和交付”的问题。
你可能正卡在某个具体环节:比如 VS Code 提示“无法连接到远程主机”,但
ssh user@ip
命令明明能通;或者
docker run -it ubuntu:22.04 /bin/bash
进去后发现没有
pip
,想装又怕污染基础镜像;又或者在服务器上改了代码,本地 Git 却没反应,搞不清文件到底存在哪一层。这些都不是孤立故障,而是这套组合中
三层抽象边界被模糊或错位
导致的典型症状:VS Code 的编辑层、Linux 的系统层、Docker 的运行层,必须各司其职又无缝咬合。很多人学了一堆命令,却始终没建立起这个分层认知模型——所以今天这篇记录,不教你怎么敲
docker build
,而是带你亲手把这三层的“接缝处”焊死。
核心关键词就藏在这句话里: Docker 是环境封装器,Linux 服务器是执行底盘,VS Code 是人机交互界面 。它们共同构成一个“开发即服务”的最小闭环。你不需要买云主机,一台旧笔记本装个 Ubuntu Server 就够;你也不需要成为 DevOps 工程师,只要理解容器镜像的分层缓存机制、SSH 配置的权限继承逻辑、VS Code Remote-SSH 插件的连接生命周期,就能稳稳落地。我试过用树莓派 4B(4GB 内存)跑起完整的 Django + PostgreSQL + Redis 开发环境,响应延迟比本地 Mac 还低 12ms——关键不在硬件,而在路径是否最短。接下来所有内容,都围绕如何让这三层之间数据流、控制流、状态流保持单向、清晰、可审计展开。
2. 整体架构设计与方案选型逻辑
2.1 为什么放弃虚拟机、Wine、WSL2?直击真实痛点
刚接触远程开发时,我也试过 WSL2 + Docker Desktop 的组合。表面看很美:Windows 上开个终端,
wsl -d Ubuntu-22.04
进去,
docker run hello-world
成功,VS Code 装上 Remote-WSL 插件,点一下就连接成功。但三个月后,我删掉整个 WSL 发行版重装了四次。原因很具体:
-
磁盘空间黑洞
:WSL2 的虚拟硬盘
ext4.vhdx会无限膨胀,即使容器已删、镜像已清,wsl --shutdown && wsl --unregister Ubuntu-22.04后重装,旧空间仍不释放; -
网络策略冲突
:公司防火墙对 WSL2 的
vEthernet (WSL)适配器有特殊规则,导致docker pull超时,但curl https://registry-1.docker.io却正常; -
GUI 应用失焦
:用 VS Code Remote-WSL 打开
.ipynb文件,Jupyter 内核启动后,matplotlib绘图窗口总在后台,Alt+Tab 切不过去。
于是我把开发环境彻底迁移到物理 Linux 服务器(一台闲置的 Intel NUC,装 Ubuntu Server 22.04 LTS)。这不是倒退,而是回归本质:
服务器即开发机,开发即部署前的最后验证
。Docker 在这里不是为了“模拟生产”,而是为了“冻结依赖快照”。比如我写一个爬虫脚本,本地测试用 Python 3.10,但生产要求 Python 3.9 —— 用
docker build
打包时指定
FROM python:3.9-slim
,镜像构建过程自动完成版本锁定、依赖安装、权限设置,连
pip install -r requirements.txt
的输出日志都固化在镜像层里。下次同事拉取同一镜像,哪怕他本地是 macOS 或 Windows,运行结果也 100% 一致。
VS Code Remote-SSH 成为唯一选择,因为它的设计哲学就是“零客户端侵入”。它不往远程服务器装任何 GUI 组件,只通过 SSH 通道传输文件变更、进程状态、终端 I/O 流。你看到的“远程文件浏览器”,其实是 VS Code 本地进程调用
scp
和
ssh
命令实时同步的;你按下的
F5
启动调试,本质是本地 VS Code 向远程发送一条
ssh user@server 'cd /path && python -m debugpy --listen 5678 --wait-for-client main.py'
命令。这种极简协议栈,让它比 JetBrains 全家桶的 Remote Development(需在服务端部署 Gateway 服务)更轻量、更可控、更易排查。
提示:不要被“远程开发”字面意思误导。真正的价值不在“远程”,而在“环境一致性”。你完全可以在本机虚拟机里装 Ubuntu,然后用 VS Code Remote-SSH 连过去——只要那台虚拟机 IP 固定、SSH 服务开启、Docker 已安装,它就等同于一台云服务器。关键在于,你是否愿意把开发环境当成一次性的、可销毁重建的资源来管理。
2.2 Docker 镜像选型:Slim 还是 Alpine?实测内存与启动时间的硬账
Docker 镜像选择是第一个分水岭。网上教程常推荐
alpine
镜像,理由很朴素:“体积小”。但我在 NUC 上实测了三组数据(使用
docker run --rm -it IMAGE sh -c 'free -m | grep Mem:'
获取内存占用,
time docker run --rm IMAGE true
测启动耗时):
| 镜像名 | 大小(MB) | 启动耗时(ms) | 运行时内存(MB) | 是否预装 bash |
|---|---|---|---|---|
python:3.11-slim
| 128 | 142 | 18.2 | ✅ |
python:3.11-alpine
| 56 | 98 | 12.7 |
❌(需
apk add bash
)
|
python:3.11
(完整版)
| 982 | 321 | 42.5 | ✅ |
结论很反直觉:
slim
版本在大小、速度、内存三项指标上全面优于
alpine
,且自带
bash
,省去额外安装步骤。
alpine
的优势仅在极端场景——比如嵌入式设备或超大规模微服务集群,对单个开发容器而言,
apk
包管理器的语法(
apk add --no-cache
)、缺少
glibc
导致某些二进制程序(如
ffmpeg
)无法运行、
musl libc
与
glibc
的兼容性问题,反而制造更多隐形成本。
所以我现在所有开发镜像都基于
*-slim
系列。以 Python 项目为例,
Dockerfile
第一行永远是:
FROM python:3.11-slim-bookworm
注意后缀
bookworm
—— 这是 Debian 12 的代号。相比老版本
bullseye
,
bookworm
默认启用
systemd
(虽在容器中不启动),且
apt
源更稳定。如果你用
ubuntu:22.04
基础镜像,虽然熟悉,但体积大、更新慢、安全补丁滞后。Debian Slim 是经过十年验证的“开发友好型”发行版,它不追求最新内核,只保证基础工具链(
gcc
,
make
,
curl
,
wget
)开箱即用。
注意:
slim镜像默认不包含vim、nano、git等开发常用工具。别急着apt update && apt install -y vim git—— 这会破坏镜像分层缓存。正确做法是在Dockerfile中集中安装:RUN apt-get update && apt-get install -y \ vim \ git \ curl \ && rm -rf /var/lib/apt/lists/*这样所有工具安装打包进同一层,后续修改代码只需重建最上层,底层系统层完全复用。
2.3 Linux 服务器配置:最小化安装 + 关键加固项
Ubuntu Server 安装时,务必勾选“OpenSSH server”,其他全部取消。不要装
ubuntu-desktop
,不要装
snapd
,不要装
lxd
。我的 NUC 服务器初始安装后,
df -h
显示根分区仅占用 1.2GB,这是健康基线。如果装完桌面环境占到 8GB 以上,说明你已经偏离了“服务器即开发机”的初衷。
安装完成后,立即执行三项加固(非安全审计,而是保障开发链路稳定):
-
禁用 IPv6(除非你明确需要)
很多 Docker 网络问题根源是 IPv6 冲突。编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX行,改为:GRUB_CMDLINE_LINUX="ipv6.disable=1"然后
sudo update-grub && sudo reboot。重启后ip a输出中不再出现inet6地址,docker network ls创建的桥接网络也更干净。 -
调整 SSH KeepAlive 参数
默认 SSH 连接空闲 5 分钟断开,VS Code Remote-SSH 会因此中断。在/etc/ssh/sshd_config末尾添加:ClientAliveInterval 60 ClientAliveCountMax 3意思是:每 60 秒发一次心跳包,连续 3 次无响应才断开。这样即使你去泡杯咖啡,VS Code 编辑器依然保持连接。
-
配置 Docker 用户组免密码
默认docker命令需sudo,但 VS Code Remote-SSH 插件执行docker build时无法弹出密码框。执行:sudo groupadd docker sudo usermod -aG docker $USER newgrp docker # 立即生效,无需登出验证:
docker run hello-world不报permission denied即成功。
这三项操作加起来不到 5 分钟,却能避免 80% 的“连接失败”、“构建失败”、“权限错误”类问题。它们不是安全银弹,而是为开发流程铺设的“无感轨道”。
3. 核心细节解析与实操要点
3.1 VS Code Remote-SSH 连接配置:从“连不上”到“秒连”的七步法
VS Code Remote-SSH 插件的配置文件
.vscode/settings.json
常被忽略,但它决定了连接质量。很多人卡在第一步:点击“Remote-SSH: Connect to Host”后,弹出空白列表,或显示
Failed to fetch remote environment
。这不是插件问题,而是 SSH 配置未被正确识别。
第一步:确认 SSH 密钥已生成且无密码
在本地 Windows 或 macOS 终端执行:
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
# 一路回车,不要设密码!否则 VS Code 无法自动加载
生成后,
cat ~/.ssh/id_ed25519.pub
复制公钥内容。
第二步:将公钥注入远程服务器
登录服务器(用密码方式),执行:
mkdir -p ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
第三步:创建精准的 SSH 配置文件
在本地
~/.ssh/config
中添加:
Host my-dev-server
HostName 192.168.1.100 # 替换为你的服务器IP
User ubuntu # 替换为你的用户名
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
关键点:
IdentitiesOnly yes
强制只用指定密钥,避免 VS Code 尝试其他密钥失败;
StrictHostKeyChecking no
省去首次连接的手动确认;
UserKnownHostsFile /dev/null
防止 known_hosts 文件过大导致解析慢。
第四步:VS Code 中手动触发连接
不要依赖自动发现。按
Ctrl+Shift+P
(Windows)或
Cmd+Shift+P
(Mac),输入
Remote-SSH: Connect to Host...
,选择
my-dev-server
。首次连接会弹出终端窗口,显示
Installing VS Code Server
进度条——这是 VS Code 在远程服务器上下载并解压一个精简版服务端,约 30MB,耗时取决于网速。
第五步:验证连接状态
连接成功后,左下角状态栏会显示
[my-dev-server]
。按
Ctrl+Shift+P
输入
Developer: Toggle Developer Tools
,在 Console 标签页搜索
remote-ssh
,应看到类似
Connected to server
日志。此时
Ctrl+P
输入
>Remote-SSH: Show Log
可查看详细连接日志。
第六步:解决“找不到文件夹”问题
连接后 VS Code 提示
The folder you opened doesn't seem to exist on the remote machine
。这是因为 VS Code 默认打开本地路径。正确操作:按
Ctrl+Shift+P
输入
Remote-SSH: Open Folder...
,然后输入远程绝对路径,如
/home/ubuntu/my-project
。
第七步:配置自动同步设置
在远程打开的 VS Code 窗口中,按
Ctrl+,
打开设置,搜索
remote.downloadExtensions
,勾选
Remote Download Extensions
。这样你在本地安装的插件(如 Python、Prettier),会自动同步到远程服务端。但注意:
不要同步
settings.json
,因为本地和远程的路径、工具链不同。在远程设置中单独配置 Python 解释器路径为
/usr/bin/python3
,而非本地的
C:\Python\python.exe
。
实操心得:如果连接卡在
Installing VS Code Server,大概率是服务器 DNS 解析失败。在服务器上执行curl -I https://update.code.visualstudio.com,若超时,则编辑/etc/resolv.conf,将nameserver改为8.8.8.8或114.114.114.114,然后sudo systemctl restart systemd-resolved。
3.2 Docker 开发环境构建:从零开始的
Dockerfile
实战模板
很多教程教你写一个“完美”的
Dockerfile
,但实际开发中,你需要的是
可快速迭代、可精准调试、可一键复现
的模板。以下是我目前主力使用的 Python 开发镜像
Dockerfile
,每一行都有明确目的:
# 1. 基础镜像:Debian Slim,稳定且轻量
FROM python:3.11-slim-bookworm
# 2. 设置工作目录,避免路径错误
WORKDIR /workspace
# 3. 创建非 root 用户,提升安全性(开发环境也需养成习惯)
RUN groupadd -g 1001 -r app && useradd -r -u 1001 -g app app
# 4. 复制依赖文件,利用 Docker 分层缓存加速构建
# 注意:requirements.txt 必须在代码之前复制,这样修改代码不触发 pip 重装
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 5. 复制源码,放在最后以最大化缓存复用
COPY . .
# 6. 切换到非 root 用户运行
USER app
# 7. 暴露开发端口(如 Flask 默认 5000)
EXPOSE 5000
# 8. 启动命令,使用 exec 形式确保 PID 1 是应用进程
CMD ["python", "app.py"]
构建命令不是
docker build -t myapp .
,而是带上下文路径的精确指令:
docker build -f ./Dockerfile -t myapp:dev .
-f
指定 Dockerfile 路径,
-t
打标签,末尾的
.
表示构建上下文为当前目录。
切记:构建上下文目录不要包含
node_modules
、
.git
、大型数据集等无关文件
,否则会拖慢构建速度。可在项目根目录创建
.dockerignore
:
.git
__pycache__
*.pyc
venv
.env
node_modules
*.log
构建完成后,不要直接
docker run
。先用
docker images
确认镜像存在,再用
docker run -it --rm myapp:dev ls -l /workspace
验证文件是否正确复制。这一步看似多余,但能提前发现
COPY
路径错误、权限问题等。
注意:
pip install一定要加--no-cache-dir。Docker 默认会缓存 pip 的 wheel 缓存,但该缓存位于/root/.cache/pip,属于中间层,不会被最终镜像包含。加上此参数后,pip 直接编译安装,避免缓存路径污染,且镜像体积更小。
3.3 VS Code 调试配置:让断点真正停在容器里
VS Code 的调试功能在远程 Docker 环境中常失效,根本原因是:
调试器进程运行在容器内,而 VS Code 客户端运行在本地,两者需通过网络端口通信
。默认配置下,容器内的
debugpy
监听
127.0.0.1:5678
,但该地址仅容器内部可达,外部无法访问。
解决方案是修改
launch.json
,强制
debugpy
监听所有接口:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Remote Docker",
"type": "python",
"request": "launch",
"module": "debugpy",
"args": [
"--listen", "0.0.0.0:5678", // 关键!监听 0.0.0.0
"--wait-for-client",
"-m", "myapp.main"
],
"justMyCode": true,
"console": "integratedTerminal",
"env": {
"PYTHONPATH": "/workspace"
}
}
]
}
同时,在
docker run
命令中映射端口:
docker run -p 5000:5000 -p 5678:5678 -v $(pwd):/workspace myapp:dev
-p 5678:5678
将容器的 5678 端口映射到宿主机,VS Code 才能连接。
但更优雅的方式是用
docker-compose.yml
统一管理:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
- "5678:5678" # 调试端口
volumes:
- .:/workspace
environment:
- PYTHONPATH=/workspace
然后
docker-compose up --build
启动。这样所有配置集中管理,团队成员拉取代码后,只需一条命令即可启动完整开发环境。
实操心得:如果断点不生效,按
Ctrl+Shift+P输入Python: Show Output,在Python输出面板中查看 debugpy 启动日志。常见错误是OSError: [Errno 98] Address already in use,说明端口被占用。此时在服务器上执行lsof -i :5678查看进程,kill -9 PID杀掉即可。
4. 实操过程与核心环节实现
4.1 从零搭建全流程:15 分钟完成个人开发环境初始化
现在,我们把前面所有知识点串成一条可执行的流水线。假设你有一台全新安装 Ubuntu Server 22.04 的服务器(IP:
192.168.1.100
),目标是让 VS Code 远程连接,并运行一个 Flask Web 应用。
Step 1:服务器初始化(2 分钟)
登录服务器,执行:
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Docker
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 添加用户到 docker 组
sudo groupadd docker
sudo usermod -aG docker ubuntu
newgrp docker
# 验证
docker run hello-world
Step 2:本地 VS Code 配置(3 分钟)
在本地电脑:
- 安装 VS Code(官网下载)
-
安装插件:
Remote-SSH、Python、Docker -
创建
~/.ssh/config,内容如前文所示 - 重启 VS Code
Step 3:创建 Flask 项目(5 分钟)
在本地新建文件夹
flask-demo
,创建以下文件:
-
app.py:from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello from Docker + Linux + VS Code!" if __name__ == '__main__': app.run(host='0.0.0.0:5000', debug=True) -
requirements.txt:Flask==2.3.3 -
Dockerfile(使用前文模板) -
.dockerignore
Step 4:远程连接与运行(5 分钟)
-
VS Code 中
Ctrl+Shift+P→Remote-SSH: Connect to Host...→ 选择my-dev-server -
连接成功后,
Ctrl+Shift+P→Remote-SSH: Open Folder...→ 输入/home/ubuntu/flask-demo -
将本地
flask-demo文件夹内容复制到远程/home/ubuntu/flask-demo(可用 VS Code 的远程文件浏览器拖拽) -
打开终端(
Ctrl+`),执行:cd /home/ubuntu/flask-demo docker build -t flask-demo:dev . docker run -p 5000:5000 flask-demo:dev -
浏览器访问
http://192.168.1.100:5000,看到Hello from Docker + Linux + VS Code!
整个流程严格计时 15 分钟。其中最耗时的是
docker build
(首次拉取基础镜像),后续修改代码只需
docker build
重建最上层,秒级完成。
4.2 Docker 镜像分层原理与缓存复用技巧
Docker 镜像不是单个文件,而是由多个只读层(Layer)叠加而成。理解分层机制,是写出高效
Dockerfile
的前提。以我们的
Dockerfile
为例:
FROM python:3.11-slim-bookworm # Layer 1: 基础镜像(约 128MB)
WORKDIR /workspace # Layer 2: 创建目录(几 KB)
RUN groupadd ... && useradd ... # Layer 3: 创建用户(几十 KB)
COPY requirements.txt ./ # Layer 4: 复制依赖文件(几 KB)
RUN pip install ... # Layer 5: 安装依赖(约 50MB,关键缓存层)
COPY . . # Layer 6: 复制源码(大小不定)
USER app # Layer 7: 切换用户(几 KB)
EXPOSE 5000 # Layer 8: 暴露端口(几 KB)
CMD [...] # Layer 9: 启动命令(几 KB)
Docker 构建时,会逐行执行指令,并为每条指令生成一个层。
只有当某条指令及其之前所有指令的输入完全相同时,该层才能被缓存复用
。这就是为什么要把
COPY requirements.txt
放在
COPY .
之前——因为
requirements.txt
修改频率远低于源码,把它提前,就能让
pip install
层长期命中缓存。
验证缓存是否生效:执行
docker build
时,观察输出。如果某行显示
Using cache
,说明该层复用成功:
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 376B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.11-slim-bookworm 1.2s
=> [1/9] FROM docker.io/library/python:3.11-slim-bookworm@sha256:... 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 1.23kB 0.0s
=> CACHED [2/9] WORKDIR /workspace 0.0s
=> CACHED [3/9] RUN groupadd -g 1001 -r app && useradd -r -u 1001 -g app app 0.0s
=> CACHED [4/9] COPY requirements.txt ./ 0.0s
=> CACHED [5/9] RUN pip install --no-cache-dir -r requirements.txt 0.0s
=> [6/9] COPY . . 0.0s
=> [7/9] USER app 0.0s
=> [8/9] EXPOSE 5000 0.0s
=> [9/9] CMD ["python", "app.py"] 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:... 0.0s
=> => naming to docker.io/library/flask-demo:dev 0.0s
看到
CACHED
占多数,说明构建高效。如果全是
fresh
,说明每次都在重新安装依赖,这是性能杀手。
实操心得:
RUN指令尽量合并。比如RUN apt update && apt install -y vim git是好习惯,而RUN apt update和RUN apt install -y vim分两行写,会导致第一行的apt update缓存无效(因为apt update生成的索引文件在第二行被覆盖)。同样,pip install也应一次性安装所有依赖,避免多次调用。
4.3 VS Code Remote-SSH 性能优化:告别“卡顿如幻灯片”
VS Code Remote-SSH 在大项目中常出现卡顿,表现为:文件浏览器展开慢、代码高亮延迟、Git 状态刷新慢。这不是网络问题,而是 VS Code 默认的文件监听策略在远程场景下失效。
根本解法是关闭远程文件系统的实时监听,改用按需同步:
-
在远程 VS Code 窗口中,按
Ctrl+,打开设置 -
搜索
remote.extensionKind -
找到
Remote - SSH扩展,点击右侧齿轮图标 →Extension Settings -
将
Remote Extension Kind从["ui", "workspace"]改为["ui"] - 重启 VS Code 窗口
此举含义是: 只在本地运行 VS Code 的 UI 相关扩展(如主题、快捷键),所有 Workspace 级扩展(如 Python 语言服务、Git 集成)均在远程服务器上运行 。这样,代码分析、语法检查、Git diff 计算全部发生在服务器端,本地只负责渲染结果,网络传输量锐减 90%。
另一个关键设置是禁用远程文件监视:
-
在远程设置中,搜索
files.watcherExclude -
添加模式:
这些目录通常包含大量小文件,VS Code 默认会为每个文件创建 inotify 监听器,远程服务器资源有限,极易耗尽 inotify 句柄。禁用后,文件变更需手动"**/node_modules/**": true, "**/bower_components/**": true, "**/dist/**": true, "**/build/**": true, "**/__pycache__/**": trueCtrl+R刷新,但换来的是整体流畅度质的飞跃。
提示:如果项目含大量
.py文件,Python 扩展的python.defaultInterpreterPath必须指向容器内路径,如/usr/local/bin/python。否则语言服务无法启动,导致无代码补全、无类型提示。在远程设置中配置此项,而非本地设置。
5. 常见问题与排查技巧实录
5.1 连接类问题速查表
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
VS Code 提示
Could not establish connection to "my-dev-server"
| SSH 服务未运行 |
sudo systemctl status ssh
|
sudo systemctl start ssh
|
连接后文件浏览器为空,或提示
No such file or directory
| 远程路径不存在或权限不足 |
ls -ld /home/ubuntu/my-project
|
mkdir -p /home/ubuntu/my-project && chmod 755 /home/ubuntu/my-project
|
| 连接成功但终端无法输入,光标闪烁不动 | TTY 分配失败 |
ssh -t ubuntu@192.168.1.100 'whoami'
|
在
~/.ssh/config
中添加
RequestTTY yes
|
docker
命令提示
permission denied
| 用户未加入 docker 组 |
groups
|
sudo usermod -aG docker $USER && newgrp docker
|
docker run
报错
port is already allocated
| 端口被其他进程占用 |
sudo lsof -i :5000
|
sudo kill -9 <PID>
|
独家避坑技巧 :当 VS Code Remote-SSH 连接异常时,不要盲目重装插件。先在本地终端执行:
ssh -v -F ~/.ssh/config my-dev-server
-v
参数输出详细连接日志,能看到认证方式(publickey)、密钥路径、是否跳过 known_hosts 检查等。90% 的连接问题,日志里第一行就暴露了原因。
5.2 Docker 构建与运行类问题
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
docker build
卡在
Sending build context to Docker daemon
| 构建上下文过大 |
du -sh .
|
检查
.dockerignore
,删除
node_modules
等
|
pip install
报错
Connection refused
| 服务器 DNS 或代理问题 |
docker run --rm python:3.11-slim ping -c 3 pypi.org
|
在
Dockerfile
中添加
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
| 容器启动后立即退出 |
CMD
或
ENTRYPOINT
命令执行完即退出
|
docker logs <container_id>
|
使用
tail -f /dev/null
作为临时 CMD,再 exec 进入调试
|
docker run -p 5000:5000
后本地无法访问
| 防火墙拦截 |
sudo ufw status
|
sudo ufw allow 5000
或
sudo ufw disable
|
docker-compose up
报错
ERROR: Service 'web' failed to build
|
Dockerfile
路径错误
|
ls -l ./Dockerfile
|
确保
docker-compose.yml
中
build:
指向正确路径
|
实测经验
:
docker build
过程中,如果网络不稳定,
pip install
可能中途失败。不要
Ctrl+C
中断后重试——这会破坏分层缓存。正确做法是:在
Dockerfile
中为
pip install
加上重试逻辑:
RUN pip install --no-cache-dir --retries 5 --timeout 60 -r requirements.txt
--retries 5
表示失败后重试 5 次,
--timeout 60
设置单次请求超时 60 秒,大幅提升构建鲁棒性。
5.3 VS Code 调试与编辑类问题
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
断点灰色,提示
Unverified breakpoint
|
launch.json
中 `
|
更多推荐

所有评论(0)