濮阳杆衣贸易有限公司

主頁 > 知識庫 > docker容器中無法獲取宿主機(jī)hostname的解決方案

docker容器中無法獲取宿主機(jī)hostname的解決方案

熱門標(biāo)簽:海外工廠地圖標(biāo)注 株洲電銷 宿州外呼系統(tǒng)公司 地圖標(biāo)注小程序 南充電銷外呼系統(tǒng) 貴陽網(wǎng)絡(luò)外呼系統(tǒng)軟件 信陽電銷外呼系統(tǒng)怎么樣 陜西辦理400電話 南昌外呼系統(tǒng)定制

在nodejs環(huán)境中測試通過,其它語言同理,只需要使用獲取環(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)境變量對象
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測試了3306端口,結(jié)果也會報(bào)出這個(gè)異常。

原因是什么呢?明明數(shù)據(jù)庫外部可以正常連接訪問,但是宿主機(jī)內(nèi)部容器確實(shí)無法訪問?

二. 原因分析

在進(jìn)行docker部署的時(shí)候我們采用的是bridge網(wǎng)橋的模式。

啟動(dòng)docker時(shí),docker進(jìn)程會創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,用于宿主機(jī)與容器之間的通信。當(dāng)啟動(dòng)一個(gè)docker容器時(shí),docker容器將會附加到虛擬網(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)橋會將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址,通過宿主機(jī)的網(wǎng)卡向外發(fā)送。

因此,當(dāng)docker容器訪問宿主機(jī)時(shí),如果宿主機(jī)服務(wù)端口會被防火墻攔截,從而無法連通宿主機(jī),出現(xiàn)No route to host的錯(cuò)誤。

而訪問宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報(bào)文的源地址是宿主機(jī)ip,因此,不會被目的機(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ò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽:鄭州 開封 晉城 石嘴山 玉林 三明 汕頭 拉薩

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《docker容器中無法獲取宿主機(jī)hostname的解決方案》,本文關(guān)鍵詞  docker,容器,中,無法,獲取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《docker容器中無法獲取宿主機(jī)hostname的解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于docker容器中無法獲取宿主機(jī)hostname的解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    嘉义县| 宜宾市| 沂南县| 黄冈市| 定南县| 天门市| 星座| 张北县| 霍城县| 合水县| 林州市| 交城县| 六枝特区| 新邵县| 甘德县| 安平县| 台前县| 河源市| 图片| 宁城县| 通化县| 金华市| 南昌市| 巧家县| 敖汉旗| 张北县| 曲麻莱县| 龙里县| 分宜县| 交城县| 象州县| 上高县| 朝阳市| 平南县| 朝阳区| 湛江市| 洛浦县| 吉水县| 梁平县| 旬邑县| 澄城县|