在centos部署docker鏡像時(shí),遇到可docker容器無(wú)法訪(fǎng)問(wèn)宿主機(jī)ip的問(wèn)題(用的wget工具),報(bào)錯(cuò)信息為:No route to host。而從docker容器中訪(fǎng)問(wèn)宿主機(jī)所在局域網(wǎng)的其他主機(jī)的服務(wù)是可以訪(fǎng)問(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容器訪(fǎng)問(wèn)宿主機(jī),那么docker0網(wǎng)橋?qū)?bào)文直接轉(zhuǎn)發(fā)到本機(jī),報(bào)文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪(fǎng)問(wèn)宿主機(jī)以外的機(jī)器,docker的SNAT網(wǎng)橋會(huì)將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址,通過(guò)宿主機(jī)的網(wǎng)卡向外發(fā)送。
因此,當(dāng)docker容器訪(fǎng)問(wèn)宿主機(jī)時(shí),如果宿主機(jī)服務(wù)端口會(huì)被防火墻攔截,從而無(wú)法連通宿主機(jī),出現(xiàn)No route to host的錯(cuò)誤。
而訪(fǎng)問(wèn)宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報(bào)文的源地址是宿主機(jī)ip,因此,不會(huì)被目的機(jī)器防火墻攔截,所以可以訪(fǎng)問(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)指正!
作者:John_Xuxu
鏈接:http://www.itdecent.cn/p/96aebba5d3cc
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。