如何通过SSH使用Docker Socket 解决无法连接Docker守护进程报错
可以通过SSH隧道安全访问远程Docker Socket
你遇到的报错是Unix域套接字的设计限制导致的,unix:///var/run/docker.sock只能在同一台机器的内核空间内通信,无法直接跨机器调用,按以下步骤配置即可正常使用:
前置检查(远程Ubuntu机器侧)
- 确认Docker daemon正常运行,执行命令
systemctl is-active docker返回active即为正常,如果服务未启动执行sudo systemctl start docker - 确认你用于SSH连接的账号已经加入docker用户组,避免需要root权限才能操作socket:
执行后重新登录远程SSH生效。sudo usermod -aG docker 你的SSH登录用户名 - 确认两台机器之间SSH 22端口网络互通,没有被防火墙、安全组拦截。
配置方式
方式1:Docker原生SSH协议访问(推荐,Docker 18.09+版本支持)
Docker客户端从18.09版本开始原生支持通过SSH协议调用远程Docker daemon,不需要手动做端口映射,也不需要暴露Docker的TCP监听端口,安全性最高。
在Jenkins master侧直接配置DOCKER_HOST环境变量即可:
export DOCKER_HOST=ssh://<SSH用户名>@<远程Ubuntu机器IP/域名>
如果需要免密执行,提前把Jenkins运行账号的SSH公钥添加到远程Ubuntu机器对应用户的~/.ssh/authorized_keys文件中即可。配置完成后直接执行docker ps等命令就可以操作远程Docker服务。
方式2:手动SSH端口转发适配低版本Docker
如果你的Docker版本低于18.09,可以通过SSH隧道把远程的Docker socket映射到本地的Unix套接字:
- 执行SSH命令建立隧道,保持会话存活:
ssh -nNT -L /本地自定义路径/docker.sock:/var/run/docker.sock <SSH用户名>@<远程Ubuntu机器IP/域名> - 新开终端配置本地Docker客户端指向映射的本地socket:
export DOCKER_HOST=unix:///本地自定义路径/docker.sock
常见问题排查
- 依旧提示无法连接daemon:先直接登录远程Ubuntu机器执行
docker ps确认远程Docker本身运行正常,再检查SSH连接是否存活 - 权限报错:确认远程SSH用户已经加入docker用户组,本地映射的socket文件权限对Jenkins运行账号开放
- 连接超时:检查两台机器之间22端口是否连通,远程机器的
sshd服务是否正常运行
内容的提问来源于stack exchange,提问作者Johnny Bravo
相关产品推荐
相关产品推荐

