1. 程式人生 > >Docker容器網路-實現篇

Docker容器網路-實現篇

> 通常,Linux容器的網路是被隔離在它自己的Network Namespace中,其中就包括:網絡卡(Network Interface)、迴環裝置(Loopback Device)、路由表(Routing Table)和iptables規則。對於一個程序來說,這些要素,就構成了它發起和響應網路請求的基本環境。 前文說到容器網路對Linux虛擬化技術的依賴,這一篇章我們將一探究竟,看看Docker究竟是怎麼做的。 # 管中窺豹 我們在執行 `docker run -d --name xxx `  之後,進入容器內部: ```shell ## docker ps 可檢視所有docker ## 進入容器 docker exec -it 228ae947b20e /bin/bash ``` 並執行 `ifconfig` : ```shell $ ifconfig eth0 Link encap:Ethernet HWaddr 22:A4:C8:79:DD:1A inet addr:192.168.65.28 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1440 Metric:1 RX packets:2231528 errors:0 dropped:0 overruns:0 frame:0 TX packets:3340914 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:249385222 (237.8 MiB) TX bytes:590701793 (563.3 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) ``` 我們看到一張叫eth0的網絡卡,它正是一個Veth Pair裝置在容器的這一端。 我們再通過 `route` 檢視該容器的路由表: ```shell $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 169.254.1.1 0.0.0.0 UG 0 0 0 eth0 169.254.1.1 * 255.255.255.255 UH 0 0 0 eth0 ``` 我們可以看到這個eth0是這個容器的預設路由裝置。我們也可以通過第二條路由規則,看到所有對 169.254.1.1/16 網段的請求都會交由eth0來處理。 而Veth Pair 裝置的另一端,則在宿主機上,我們同樣也可以通過檢視宿主機的網路裝置來檢視它: ```shell $ ifconfig ...... eth0: fl