none:什麼都沒有的網絡,挂在這個網絡下的容器除了lo,沒有其他任何網卡,容器建立時,可以通過--network=none指定使用none網絡。
host:容器的網絡配置與host完全一樣。可以通過--network=host指定使用host網絡。host的網絡性能很好,但容易産生端口沖突。
bridge: bridge網絡是用的最廣的網絡,也是預設的網絡,Docker有一個名為docker0的 linux bridge,如果不指定--network,建立的容器預設都會挂到docker0上。每建立一個容器,就會建立一個veth pair,一端連接配接在docker0,另一端連接配接在容器網卡,bridge的端口是私有的,不會占用host端口,如果需要通路則需要通過-p或-P做端口映射。
自定義網絡:指定驅動,名稱,cidr等可以建立自定義網絡,建立完成後,ifconfig會多一個網卡,新建立的網絡和docker0類似,可以像使用docker0一樣使用它。建立容器時需要指定網絡--network,指定好後建立的容器就會挂在這個網絡下,
網絡隔離
docker依賴iptables來隔離不同的容器網絡,通過iptables-save檢視
兩個網絡的通信被drop掉了,如果希望建在這兩個網絡上的容器可以通信,則需要在一個容器内添加一個網卡:
外部網絡
我們知道,在bridge網絡下,容器通過docker0或自定義網絡來完成互動,通路外網統一需要如此,看下iptables配置:
這個配置的含義是來着docker0或rhj_test網段的資料報會被docker0或rhj_test轉發到MASQUERADE,MASQUERADE可以完成位址僞裝,MASQUERADE從伺服器的網卡上,自動擷取目前ip位址,将包的源位址替換成host的位址發送出去,完成NAT。
外部網絡通路容器資料包方向相反,每一個映射的端口,host都會啟動一個docker-proxy程序來處理通路容器的流量,docker-proxy會将我們在端口映射時做的配置做映射,當外部以這個ip和端口通路時,會被轉發到docker0網絡,再發給容器本身。