背景介绍
程序在运行期间出现问题时,通常会通过抓包的方式来分析、定位问题。非容器应用一般可以通过 fiddler、wireshark 等工具进行抓包,那么,运行在容器的应用一般通过什么方式进行抓包呢?
容器应用一般可以通过 tcpdump、ngrep 等兼容 Linux 的命令行工具进行抓包,如果只对 http 进行抓包,可以简单使用 ngrep。以下将介绍如何使用 ngrep 对容器进行抓包。
案例演示
我们使用 nginx 的镜像启动两个容器 http-server,http-client 分别代表服务端和客户端,同时对服务端和客户端进行抓包进行分析。
启动 http-server
docker run --name http-server -d nginx:alpine
启动 http-client
docker run --name http-client --link http-server:http-server -d nginx:alpine
安装 ngrep
docker exec -it http-server sh# 修改源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesapk update
apk add ngrepdocker exec -it http-client sh# 修改源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesapk update
apk add ngrep
由于本文示例使用的是 alpine 的操作系统,所以上述指令只针对 alpine,其它操作系统请参考:
# ubuntu or debian
# sed -i 's|https\?://[^/]\+/|http://mirrors.aliyun.com/|' /etc/apt/sources.list
apt-get update -y
apt-get install ngrep -y# centos 7
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum update -y
yum install ngrep -y
启动 ngrep
启动 ngrep 并监听 80 端口:
ngrep port 80
GET 请求抓包分析
curl http://http-server/?name=ErikXu
从上图可以看出客户端和服务端的抓包内容是相同的,都是 3 个包:
第一个是从客户端(172.17.0.3:44076)发送给服务端(172.17.0.2:80)的包,请求方式为 GET,请求地址是 /?name=ErikXu。
第二个是服务端回给客户端的包,返回状态码 200。
第三个也是服务端回给客户端的包,返回 html 的内容。
POST 请求抓包分析
curl -X POST "http://http-server" -H "accept: */*" -H "Content-Type: application/json" -d "{\"name\":\"string\",\"body\":\"string\"}"
从上图可以看出客户端和服务端的抓包内容是相同的,都是 2 个包:
第一个是从客户端(172.17.0.3:44076)发送给服务端(172.17.0.2:80)的包,请求方式为 POST,请求地址是 /,请求体内容是 {"name":"string","body":"string"}。
第二个是服务端回给客户端的包,返回状态码 405 及相关提示信息。
参考总结
以上就是本文希望分享的内容,如果大家有什么问题,欢迎在公众号 - 跬步之巅留言交流。
原创不易,觉得不错还请一键三连,您的支持是我持续输出的最大动力。