2014-07-07 35 views
29

我試圖瞭解發生了什麼事情下的網絡數據包來自連接到主機的線路,並指向Docker容器內的應用程序。如果它是一個典型的虛擬機,我知道到達主機的數據包將被虛擬機管理程序(比如VMware,VBox等)發送到虛擬機的虛擬網卡,然後通過TCP/IP協議棧的客戶操作系統,最終到達應用程序。碼頭集裝箱是否有自己的TCP/IP堆棧?

在泊塢的情況下,我知道在主機上到來的分組被從主機的網絡接口轉發到docker0橋,被連接到一個veth對容器內的虛擬接口eth0上結束。但之後呢?由於所有Docker容器都使用主機內核,因此推測數據包由主機內核的TCP/IP堆棧處理是否正確?如果是這樣,怎麼樣?

我真的很想閱讀詳細的解釋(或者如果你知道一個資源可以隨意鏈接它)關於真正發生的事情。我已經仔細閱讀this頁面,但它並沒有說明一切。

在此先感謝您的答覆。

+1

是的,使用主機TCP/IP堆棧。閱讀完鏈接的頁面後,除了閱讀linux內核和docker源代碼之外,很難添加更多內容 - 您是否有任何具體問題? – nos

+0

感謝您的評論。那麼,例如,我不清楚數據是如何從主機的docker0橋傳輸到eth0的:我嘗試使用wireshark,但是我只能看到從docker0交換的數據包和' vethXYZ';我還認爲'docker0'和'eth0'之間有一個NAT,因爲地址有變化,但是我沒有找到關於它的文檔。 –

+0

對,其中大部分內容,包括docker使用的NAT規則都在該文檔中進行了解釋。 – nos

回答

9

在「代碼」中,網絡堆棧絕對不在容器中,它的內核中只有一個由主機和所有容器共享(您已經知道這一點)。每個容器都有自己獨立的網絡命名空間,這意味着它有自己的網絡接口和路由表。

這裏是一個簡短的文章介紹一些例子的概念:http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ ,我發現這篇文章也有幫助: http://containerops.org/2013/11/19/lxc-networking/

我希望這給你足夠的指針進行深入分析。