91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker容器中無法獲取宿主機hostname怎么辦

發布時間:2021-03-22 11:04:08 來源:億速云 閱讀:1601 作者:小新 欄目:開發技術

小編給大家分享一下docker容器中無法獲取宿主機hostname怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在nodejs環境中測試通過,其它語言同理,只需要使用獲取環境變量的方法即可。

思路:

docker容器和宿主機環境是隔離的,但是可以在啟動docker容器時將宿主機的主機名以環境變量的形式傳入,代碼在容器中獲取該值即可。

操作:

docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # 使用-e 參數傳入環境變量,值為主機名

如果使用yml文件啟動:

version: '3'
services:
 mysql:
 image: mysql:v1
 container_name: xx-mysql
 restart: always
 networks:
  - host
 environment:
  - MYSQL_ROOT_PASSWORD=xxx0209
  - HOST_Q=$(hostname) # 在這設置
 ports:
  - 3306:3306
 volumes:
  - /opt/data/mysql:/var/lib/mysql:z

啟動成功后,容器內部環境變量就多了一個HOST_Q,接下來使用程序取出即可:

nodejs:

# 從process中取出環境變量對象
let env = process.env;
console.log(JSON.stringify(env));
# env['HOST_Q']就是最終要獲取的主機名
 
# 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); 
 }
}

補充:docker容器無法訪問宿主機報出 No route to host

一. 問題描述

在docker部署nacos的時候遇到了這個樣子的問題No route to host 導致了nacos容器無法連接宿主機的docker數據庫。

然后我就進入到了nacos容器里面,ping了宿主機的地址,結果是通著的,然后使用telnet測試了3306端口,結果也會報出這個異常。

原因是什么呢?明明數據庫外部可以正常連接訪問,但是宿主機內部容器確實無法訪問?

二. 原因分析

在進行docker部署的時候我們采用的是bridge網橋的模式。

啟動docker時,docker進程會創建一個名為docker0的虛擬網橋,用于宿主機與容器之間的通信。當啟動一個docker容器時,docker容器將會附加到虛擬網橋上,容器內的報文通過docker0向外轉發。

如果docker容器訪問宿主機,那么docker0網橋將報文直接轉發到本機,報文的源地址是docker0網段的地址。而如果docker容器訪問宿主機以外的機器,docker的SNAT網橋會將報文的源地址轉換為宿主機的地址,通過宿主機的網卡向外發送。

因此,當docker容器訪問宿主機時,如果宿主機服務端口會被防火墻攔截,從而無法連通宿主機,出現No route to host的錯誤。

而訪問宿主機所在局域網內的其他機器,由于報文的源地址是宿主機ip,因此,不會被目的機器防火墻攔截,所以可以訪問。

三. 解決方案

1> 關閉宿主機的防火墻

systemctl stop firewalld

2> 在防火墻上開發指定的端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload

注:在進行完防火墻的操作之后最好是要進行以下docker的重啟,systemctl restart docker,否則容器到因為虛擬網橋失效而導致的iptables failed問題

以上是“docker容器中無法獲取宿主機hostname怎么辦”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

墨玉县| 景德镇市| 大余县| 天长市| 辽宁省| 遂溪县| 孟村| 沾益县| 栾川县| 瓦房店市| 常熟市| 辉县市| 平凉市| 甘孜县| 德庆县| 通州区| 郧西县| 台北县| 蒙阴县| 华坪县| 宁河县| 伊春市| 石首市| 汝阳县| 华阴市| 卢龙县| 兴海县| 清水河县| 铁力市| 大余县| 嘉禾县| 陇川县| 瑞丽市| 嘉黎县| 安陆市| 敦化市| 贞丰县| 于都县| 方正县| 永胜县| 新干县|