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