Skip to content

Instantly share code, notes, and snippets.

@jschwinger233
Last active March 31, 2020 03:41
Show Gist options
  • Save jschwinger233/c280bf036329daa0204b8d2357b5dcd7 to your computer and use it in GitHub Desktop.
Save jschwinger233/c280bf036329daa0204b8d2357b5dcd7 to your computer and use it in GitHub Desktop.

同事说, 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问题".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment