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