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