在nodejs環(huán)境中測試通過,其它語言同理,只需要使用獲取環(huán)境變量的方法即可。
成都創(chuàng)新互聯(lián)公司是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、小程序制作、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十年以來,已經(jīng)為成百上千家VR全景各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的成百上千家客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。
思路:docker容器和宿主機環(huán)境是隔離的,但是可以在啟動docker容器時將宿主機的主機名以環(huán)境變量的形式傳入,代碼在容器中獲取該值即可。
操作:docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # 使用-e 參數(shù)傳入環(huán)境變量,值為主機名如果使用yml文件啟動:
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啟動成功后,容器內(nèi)部環(huán)境變量就多了一個HOST_Q,接下來使用程序取出即可:
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補充:docker容器無法訪問宿主機報出 No route to host
一. 問題描述在docker部署nacos的時候遇到了這個樣子的問題No route to host 導(dǎo)致了nacos容器無法連接宿主機的docker數(shù)據(jù)庫。
然后我就進(jìn)入到了nacos容器里面,ping了宿主機的地址,結(jié)果是通著的,然后使用telnet測試了3306端口,結(jié)果也會報出這個異常。
原因是什么呢?明明數(shù)據(jù)庫外部可以正常連接訪問,但是宿主機內(nèi)部容器確實無法訪問?
二. 原因分析在進(jìn)行docker部署的時候我們采用的是bridge網(wǎng)橋的模式。
啟動docker時,docker進(jìn)程會創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,用于宿主機與容器之間的通信。當(dāng)啟動一個docker容器時,docker容器將會附加到虛擬網(wǎng)橋上,容器內(nèi)的報文通過docker0向外轉(zhuǎn)發(fā)。
如果docker容器訪問宿主機,那么docker0網(wǎng)橋?qū)笪闹苯愚D(zhuǎn)發(fā)到本機,報文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪問宿主機以外的機器,docker的SNAT網(wǎng)橋會將報文的源地址轉(zhuǎn)換為宿主機的地址,通過宿主機的網(wǎng)卡向外發(fā)送。
因此,當(dāng)docker容器訪問宿主機時,如果宿主機服務(wù)端口會被防火墻攔截,從而無法連通宿主機,出現(xiàn)No route to host的錯誤。
而訪問宿主機所在局域網(wǎng)內(nèi)的其他機器,由于報文的源地址是宿主機ip,因此,不會被目的機器防火墻攔截,所以可以訪問。
三. 解決方案1> 關(guān)閉宿主機的防火墻systemctl stop firewalld2> 在防火墻上開發(fā)指定的端口firewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --zone=public --add-port=3307/tcp --permanentfirewall-cmd --reload注:在進(jìn)行完防火墻的操作之后最好是要進(jìn)行以下docker的重啟,systemctl restart docker,否則容器到因為虛擬網(wǎng)橋失效而導(dǎo)致的iptables failed問題
四. 小結(jié)docker的容器網(wǎng)絡(luò)連接一直是一個問題,容器與容器之間,容器與宿主機之間,容器跨主機訪問,所以在涉及到容器的網(wǎng)絡(luò)連接的時候要注意網(wǎng)絡(luò)的問題。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。