Docker的网络类型及驱动器
計算機如果不能夠聯網,其價值就要大打折扣。類似的,一個Docker容器也需要通過網絡訪問其他資源,或者被其他資源訪問。這就涉及到Docker容器實例的網絡,也與Docker宿主機的網絡息息相關。
總的來說,Docker的網絡是一個通過多種網絡驅動器(driver)實現的Docker子系統。根據網絡驅動器的不同,Docker提供了不同特性的網絡,Docker容器實例也因加入不同的網絡而具有不同的網絡訪問特性。
目前(Docker v18.03),Docker Engine內置支持如下幾種類型的網絡。
- host類型的網絡
- bridge類型的網絡
- overlay類型的網絡
- macvlan類型的網絡
- none類型的網絡
Docker Engine啟動時,即默認創建如下三個網絡。
[root@myhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE bc096d60cb79 bridge bridge local ba805516b064 host host local 5a9904b67539 none null local- bridge網絡,該網絡的名字為bridge,bridge類型的網絡
- host網絡,該網絡的名字為host,host類型的網絡
- none網絡,該網絡的名字為none,none類型的網絡
1. host網絡
host網絡就是Docker宿主機的網絡,是Docker Engine啟動即默認創建的網絡之一。host網絡的網絡驅動器為host,即創建網絡時,使用-d=host表示創建的是host類型的網絡。
注意,Docker Engine啟動時默認創建的3個網絡中有一個host類型的網絡,其名稱也是host。后續創建容器實例時,使用--net=host表示創建的容器實例加入到默認的host網絡中。
加入到該網絡中的所有容器實例,容器實例與容器宿主機之間沒有網絡隔離,所以容器實例都直接使用宿主機的網絡,擁有與宿主機一樣的IP,使用的是宿主機的端口。即所有容器實例的使用網卡都是宿主機的網卡,所有容器實例的IP都是宿主機的IP。一個宿主機上的所有容器實例,默認都是相通的,彼此之間通過localhost即可互相訪問。不同的容器實例使用的網絡端口(其實就是宿主機的端口)必須不同,否則會因沖突而無法啟動容器實例。
2. bridge網絡
Docker Engine啟動即默認創建的網絡之一。bridge網絡的網絡驅動器為bridge,即-d=bridge。
該網絡支持在同一個宿主機上的各個容器實例之間的通信。bridge網絡是一個獨立的網絡空間,在網絡空間內部的各個容器實例能夠直接通信。各個容器實例都是連接到一個網橋,即docker0。docker0通過iptables維護了一個NAT路由表,能夠連接bridge網絡與宿主機的網卡。外部請求到達宿主機的網卡后,根據“宿主機IP:宿主機端口”與“容器實例IP:容器實例端口”之間的映射關系,進行NAT轉發,從而實現外部請求與容器實例之間的通信。當然,這要求在啟動容器實例的時候即通過--publish建立端口映射關系。
新創建的容器實例默認就會加入bridge網絡,即容器實例默認連接到docker0。創建容器實例可以通過使用--network指定加入到其他已有的網絡。
也可以另外創建一個定制的bridge網絡,創建的bridge網絡會覆蓋默認的bridge網絡。默認的bridge網絡不支持服務的DNS自動發現,即一個容器實例要通過容器實例的name找到容器實例的IP,就無法使用該網絡。定制的bridge網絡,最大的好處是默認即支持服務的自動發現。
docker0作為bridge網絡的網關,默認IP為172.17.0.1,默認子網172.17.0.0/16。在bridge網絡中,新創建的容器實例會按照順序獲取網絡IP,如172.17.0.2,172.17.0.3,...。所以重啟容器實例后,容器的IP可能就變化了。
3. none網絡
none網絡是Docker Engine啟動即默認創建的網絡之一。none網絡的網絡驅動器為none,即-d=none。
none網絡是一個完全隔離的自治網絡,甚至與Docker宿主機的網絡都不通,必須手工配置網卡后才能夠使用。
加入到該網絡的容器實例,往往要在后續設置中加入到其他的第三方網絡。
4. overlay類型的網絡
overlay類型的網絡的網絡驅動器為overlay,即-d=overlay。
該類型的網絡適用于Docker宿主機集群中的各個獨立的容器實例之間通信。為集群中的Docker容器實例提供跨多個Docker Engine的網絡連接。
5. macvlan類型的網絡
macvlan類型的網絡的網絡驅動器為macvlan,即-d=macvlan。
該類型的網絡適用于容器實例需要與宿主機的MAC地址直接通信,無需端口映射,也無需NAT,容器實例的eth0直接與宿主機的物理網卡通信。容器實例可以被賦予公共IP,并從宿主機外部直接訪問。
在某些歷史遺留應用中,只能通過MAC通信,與之通信的容器實例也必須擁有MAC地址。這時容器實例就如同真實的物理設備一樣。
6. 其他remote網絡
相對于Docker Engine內置支持的幾種網絡,其他通過第三方驅動器創建的網絡都被統稱為remote類型的網絡。
第三方網絡驅動器都是以網絡插件的方式提供。截至目前,通過官方認證的網絡插件如下:
- Weaveworks提供的Weave Net
- Cisco Systems提供的Contiv Network Plugin
- Infoblox提供的Infoblox IPAM Plugin
下面以Weave Net為例簡單說明。
- 安裝Weave Net插件
?? ??? ??? ?docker plugin install store/weaveworks/net-plugin:2.5.0 --grant-all-permissions
- 查看插件
? ? ? ? ? ? docker plugin ls
- 創建網絡myweavenet
?? ??? ??? ?docker network create --driver=store/weaveworks/net-plugin:2.5.0 myweavenet
?
參考鏈接:
https://success.docker.com/article/networking
https://docs.docker.com/network/
https://docs.docker.com/v17.09/engine/userguide/networking/
https://store.docker.com/search?category=network&q=&type=plugin
總結
以上是生活随笔為你收集整理的Docker的网络类型及驱动器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初识函数集锦
- 下一篇: PB混淆加密大师(powerbuilde