Windows系统下如何让swipely/docker-api连接本地Docker守护进程?
Ruby脚本调用Docker.version挂起的问题排查
先说说我的环境背景:
- 系统:Windows 10专业版64位
- Ruby版本:Ruby 1.9.3p545 (2014-02-24) [i386-mingw32]
- Docker状态:通过Docker安装的docker.exe客户端,在运行Ruby和脚本的同一Shell里,能正常连接
DOCKER_HOST=tcp://localhost:2375并执行Docker命令
当前我的脚本内容如下:
require 'docker' Docker.url='tcp://localhost:2375' # 我也尝试过http://localhost:2375 # 结果相同 Docker.options={} vers = Docker.version # 此处执行时会挂起
结合这个情况,我整理了几个排查方向,你可以试试:
先排查docker gem的版本兼容性:Ruby 1.9.3是比较老旧的版本了,现在很多新的docker gem版本已经不再支持它。你可以先执行
gem list docker看看当前安装的gem版本,如果是较新的版本,建议降级到适配Ruby 1.9.3的版本——比如早期的docker-api gem(注意原先的docker gem后来改名为docker-api),1.34.x系列的版本对老Ruby支持更友好。用原生HTTP请求测试API连通性:咱们绕开docker gem,直接用Ruby的Net::HTTP发请求测试Docker API,看看能不能拿到响应,这样能区分是gem的问题还是网络问题。写个简单的测试脚本:
require 'net/http' uri = URI('http://localhost:2375/version') response = Net::HTTP.get_response(uri) puts response.body
如果这个脚本能正常返回版本信息,那基本就是docker gem和Ruby 1.9.3的兼容性问题;如果这个也挂起,再去检查Windows防火墙是不是拦截了localhost:2375的请求(不过你用docker.exe能连,大概率不是这个问题)。
- 检查并禁用代理设置:有时候Ruby会自动继承系统的代理配置,导致请求被卡住。你可以在脚本里加上禁用代理的配置试试:
# 给docker gem设置禁用代理 Docker.options[:proxy] = false # 或者直接清空环境变量里的代理设置 ENV['http_proxy'] = nil ENV['https_proxy'] = nil
- 开启调试日志定位卡点:给docker gem开启调试模式,看看请求的具体流程,到底是没发出去还是卡在等待响应。在脚本开头加上:
require 'logger' Docker.logger = Logger.new(STDOUT) Docker.logger.level = Logger::DEBUG
运行脚本后,通过输出的调试日志,就能清楚看到请求的每一步,帮你快速定位问题所在。
内容的提问来源于stack exchange,提问作者peterk
相关产品推荐
相关产品推荐

