背景介紹
程序在運行期間出現問題時,通常會通過抓包的方式來分析、定位問題。非容器應用一般可以通過?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 及相關提示信息。
參考總結
以上就是本文希望分享的內容,如果大家有什么問題,歡迎在公眾號 - 跬步之巔留言交流。
原創不易,覺得不錯還請一鍵三連,您的支持是我持續輸出的最大動力。