同事说, curl -v http://10.22.12.87:2376/version 返回 400, 问我怎么用 curl 访问 dockerd.
我的思路是先想办法通过 sdk 访问 version api, 然后 tcpdump 观察一下 url 就可以了, 所以:
pip install docker
, python repl 里docker.from_env().version()
tcpdump -i any port 2376
却什么都看不到, 怀疑from_env()
走的 unix socketlsof -p
+ss -xp
果然是在的 unix socket, 那我抓个 unix socket 的包吧socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
, 然后 python repl 里docker.DockerClient(base_url='tcp://localhost:2375').version()
- 这次可以抓到包了, 一个简单的 GET HTTP, curl 却发现报错说没有证书
- 没证书会返回 400? 我自己手动试了一次
curl -v http://10.22.12.87:2376/version
, 发现并没有 400, 而是直接说Client sent an HTTP request to an HTTPS server.
curl --key /etc/docker/tls/server.key --cert /etc/docker/tls/server.crt --cacert /etc/docker/tls/ca.crt https://10.22.12.87:2376/version
搞定
气坏我了, 已经不是一次两次被同事的错误结论误导了, 明明报错很清楚地说了是没有证书, 给我报错就成 400 了, 我也傻逼到相信了同事的诊断.
光是最近两个月这类的事情都有好几次:
- 明明不是 host 网络, 信誓旦旦给我说是 host, 结果他妈根本不是, 浪费了我好多时间
- 自做聪明报告自己的诊断结果"在xxx时会没有xxx", 结果果然是错的, 配都配错了
再往前就更多了, 自己的服务挂了都搞不清楚的, 自己的 gateway 有没有转发都不清楚最后还是让我查出来的, 简直就是灾难.
我所能学到的唯一教训, 就是不相信同事, 他们说得任何诊断结果, 我都要亲自确认, 并且询问他们的 "X问题" 而不是 "Y问题".