Docker精华问答 | 如何让一个容器连接两个网络?
如今Docker的使用已經(jīng)非常普遍,特別在一線互聯(lián)網(wǎng)公司。使用Docker技術(shù)可以幫助企業(yè)快速水平擴(kuò)展服務(wù),從而到達(dá)彈性部署業(yè)務(wù)的能力。在云服務(wù)概念興起之后,Docker的使用場(chǎng)景和范圍進(jìn)一步發(fā)展。今天,就讓我們來(lái)看看關(guān)于Docker的深度問(wèn)答。
1
Q:vethxxxx?這種虛擬網(wǎng)卡和容器的對(duì)應(yīng)關(guān)系從哪里看??
A:使用如下命令:
$ docker network ls
注意這里的?br-56f04389b8f0?以及?br-094fcb269385,br-?后面的是上面的網(wǎng)絡(luò)id,由此可以看出?veth?和 Docker 網(wǎng)絡(luò)的對(duì)應(yīng)關(guān)系,而容器都是連接到了某個(gè)Docker網(wǎng)絡(luò)上的,從而就有了容器和?veth?的對(duì)應(yīng)關(guān)系。對(duì)于某個(gè)網(wǎng)絡(luò)出現(xiàn)了多個(gè)veth?的情況,可以觀察veth22996d2@if11?后面的?if11?這部分,和容器內(nèi)的?ip addr?的結(jié)果,一般奇-偶是一對(duì)。
Q:如何讓一個(gè)容器連接兩個(gè)網(wǎng)絡(luò)??
A:如果是使用?docker run,那很不幸,一次只可以連接一個(gè)網(wǎng)絡(luò),因?yàn)?docker run?的?--network?參數(shù)只可以出現(xiàn)一次(如果出現(xiàn)多次,最后的會(huì)覆蓋之前的)。不過(guò)容器運(yùn)行后,可以用命令?docker network connect?連接多個(gè)網(wǎng)絡(luò)。假設(shè)我們創(chuàng)建了兩個(gè)網(wǎng)絡(luò):
3Q:Docker 多宿主網(wǎng)絡(luò)怎么配置
A:Docker 跨節(jié)點(diǎn)容器網(wǎng)絡(luò)互聯(lián),最通用的是使用?overlay?網(wǎng)絡(luò)。
一代 Swarm 已經(jīng)不再使用,它要求使用?overlay?網(wǎng)絡(luò)前先準(zhǔn)備好分布式鍵值庫(kù),比如?etcd,?consul?或?zookeeper。然后在每個(gè)節(jié)點(diǎn)的 Docker 引擎中,配置?--cluster-store?和?--cluster-advertise?參數(shù)。這樣才可以互連??梢詤⒖嘉覍懙?LNMP 容器互聯(lián)例子中的?run1.sh?這個(gè)腳本,這個(gè)腳本是利用?docker-machine自動(dòng)建立 Swarm 并且配置好?overlay?的腳本,可以分析其流程。
現(xiàn)在都在使用二代 Swarm,也就是?Docker Swarm Mode,非常簡(jiǎn)單,只要?docker swarm init?建立集群,其它節(jié)點(diǎn)?docker swarm join?加入集群后,集群內(nèi)的服務(wù)就自動(dòng)建立了?overlay?網(wǎng)絡(luò)互聯(lián)能力。
需要注意的是,如果是多網(wǎng)卡環(huán)境,無(wú)論是?docker swarm init?還是?docker swarm join,都不要忘記使用參數(shù)?--advertise-addr?指定宣告地址,否則自動(dòng)選擇的地址很可能不是你期望的,從而導(dǎo)致集群互聯(lián)失敗。格式為?--advertise-addr <地址>:<端口>,地址可以是 IP 地址,也可以是網(wǎng)卡接口,比如?eth0。端口默認(rèn)為?2377,如果不改動(dòng)可以忽略。
此外,這是供服務(wù)使用的?overlay,因此所有?docker service create?的服務(wù)容器可以使用該網(wǎng)絡(luò),而?docker run?不可以使用該網(wǎng)絡(luò),除非明確該網(wǎng)絡(luò)為?--attachable。
Q:明明?docker network ls?中看到了建立的?overlay?網(wǎng)絡(luò),怎么docker run?還說(shuō)網(wǎng)絡(luò)不存在啊??
A:如果在?docker network ls?中看到了如下的?overlay?網(wǎng)絡(luò):
報(bào)錯(cuò)說(shuō)mynet?網(wǎng)絡(luò)找不到。其實(shí)如果仔細(xì)觀察,會(huì)看到這個(gè)名為mynet?的網(wǎng)絡(luò),驅(qū)動(dòng)是?overlay沒(méi)有錯(cuò),但它的Scope?是swarm。這個(gè)意思是說(shuō)這個(gè)網(wǎng)絡(luò)是在二代Swarm環(huán)境中建立的overlay網(wǎng)絡(luò),因此只可以由Swarm環(huán)境下的服務(wù)容器才可以使用。而docker run所運(yùn)行的只是零散的容器,并非Service,因此自然在零散容器所能使用的網(wǎng)絡(luò)中,不存在叫mynet網(wǎng)絡(luò)。
docker run可以使用的overlay網(wǎng)絡(luò)是Scope為global的overlay網(wǎng)絡(luò),也就是使用外置鍵值庫(kù)所建立的overlay網(wǎng)絡(luò),比如一代Swarm的overlay網(wǎng)絡(luò)。這點(diǎn)在 1.13 后稍有變化。如果是 1.13 以后的系統(tǒng),會(huì)看到這樣的信息:
Q:容器怎么取宿主機(jī) IP 啊??
A:單機(jī)環(huán)境?
如果是單機(jī)環(huán)境,很簡(jiǎn)單,不必琢磨怎么突破命名空間限制,直接用環(huán)境變量送進(jìn)去即可。
然后容器內(nèi)直接讀取?HOST_IP?環(huán)境變量即可。
集群環(huán)境?
集群環(huán)境相對(duì)比較復(fù)雜,docker service create?中的?-e?以及?--env-file是在服務(wù)創(chuàng)建時(shí)指定、讀取環(huán)境變量?jī)?nèi)容,而不是運(yùn)行時(shí),因此對(duì)于每個(gè)節(jié)點(diǎn)都是一樣的。而且目前不存在?dockerd -e?選項(xiàng),所以直接使用這些選項(xiàng)達(dá)不到我們想要的效果。不過(guò)有變通的辦法,可以在宿主上建立一個(gè)?/etc/variables?文件(名字隨意,這里用這個(gè)文件舉例)。其內(nèi)容為:
其中?1.2.3.4?是這個(gè)節(jié)點(diǎn)的宿主 IP,因此每個(gè)節(jié)點(diǎn)的?/etc/variables?的內(nèi)容不同。
而在啟動(dòng)服務(wù)時(shí),指定掛載這個(gè)服務(wù)端本地文件:
docker service create --name app \
--mount type=bind,source=/etc/variables,target=/etc/variables:ro \
myapp
由于?--mount?是發(fā)生于容器運(yùn)行時(shí),因此所加載的是所運(yùn)行的服務(wù)器的?/etc/variables,里面所包含的也是該服務(wù)器的 IP 地址。在?myapp?這個(gè)鏡像的入口腳本加入加載該環(huán)境變量文件的命令:
這樣app這個(gè)服務(wù)容器就會(huì)擁有?HOST_IP?環(huán)境變量,其值為所運(yùn)行的宿主 IP。
小伙伴們沖鴨,后臺(tái)留言區(qū)等著你!
關(guān)于Docker,今天你學(xué)到了什么?還有哪些不懂的?除此還對(duì)哪些話題感興趣?快來(lái)留言區(qū)打卡啦!留言方式:打開(kāi)第XX天,答:……
同時(shí)歡迎大家搜集更多問(wèn)題,投稿給我們!風(fēng)里雨里留言區(qū)里等你~
福利
1、掃描添加小編微信,備注“姓名+公司職位”,加入【云計(jì)算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
2、公眾號(hào)后臺(tái)回復(fù):白皮書(shū),獲取IDC最新數(shù)據(jù)白皮書(shū)整理資料!
推薦閱讀:
全面剖析企業(yè)私有云
30 秒?!Chrome 插件帶你速成編程學(xué)習(xí) | 程序員硬核評(píng)測(cè)
為什么程序員下班后只關(guān)顯示器從不關(guān)電腦?
算法警告!該圖片涉嫌違規(guī)不予顯示
交易機(jī)器人春天已來(lái)?先看完這篇再說(shuō)吧
2019年中國(guó)IT市場(chǎng)趨勢(shì)熱點(diǎn)
2019年最值得關(guān)注的五大微服務(wù)發(fā)展趨勢(shì)
總結(jié)
以上是生活随笔為你收集整理的Docker精华问答 | 如何让一个容器连接两个网络?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎样注册投资公司
- 下一篇: Kubernetes API 与 Ope