国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

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

發(fā)布時(shí)間:2021-08-15 18:36 來(lái)源: 閱讀:0 作者:任慶 欄目: 服務(wù)器 歡迎投稿:712375056

在nodejs環(huán)境中測試通過(guò),其它語(yǔ)言同理,只需要使用獲取環(huán)境變量的方法即可。

思路:

docker容器和宿主機環(huán)境是隔離的,但是可以在啟動(dòng)docker容器時(shí)將宿主機的主機名以環(huán)境變量的形式傳入,代碼在容器中獲取該值即可。

操作:

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

如果使用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) # 在這設置
 ports:
  - 3306:3306
 volumes:
  - /opt/data/mysql:/var/lib/mysql:z

啟動(dòng)成功后,容器內部環(huán)境變量就多了一個(gè)HOST_Q,接下來(lái)使用程序取出即可:

nodejs:

# 從process中取出環(huán)境變量對象
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容器無(wú)法訪(fǎng)問(wèn)宿主機報出 No route to host

一. 問(wèn)題描述

在docker部署nacos的時(shí)候遇到了這個(gè)樣子的問(wèn)題No route to host 導致了nacos容器無(wú)法連接宿主機的docker數據。

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

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

二. 原因分析

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

啟動(dòng)docker時(shí),docker進(jìn)程會(huì )創(chuàng )建一個(gè)名為docker0的虛擬網(wǎng)橋,用于宿主機與容器之間的通信。當啟動(dòng)一個(gè)docker容器時(shí),docker容器將會(huì )附加到虛擬網(wǎng)橋上,容器內的報文通過(guò)docker0向外轉發(fā)。

如果docker容器訪(fǎng)問(wèn)宿主機,那么docker0網(wǎng)橋將報文直接轉發(fā)到本機,報文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪(fǎng)問(wèn)宿主機以外的機器,docker的SNAT網(wǎng)橋會(huì )將報文的源地址轉換為宿主機的地址,通過(guò)宿主機的網(wǎng)卡向外發(fā)送。

因此,當docker容器訪(fǎng)問(wèn)宿主機時(shí),如果宿主機服務(wù)端口會(huì )被防火墻攔截,從而無(wú)法連通宿主機,出現No route to host的錯誤。

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

三. 解決方案

1> 關(guān)閉宿主機的防火墻

systemctl stop firewalld

2> 在防火墻上開(kāi)發(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,否則容器到因為虛擬網(wǎng)橋失效而導致的iptables failed問(wèn)題

四. 小結

docker的容器網(wǎng)絡(luò )連接一直是一個(gè)問(wèn)題,容器與容器之間,容器與宿主機之間,容器跨主機訪(fǎng)問(wèn),所以在涉及到容器的網(wǎng)絡(luò )連接的時(shí)候要注意網(wǎng)絡(luò )的問(wèn)題。

以上為個(gè)人經(jīng)驗,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

精品无码中文字幕不卡| 亚洲精品乱码久久久久久| 久久青青草原精品国产 | 小黄鸭AV导航总站| 日本熟妇色一本在线观看| 农民工嫖妓50岁老熟女|