假設存在一個容器,提供的服務是 HTTP 或者 RPC 的服務。因爲出於簡單可維護的目的,這個容器的基礎鏡像裏面沒有帶上任何和網絡抓包相關的功能。那麼如何能搞對這樣的容器進行抓包,以分析業務上面可能存在的問題呢?git
Docker 的容器之間能夠經過共享網絡空間的方式,來讓多個容器實現網絡互通。這個意思直接一點就是若是你到每一個容器內部去訪問 localhost 監聽的服務,不管這個服務在哪一個容器裏面,都可以訪問成功。這就爲網絡抓包提供了基礎。github
咱們能夠使用一個專用的 tcpdump 的鏡像來進行抓包。鏡像名稱爲 corfr/tcpdump:latest ,能夠使用 docker pull 直接下載。docker
$ docker pull corfr/tcpdump:latest
咱們如今用一個提供簡單 HTTP 服務的鏡像來進行測試。網絡
下載測試鏡像app
$ docker pull jemygraw/echo-go:1.0
啓動測試容器tcp
$ docker run -p 8080:8080 jemygraw/echo-go:1.0 /home/app/echo-go -port 8080
查看測試容器ID測試
$ docker ps 5de30e950459 jemygraw/echo-go:1.0 "/home/app/echo-go -…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp dreamy_benz
啓動抓包鏡像,注意使用 --network
參數來共享測試容器的網絡。插件
$ docker run --network container:5de30e950459 corfr/tcpdump:latest -i any -U -w -
因爲 corfr/tcpdump:latest
鏡像構建的時候使用了 ENTRYPOINT
指定了入口命令爲 /usr/sbin/tcpdump
,因此這裏咱們指定命令的選項參數便可。code
這個時候咱們能夠嘗試訪問 http://localhost:8080/
就可以在抓包容器的輸出中看到抓包結果了。get
Kubernetes 的插件命令 sniff 就是使用了上面的技術來實現特權模式下經過旁觀的抓包容器共享目標容器的網絡來實現抓包的。該項目地址在:https://github.com/eldadru/ksniff ,有興趣能夠研究。