社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker 容器抓包

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

背景介绍


程序在运行期间出现问题时,通常会通过抓包的方式来分析、定位问题。非容器应用一般可以通过 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