docker容器中無法獲取宿主機(jī)hostname的解決方案
在nodejs環(huán)境中測(cè)試通過,其它語言同理,只需要使用獲取環(huán)境變量的方法即可。
思路:
docker容器和宿主機(jī)環(huán)境是隔離的,但是可以在啟動(dòng)docker容器時(shí)將宿主機(jī)的主機(jī)名以環(huán)境變量的形式傳入,代碼在容器中獲取該值即可。
操作:
docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # 使用-e 參數(shù)傳入環(huán)境變量,值為主機(jī)名
如果使用yml文件啟動(dòng):
version: '3' services: mysql: image: mysql:v1 container_name: xx-mysql restart: always networks: - host environment: - MYSQL_ROOT_PASSWORD=xxx0209 - HOST_Q=$(hostname) # 在這設(shè)置 ports: - 3306:3306 volumes: - /opt/data/mysql:/var/lib/mysql:z
啟動(dòng)成功后,容器內(nèi)部環(huán)境變量就多了一個(gè)HOST_Q,接下來使用程序取出即可:
nodejs:
# 從process中取出環(huán)境變量對(duì)象 let env = process.env; console.log(JSON.stringify(env)); # env['HOST_Q']就是最終要獲取的主機(jī)名 # output [2019-04-17T06:54:12.951Z] [e1e7115e0a33] [info]: {"NODE_VERSION":"8.9.4","HOSTNAME":"e1e7115e0a33","YARN_VERSION":"1.3.2","HOME":"/root","HOST_Q":"emg-ubuntu-pub02","PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","PWD":"/"}
java:
public class Test { public static void main(String[] args) { Map<String, String> map = System.getenv(); String hostName = map.get("HOST_Q"); System.out.println(hostName); } }
補(bǔ)充:docker容器無法訪問宿主機(jī)報(bào)出 No route to host
一. 問題描述
在docker部署nacos的時(shí)候遇到了這個(gè)樣子的問題No route to host 導(dǎo)致了nacos容器無法連接宿主機(jī)的docker數(shù)據(jù)庫。
然后我就進(jìn)入到了nacos容器里面,ping了宿主機(jī)的地址,結(jié)果是通著的,然后使用telnet測(cè)試了3306端口,結(jié)果也會(huì)報(bào)出這個(gè)異常。
原因是什么呢?明明數(shù)據(jù)庫外部可以正常連接訪問,但是宿主機(jī)內(nèi)部容器確實(shí)無法訪問?
二. 原因分析
在進(jìn)行docker部署的時(shí)候我們采用的是bridge網(wǎng)橋的模式。
啟動(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)文通過docker0向外轉(zhuǎn)發(fā)。
如果docker容器訪問宿主機(jī),那么docker0網(wǎng)橋?qū)?bào)文直接轉(zhuǎn)發(fā)到本機(jī),報(bào)文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪問宿主機(jī)以外的機(jī)器,docker的SNAT網(wǎng)橋會(huì)將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址,通過宿主機(jī)的網(wǎng)卡向外發(fā)送。
因此,當(dāng)docker容器訪問宿主機(jī)時(shí),如果宿主機(jī)服務(wù)端口會(huì)被防火墻攔截,從而無法連通宿主機(jī),出現(xiàn)No route to host的錯(cuò)誤。
而訪問宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報(bào)文的源地址是宿主機(jī)ip,因此,不會(huì)被目的機(jī)器防火墻攔截,所以可以訪問。
三. 解決方案
1> 關(guān)閉宿主機(jī)的防火墻
systemctl stop firewalld
2> 在防火墻上開發(fā)指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --zone=public --add-port=3307/tcp --permanent firewall-cmd --reload
注:在進(jìn)行完防火墻的操作之后最好是要進(jìn)行以下docker的重啟,systemctl restart docker,否則容器到因?yàn)樘摂M網(wǎng)橋失效而導(dǎo)致的iptables failed問題
四. 小結(jié)
docker的容器網(wǎng)絡(luò)連接一直是一個(gè)問題,容器與容器之間,容器與宿主機(jī)之間,容器跨主機(jī)訪問,所以在涉及到容器的網(wǎng)絡(luò)連接的時(shí)候要注意網(wǎng)絡(luò)的問題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- docker從容器中訪問到宿主機(jī)3種方法
- docker內(nèi)的容器如何與宿主機(jī)共享IP的方法
- docker內(nèi)服務(wù)訪問宿主機(jī)服務(wù)的實(shí)現(xiàn)
- docker 實(shí)現(xiàn)容器與宿主機(jī)無縫調(diào)用shell命令
- Docker容器沒有權(quán)限寫入宿主機(jī)目錄的解決方案
- docker容器訪問宿主機(jī)的MySQL操作
- docker容器無法訪問宿主機(jī)端口的解決
- Docker容器訪問宿主機(jī)網(wǎng)絡(luò)的方法
- docker容器與centos宿主機(jī)時(shí)間一致設(shè)置方法
相關(guān)文章
樹莓派3B+安裝64位ubuntu系統(tǒng)和docker工具的操作步驟詳解
這篇文章主要介紹了樹莓派3B+安裝64位ubuntu系統(tǒng)和docker工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09docker實(shí)踐之docker-compose部署mysql方式
這篇文章主要介紹了docker實(shí)踐之docker-compose部署mysql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08docker mysql啟動(dòng)時(shí)執(zhí)行初始化sql
這篇文章主要介紹了docker mysql啟動(dòng)時(shí)執(zhí)行初始化sql問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05詳細(xì)講解Docker-Compose部署Kafka?KRaft集群環(huán)境
這篇文章主要為大家介紹了Docker-Compose部署Kafka?KRaft集群環(huán)境的全面詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Windows Server 2016 安裝 Docker的過程及遇到問題
若要在 Windows Server 上安裝 Docker,可以使用由 Microsoft 發(fā)布的 OneGet 提供程序 PowerShell 模塊,接下來通過本文給大家介紹Windows Server 2016 安裝 Docker的過程及遇到問題,一起看看吧2021-09-09詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器)
容器中管理數(shù)據(jù)主要有兩種方式,這篇文章主要介紹了詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10docker構(gòu)建nginx?alpine鏡像實(shí)現(xiàn)步驟
這篇文章主要介紹了docker構(gòu)建nginx?alpine鏡像實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08