在使用Docker時,可能會有人發(fā)現(xiàn)在容器中無法使用網(wǎng)絡(luò)路由。這是因為Docker默認(rèn)情況下不允許容器中執(zhí)行路由操作。
$ docker run -it --rm --cap-add=NET_ADMIN ubuntu bash root@8c232515c8e6:/# ip route add 172.16.0.0/24 via 192.168.0.2 RTNETLINK answers: Operation not permitted
上面的命令試圖在容器中添加路由,但是卻返回了“Operation not permitted”的錯誤。
但是,需要注意的是,Docker容器中并不完全沒有路由能力。容器內(nèi)部可以使用基于虛擬網(wǎng)橋的網(wǎng)絡(luò),也可以連接到宿主機(jī)網(wǎng)絡(luò)的子網(wǎng)中。
$ docker run -it --rm busybox ifconfig eth0 eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:02 inet addr:10.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:258 (258.0 B) TX bytes:118 (118.0 B)
上面的命令可以查看容器中的網(wǎng)絡(luò)接口。
如果需要在容器中執(zhí)行路由操作,可以通過啟用容器的NET_ADMIN(網(wǎng)絡(luò)管理員)能力來實現(xiàn)。
$ docker run -it --rm --cap-add=NET_ADMIN busybox ip route add 172.16.0.0/24 via 10.0.0.1
上面的命令在啟動容器時添加了NET_ADMIN權(quán)限,并且在容器中添加了一條路由,成功了!
總之,Docker中的路由是需要特殊權(quán)限才能執(zhí)行的操作,要注意使用。