🚀 从 Windows 远程连接 Linux Docker Daemon 全过程实录
🧭 背景
在本地开发中,我们常常使用 Docker Desktop for Windows 来运行容器。
但在一些场景下,我们希望:
- 将 Docker 服务部署在远程 Linux 主机(如虚拟机、云服务器等);
- 从 Windows 客户端(CMD/PowerShell) 直接控制远程 Docker 实例。
这就需要通过 TCP Socket 远程访问 Docker Daemon(2375 端口) 。
🧩 一、Linux 端配置
1️⃣ 编辑 Docker 服务配置文件
Docker 默认只监听本地 UNIX Socket /var/run/docker.sock,
需要通过 systemd 添加 TCP 监听端口。
执行:
sudo systemctl edit docker.service
这会创建一个 override 文件(路径通常为):
/etc/systemd/system/docker.service.d/override.conf
在文件中写入:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
✅ 注意:
- 第一行
ExecStart=是用来清空原有的启动命令,否则会报错。- 第二行才是新的启动参数,开放本地 fd:// 与远程 2375。
2️⃣ 重载并重启 Docker 服务
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
3️⃣ 验证是否成功监听 2375 端口
sudo ss -lntp | grep 2375
输出应类似:
LISTEN 0 128 0.0.0.0:2375 *:* users:(("dockerd",pid=1234,fd=3))
4️⃣ 检查防火墙或云安全组
确保 2375 端口对外开放。
如果是虚拟机(如 VMware / VirtualBox),需要:
- 网络模式改为 桥接模式(Bridged Adapter) ;
- 保证宿主机(Windows)能直接访问虚拟机 IP。
💻 二、Windows 端连接
⚠️ PowerShell 与 CMD 的区别
❌ 错误写法(PowerShell中无效)
set DOCKER_HOST=tcp://192.168.247.130:2375
PowerShell 不识别 set,此命令只在 CMD 中有效。
✅ 正确写法(PowerShell)
$env:DOCKER_HOST = "tcp://192.168.247.130:2375"
docker ps
✅ CMD 版本写法
set DOCKER_HOST=tcp://192.168.247.130:2375
docker ps
🧩 检查网络连通性(可选)
Test-NetConnection 192.168.247.130 -Port 2375
若输出 TcpTestSucceeded : True,说明网络连通。
🚀 测试连接
执行:
docker ps
若能看到远程容器列表,说明连接成功 ✅
🌍 永久设置(可选)
让 Windows 每次启动都能连接远程 Docker:
setx DOCKER_HOST "tcp://192.168.247.130:2375"
重新打开 CMD 或 PowerShell 即可生效。
⚙️ 三、常见问题与排查记录
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
The system cannot find the file specified | PowerShell中使用了 set 导致变量未生效 | 改用 $env:DOCKER_HOST=... |
Cannot connect to the Docker daemon | Linux 端未开放 2375 或防火墙拦截 | 检查 ss -lntp 输出和防火墙规则 |
override.conf 文件保存时文件名奇怪(如 .##override.confxxxx) | 正在编辑时的临时文件,正常现象 | 不用理会,保存退出后 systemd 会生成正式文件 |
docker ps 卡死或超时 | 网络不通、虚拟机网卡非桥接模式 | 修改 VM 网络为桥接模式,重启 Docker |
| Linux 端配置无效 | 未执行 daemon-reload | 必须执行 sudo systemctl daemon-reload |
🧠 四、技术要点总结
-
systemd override 机制
/etc/systemd/system/docker.service.d/override.conf可以重定义默认启动参数,而无需修改主配置文件。ExecStart=用于清空原参数,必须成对出现。
-
Docker 多监听端口机制
-H fd://:保留本地 socket(供本机 CLI 使用)-H tcp://0.0.0.0:2375:开启远程访问。
-
2375 端口风险提示
- 该端口默认不安全(未启用 TLS 认证)。
- 如果是公网服务器,必须通过防火墙或 SSH 隧道限制访问。
-
PowerShell 环境变量机制
- 临时变量:
$env:DOCKER_HOST="tcp://..." - 永久变量:
setx DOCKER_HOST "tcp://..."
- 临时变量:
-
虚拟机网络配置
- 桥接模式能让宿主机与虚拟机互通;
- NAT 模式则需端口转发。
🧾 五、最终验证成果
在 Windows CMD 中执行:
set DOCKER_HOST=tcp://192.168.247.130:2375
docker ps
成功输出来自 Linux 主机的容器列表 ✅
远程 Docker 环境连接成功 🎉
📚 六、可扩展方向
-
使用 TLS 认证 安全地远程访问 Docker(
tcp://0.0.0.0:2376) -
通过 Docker Context 管理多个远程主机:
docker context create remote-linux --docker "host=tcp://192.168.247.130:2375" docker context use remote-linux docker ps