須雅可
在日常使用Docker構(gòu)建微服務(wù)架構(gòu)的過(guò)程中,我們經(jīng)常會(huì)遇到一個(gè)問(wèn)題:多個(gè)容器之間是如何通過(guò)名字互相訪問(wèn)的?DNS是怎么做到的?
從底層機(jī)制講清楚Docker的DNS系統(tǒng)
1.容器間通信的前提:同一個(gè)網(wǎng)絡(luò)
Docker默認(rèn)會(huì)創(chuàng)建一個(gè)叫bridge的網(wǎng)橋網(wǎng)絡(luò)。所有未指定網(wǎng)絡(luò)的容器,都會(huì)被分配到這個(gè)bridge網(wǎng)絡(luò)中。
在這個(gè)默認(rèn)網(wǎng)絡(luò)中,雖然每個(gè)容器都有一個(gè)獨(dú)立的IP地址,但要實(shí)現(xiàn)通過(guò)容器名訪問(wèn)其他容器,就必須依賴Docker提供的DNS服務(wù)。
??注意:只有在用戶自定義的bridge網(wǎng)絡(luò)中,容器名解析才默認(rèn)開啟!默認(rèn)的bridge網(wǎng)絡(luò)不支持容器名解析!
2.Docker的內(nèi)置DNS是如何工作的?
Docker在每個(gè)容器啟動(dòng)時(shí),會(huì)將容器的/etc/resolv.conf文件指向一個(gè)特殊的DNS地址:127.0.0.11
這個(gè)地址并不是真的公網(wǎng)DNS,而是DockerDaemon內(nèi)置的DNS服務(wù)器。
這個(gè)DNS有以下作用:
解析外部域名(比如訪問(wèn)百度、Google)
解析容器內(nèi)部服務(wù)名(比如web,db等容器名)
它的背后是Docker的embeddedDNSserver,工作機(jī)制大概如下:
1??容器發(fā)出DNS查詢請(qǐng)求(查某個(gè)服務(wù)名)
2??請(qǐng)求發(fā)到127.0.0.11(docker的內(nèi)部DNS)
3??DockerDNS根據(jù)網(wǎng)絡(luò)配置,找到對(duì)應(yīng)容器的IP地址
4??將結(jié)果返回給發(fā)起請(qǐng)求的容器
3.實(shí)驗(yàn)驗(yàn)證:容器名訪問(wèn)是否生效?
我們創(chuàng)建一個(gè)自定義網(wǎng)絡(luò),并啟動(dòng)兩個(gè)容器測(cè)試下
#創(chuàng)建一個(gè)自定義bridge網(wǎng)絡(luò)dockernetworkcreatemynet#啟動(dòng)容器A,名字叫webdockerrun-it--rm--nameweb--networkmynetbusyboxsh#啟動(dòng)容器B,在這個(gè)網(wǎng)絡(luò)中嘗試pingwebdockerrun-it--rm--networkmynetbusyboxsh
在B容器中輸入:
pingweb
你會(huì)發(fā)現(xiàn),DNS能自動(dòng)解析出web的IP,這就說(shuō)明Docker的內(nèi)置DNS正常工作啦
4.自定義服務(wù)名(別名)怎么設(shè)置?
有時(shí)候我們希望容器訪問(wèn)的名字不是容器名,而是我們指定的服務(wù)名。Docker也支持這一點(diǎn):
dockerrun-it--rm\--networkmynet\--namemydb\--network-aliasdatabase\busyboxsh
然后在其他容器中,就可以通過(guò)database這個(gè)名字訪問(wèn)它
5.與外部DNS的協(xié)同
Docker的embeddedDNS并不是萬(wàn)能的,它在無(wú)法解析服務(wù)名時(shí),會(huì)把請(qǐng)求轉(zhuǎn)發(fā)給/etc/resolv.conf中指定的上游DNS。
這意味著:
外部網(wǎng)絡(luò)訪問(wèn)正常(比如你容器內(nèi)pingwww.baidu.com)
內(nèi)部容器名也能解析
DockerDNS是中間層代理
這個(gè)設(shè)計(jì)非常巧妙!兼顧了內(nèi)外網(wǎng)的域名解析。
6.容器DNS失效的常見問(wèn)題
?沒(méi)有使用自定義網(wǎng)絡(luò),導(dǎo)致DNS解析失敗
?使用了host網(wǎng)絡(luò),容器直接共享宿主機(jī)網(wǎng)絡(luò),無(wú)法使用Docker的DNS
?被resolv.conf修改或者掛載了宿主機(jī)DNS文件
?某些VPN環(huán)境導(dǎo)致容器DNS路由異常
解決方法建議:
盡量使用自定義bridge網(wǎng)絡(luò)
檢查/etc/resolv.conf是否被覆蓋
檢查Docker網(wǎng)絡(luò)配置dockernetworkinspect
總結(jié)
Docker容器之間的DNS解析,其實(shí)是靠DockerDaemon內(nèi)置的DNS服務(wù)(監(jiān)聽在127.0.0.11)來(lái)實(shí)現(xiàn)的,它能讓容器通過(guò)服務(wù)名互相訪問(wèn),還支持alias、自定義網(wǎng)絡(luò)、多級(jí)域名等能力。
5本剛完結(jié)兩界穿梭類仙俠小說(shuō),倒買倒賣賺資糧,突飛猛進(jìn)稱天驕
曼威宇宙的背景很大。但起點(diǎn)上的背景,一個(gè)比一個(gè)洪荒,一個(gè)比一個(gè)鴻蒙,掌碎宇宙的強(qiáng)者比比皆是。這些故事無(wú)形中弱化了曼威宇宙等一些西方神話的設(shè)定。而在對(duì)于東方神和西方神之間實(shí)力對(duì)比的觀點(diǎn)上,華夏再一次體現(xiàn)出了強(qiáng)大的凝聚力。如果你要說(shuō)一個(gè)元嬰老怪無(wú)法單挑整個(gè)西方神明,那一定會(huì)遭到無(wú)數(shù)有志網(wǎng)民的正義討有幫助請(qǐng)點(diǎn)贊——。
8本已完結(jié)詭異+極道流高武玄幻小說(shuō),赳赳武夫,斗戰(zhàn)天地
總結(jié)點(diǎn)評(píng)看點(diǎn):都市異能+神話復(fù)蘇!身份反轉(zhuǎn)(平凡管理員/轉(zhuǎn)世大能)帶來(lái)強(qiáng)烈反差萌和扮豬吃虎的快感。打斗融合現(xiàn)代元素與神話法術(shù),主角言出法隨、借古器鎮(zhèn)妖的手段新穎有趣?,F(xiàn)代與古代的交織感強(qiáng)。13.《星門》作者:老鷹吃小雞字?jǐn)?shù):約630萬(wàn)背景:超能崛起的新時(shí)代,星門開啟,連接未知世界——_。主角李皓,..
2025年第9期高口碑連載小說(shuō),有無(wú)限流、高武、架空歷史等元素!
在藍(lán)星,他創(chuàng)造了神話復(fù)蘇,扮演不同的神話人物,收割信仰,凝聚不同的神職,獲得了諸如黃金之王、生命的賜予者、魔法的擁護(hù)者、夢(mèng)境的編織者、大地的守護(hù)者、時(shí)間的主宰者等眾多稱號(hào)。在異界,他成為巨龍領(lǐng)主,憑借強(qiáng)大實(shí)力創(chuàng)建了自己的王國(guó)和眷族,收集了不同種族充當(dāng)自己的侍女,并誕生了諸多龍脈的存在,逐漸成為后面會(huì)介紹-。
來(lái)源:紅網(wǎng)
作者:念宵晨
編輯:吳文珍
本文為紅辣椒評(píng)論 原創(chuàng)文章,僅系作者個(gè)人觀點(diǎn),不代表紅網(wǎng)立場(chǎng)。轉(zhuǎn)載請(qǐng)附原文出處鏈接和本聲明。