Py学习  »  docker

Docker 容器抓包

dotNET跨平台 • 4 年前 • 550 次点击  

背景介绍


程序在运行期间出现问题时,通常会通过抓包的方式来分析、定位问题。非容器应用一般可以通过 fiddlerwireshark 等工具进行抓包,那么,运行在容器的应用一般通过什么方式进行抓包呢?


器应用一般可以通过 tcpdumpngrep 等兼容 Linux 的命令行工具进行抓包,如果只对 http 进行抓包,可以简单使用 ngrep 。以下将介绍如何使用 ngrep 对容器进行抓包。



案例演示


我们使用 nginx 的镜像启动两个容器 http-serverhttp-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/repositories
apk updateapk add ngrep
docker exec -it http-client sh
# 修改源sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
apk updateapk add ngrep


由于本文示例使用的是 alpine 的操作系统,所以上述指令只针对 alpine,其它操作系统请参考:

# ubuntu or debian# sed -i 's|https\?://[^/]\+/|http://mirrors.aliyun.com/|' /etc/apt/sources.listapt-get update -yapt-get install ngrep -y
# centos 7# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum update -yyum 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\"}"



从上图可以看出客户端和服务端的抓包内容是相同的,都是 个包:


第一个是从客户端(172.17.0.3:44076)发送给服务端(172.17.0.2:80)的包,请求方式为 POST,请求地址是 /请求体内容是  {"name":"string","body":"string"}


第二个是服务端回给客户端的包,返回状态码 405 及相关提示信息



参考总结


以上就是本文希望分享的内容,如果大家有什么问题,欢迎在公众号 - 跬步之巅留言交流。


原创不易,觉得不错还请一键三连,您的支持是我持续输出的最大动力。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/135623