我們?cè)谑褂胐ocker run創(chuàng)建Docker容器時(shí),可以用--net選項(xiàng)指定容器的網(wǎng)絡(luò)模式,Docker有以下4種網(wǎng)絡(luò)模式:
1.host模式,使用--net=host指定。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供木壘哈薩克網(wǎng)站建設(shè)、木壘哈薩克做網(wǎng)站、木壘哈薩克網(wǎng)站設(shè)計(jì)、木壘哈薩克網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、木壘哈薩克企業(yè)網(wǎng)站模板建站服務(wù),十年木壘哈薩克做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
2.container模式,使用--net=container:NAME_or_ID指定。
3.none模式,使用--net=none指定。
4.bridge模式,使用--net=bridge指定,默認(rèn)設(shè)置
5.overlay模式:使用--net=overlay(覆蓋網(wǎng)絡(luò),跨主機(jī)通信)
一、host模式
Docker使用的網(wǎng)絡(luò)實(shí)際上和宿主機(jī)一樣,在容器內(nèi)看到的網(wǎng)卡ip是宿主機(jī)上的ip。
眾所周知,Docker使用了Linux的Namespaces技術(shù)來進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、Iptable規(guī)則等都與其他的Network Namespace隔離。一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace。但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口
docker run -it --net=host centos /bin/bash
可以看到容器內(nèi)網(wǎng)卡直接復(fù)用宿主機(jī)網(wǎng)絡(luò),該模式將禁用Docker容器的網(wǎng)絡(luò)隔離
二、container模式
多個(gè)容器使用共同的網(wǎng)絡(luò)看到的ip是一樣的。
在理解了host模式后,這個(gè)模式也就好理解了。這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信
例子:
docker run -it --net=container:169c875f4ba0 centos /bin/bash (復(fù)用169c875f4ba0容器的網(wǎng)絡(luò))
可以看出和容器169c875f4ba0的網(wǎng)絡(luò)環(huán)境一樣
三、none模式
這種模式下不會(huì)配置任何網(wǎng)絡(luò)。
這個(gè)模式和前兩個(gè)不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說,這個(gè)Docker容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。
例子:
docker run -it --net=none centos /bin/bash
可以看出,并沒有配置網(wǎng)卡信息,需要自己手動(dòng)配置
四、bridge模式
bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上。
同一個(gè)宿主機(jī)上的所有容器會(huì)在同一個(gè)網(wǎng)段下,相互之間是可以通信的
例子:
docker run -it --net=bridge centos /bin/bash
對(duì)比宿主機(jī)網(wǎng)橋,發(fā)現(xiàn)容器內(nèi)網(wǎng)卡和宿主機(jī)網(wǎng)橋在同一網(wǎng)段.
通過網(wǎng)橋和外界通信
五、overlay neetwork模式(跨主機(jī)通信)
容器在兩個(gè)跨主機(jī)進(jìn)行通信的時(shí)候,是使用overlay network這個(gè)網(wǎng)絡(luò)模式進(jìn)行通信,如果使用host也可以實(shí)現(xiàn)跨主機(jī)進(jìn)行通信,直接使用這個(gè)物理的ip地址就可以進(jìn)行通信。overlay它會(huì)虛擬出一個(gè)網(wǎng)絡(luò),在這個(gè)overlay網(wǎng)絡(luò)模式里面,有一個(gè)類似于服務(wù)網(wǎng)關(guān)的地址,然后把這個(gè)包轉(zhuǎn)發(fā)到物理服務(wù)器這個(gè)地址,最終通過路由和交換,到達(dá)另一個(gè)服務(wù)器的ip地址
在docker容器里面overlay 是怎么實(shí)現(xiàn)的呢
例子:
宿主機(jī):172.16.1.56,172.16.1.57 修改
vim /lib/systemd/system/docker.service
修改啟動(dòng)參數(shù)
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的連接地址。
之后重啟docker
systemctl daemon-reload
systemctl restart docker.service
使用docker部署服務(wù)發(fā)現(xiàn)工具consul
docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap -ui-dir /ui
http://172.16.1.57:8500/
可以看到已經(jīng)存在的服務(wù)
查看目前的網(wǎng)絡(luò)模式
創(chuàng)建overlay網(wǎng)絡(luò)
-d overlay: 指定driver為overlay
可以注意到ov_net1的scope為global
在另一臺(tái)機(jī)器傻女查看網(wǎng)絡(luò)模式
發(fā)現(xiàn)也存在ov_net1網(wǎng)絡(luò)
查看網(wǎng)絡(luò)詳細(xì)信息
創(chuàng)建容器
docker run -it --net=ov_net1 centos /bin/bash
發(fā)現(xiàn)兩個(gè)不同主機(jī)的容器可以ping通
恢復(fù)netns命名空間
執(zhí)行下面的命令來獲取容器進(jìn)程號(hào)
docker inspect adaea943f075|grep Pid
ln -s /proc/26398/ns/net /var/run/netns/adaea943f075(容器id) #netns目錄不存在則創(chuàng)建
查看網(wǎng)絡(luò)空間
恢復(fù)docker容器netns
ln -s /var/run/docker/netns /var/run/netns
查看指定網(wǎng)絡(luò)命名空間的網(wǎng)絡(luò)
ip netns exec 1-46663fb66b ip addr
查看網(wǎng)絡(luò)網(wǎng)卡
ip netns exec 1-46663fb66b brctl show
實(shí)現(xiàn)步驟
從這個(gè)通信過程中來看,跨主機(jī)通信過程中的步驟如下:
容器的網(wǎng)絡(luò)命名空間與overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間通過一對(duì)veth pair連接起來,當(dāng)容器對(duì)外通信時(shí),veth pair起到網(wǎng)線的作用,將流量發(fā)送到overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中。
容器的veth pair對(duì)端eth3與vxlan設(shè)備通過br0這個(gè)Linux bridge橋接在一起,br0在同一宿主機(jī)上起到虛擬機(jī)交換機(jī)的作用,如果目標(biāo)地址在同一宿主機(jī)上,則直接通信,如果不再則通過設(shè)置在vxlan1這個(gè)vxlan設(shè)備進(jìn)行跨主機(jī)通信。
vxlan1設(shè)備上會(huì)在創(chuàng)建時(shí),由docker daemon為其分配vxlan隧道ID,起到網(wǎng)絡(luò)隔離的作用。
docker主機(jī)集群通過key/value存儲(chǔ)共享數(shù)據(jù),在7946端口上,相互之間通過gossip協(xié)議學(xué)習(xí)各個(gè)宿主機(jī)上運(yùn)行了哪些容器。守護(hù)進(jìn)程根據(jù)這些數(shù)據(jù)來在vxlan1設(shè)備上生成靜態(tài)MAC轉(zhuǎn)發(fā)表。
根據(jù)靜態(tài)MAC轉(zhuǎn)發(fā)表的設(shè)置,通過UDP端口4789,將流量轉(zhuǎn)發(fā)到對(duì)端宿主機(jī)的網(wǎng)卡上。
根據(jù)流量包中的vxlan隧道ID,將流量轉(zhuǎn)發(fā)到對(duì)端宿主機(jī)的overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中。
對(duì)端宿主機(jī)的overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中br0網(wǎng)橋,起到虛擬交換機(jī)的作用,將流量根據(jù)MAC地址轉(zhuǎn)發(fā)到對(duì)應(yīng)容器內(nèi)部。
雖然上面的網(wǎng)絡(luò)通信模型可以實(shí)現(xiàn)容器的跨主機(jī)通信,但還是有一些缺陷,造成實(shí)際使用上的不便,例如:
由于vxlan網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò)默認(rèn)不再同一網(wǎng)絡(luò)環(huán)境下,為了解決宿主機(jī)與容器的通信問題,docker為overlay網(wǎng)絡(luò)中的容器額外增加了網(wǎng)卡eth2作為宿主機(jī)與容器通信的通道。這樣在使用容器服務(wù)時(shí),就必須根據(jù)訪問性質(zhì)的不同,選擇不同的網(wǎng)卡地址,造成使用上的不便。
容器對(duì)外暴露服務(wù)仍然只能使用端口綁定的方式,外界無法簡(jiǎn)單地直接使用容器IP訪問容器服務(wù)。
從上面的通信過程中來看,原生的overlay網(wǎng)絡(luò)通信必須依賴docker守護(hù)進(jìn)程及key/value存儲(chǔ)來實(shí)現(xiàn)網(wǎng)絡(luò)通信,約束較多,容器在啟動(dòng)后的一段時(shí)間內(nèi)可能無法跨主機(jī)通信,這對(duì)一些比較敏感的應(yīng)用來說是不可靠的。
不通overlay network網(wǎng)絡(luò)空間的容器如何通信
使用連接網(wǎng)絡(luò)
docker network connect ov_net1 containId(容器名或者ID) (該容器位于另一個(gè)網(wǎng)絡(luò)空間)
本文標(biāo)題:docker網(wǎng)絡(luò)模式
文章URL:http://jinyejixie.com/article4/ggidoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、軟件開發(fā)、網(wǎng)站策劃、企業(yè)建站、域名注冊(cè)、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)