Docker容器網路-實現篇
阿新 • • 發佈:2020-08-09
> 通常,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