在centos部署docker鏡像時(shí)限次,遇到可docker容器無(wú)法訪問(wèn)宿主機(jī)ip的問(wèn)題(用的wget工具),報(bào)錯(cuò)信息為:No route to host。而從docker容器中訪問(wèn)宿主機(jī)所在局域網(wǎng)的其他主機(jī)的服務(wù)是可以訪問(wèn)的鞭衩。
原因分析
本文中在centos上部署docker容器充包,其網(wǎng)絡(luò)模式采用的是bridger模式。
啟動(dòng)docker時(shí)山析,docker進(jìn)程會(huì)創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋堰燎,用于宿主機(jī)與容器之間的通信。當(dāng)啟動(dòng)一個(gè)docker容器時(shí)笋轨,docker容器將會(huì)附加到虛擬網(wǎng)橋上秆剪,容器內(nèi)的報(bào)文通過(guò)docker0向外轉(zhuǎn)發(fā)。
如果docker容器訪問(wèn)宿主機(jī)爵政,那么docker0網(wǎng)橋?qū)?bào)文直接轉(zhuǎn)發(fā)到本機(jī)仅讽,報(bào)文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪問(wèn)宿主機(jī)以外的機(jī)器钾挟,docker的SNAT網(wǎng)橋會(huì)將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址洁灵,通過(guò)宿主機(jī)的網(wǎng)卡向外發(fā)送。
因此掺出,當(dāng)docker容器訪問(wèn)宿主機(jī)時(shí)徽千,如果宿主機(jī)服務(wù)端口會(huì)被防火墻攔截,從而無(wú)法連通宿主機(jī)汤锨,出現(xiàn)No route to host的錯(cuò)誤双抽。
而訪問(wèn)宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報(bào)文的源地址是宿主機(jī)ip闲礼,因此牍汹,不會(huì)被目的機(jī)器防火墻攔截琅翻,所以可以訪問(wèn)。
解決方法
方法一:關(guān)閉防火墻
centos關(guān)閉防火墻的操作為
systemctl stop firewalld
方法二: 在防火墻上開(kāi)發(fā)指定端口
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload
小結(jié)
這個(gè)問(wèn)題是在用docker方式部署fabric網(wǎng)絡(luò)中遇見(jiàn)的錯(cuò)誤柑贞,容器技術(shù)為fabric網(wǎng)絡(luò)部署帶來(lái)了極大的便利和運(yùn)維的方便方椎,但是另一方面也帶來(lái)了網(wǎng)絡(luò)的復(fù)雜,因此钧嘶,在運(yùn)行fabric網(wǎng)絡(luò)中要尤其注意docker鏡像網(wǎng)絡(luò)問(wèn)題棠众。
ps. 本人在容器方面也是小白一枚,如果本文中有錯(cuò)誤之處有决,還請(qǐng)大佬們批評(píng)指正闸拿!