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