❧ Docker远程连接(SSH方式)
一、核心原理
Docker 远程连接本质是通过 SSH 通道转发 Docker CLI 指令:
Docker CLI → SSH → 远程 Docker EngineDocker 不直接连服务器,而是依赖 SSH 通道与远程 Engine 通信。
二、前置条件
远程机器必须满足以下条件:
1、Docker 已安装并运行
docker version执行后必须能同时看到 Client 和 Server 两段信息。
2、SSH 已可用
ssh user@ip能正常登录即可。
3、配置 SSH Key(推荐免密登录)
见下方第三节。
三、SSH Key 配置
1、本机生成密钥对
ssh-keygen -t ed255192、查看公钥内容
cat ~/.ssh/id_ed25519.pub3、将公钥写入远程机器
mkdir ~/.sshnano ~/.ssh/authorized_keys将上一步输出的公钥内容粘贴进去并保存。
4、Windows 远程机必须修复权限(否则 SSH 拒绝读取)
icacls $env:USERPROFILE\.ssh /inheritance:ricacls $env:USERPROFILE\.ssh /grant:r "$env:USERNAME:(F)"icacls $env:USERPROFILE\.ssh\authorized_keys /inheritance:r四、Docker 远程连接(核心步骤)
1、创建 Docker Context(SSH 方式)
docker context create remote-docker \ --docker "host=ssh://user@192.168.191.62"2、查看所有 Context
docker context ls3、切换到远程 Context
docker context use remote-docker4、测试连接
docker ps能正常返回容器列表即表示连接成功。
五、常见问题与解决
问题一:仍然走 TCP 2375 端口
原因: 环境变量 DOCKER_HOST 被设置为 tcp://...,优先级高于 context。
解决:
# PowerShell 中删除该环境变量Remove-Item Env:DOCKER_HOST问题二:connection forcibly closed
可能原因:
- SSH 能登录,但远程 Docker Desktop 未启动
- 防火墙拦截了 Docker Socket
排查步骤:
- 确认远程机器 Docker Desktop 已运行
- 检查防火墙是否放行
问题三:切换 context 后不生效
执行以下命令确认当前活跃的 context 旁边有 * 标记:
docker context ls输出示例:
NAME ... CURRENTremote-docker ... *六、VSCode Docker 插件配置
方式一:settings.json
{ "docker.context": "remote-docker"}方式二:GUI 操作
Settings → Docker → Context → remote-docker七、验证是否成功
CLI 验证
docker psdocker infoVSCode Docker 面板
打开 Docker 插件侧边栏,能正常显示远程机器的:
- Containers
- Images
- Volumes
即表示连接成功。
八、最终效果
配置完成后,本机所有 Docker 命令都将在远程机器上执行:
docker psdocker logs <container>docker exec -it <container> bashdocker compose up -d以上命令均运行在 192.168.191.62 的 Docker Engine 上。
九、最佳实践
| 方式 | 推荐程度 | 说明 |
|---|---|---|
Docker Context + SSH | ✅ 推荐 | 安全、稳定,与 VSCode 兼容 |
DOCKER_HOST=tcp://2375 | ❌ 不推荐 | 不安全、不稳定,Windows 易断开,VSCode 不兼容 |
十、进阶方向(可选)
- 多服务器 context 管理,按 dev / prod 切换
- VSCode Remote SSH + Docker 联合使用
- Docker Compose 直接远程部署
- CI/CD 流程中远程 build 镜像