网站运营
位置:首页>> 网站运营>> docker容器中无法获取宿主机hostname的解决方案

docker容器中无法获取宿主机hostname的解决方案

作者:任庆  发布时间:2021-07-26 02:13:41 

标签: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的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/nickDaDa/article/details/89357667

0
投稿

猜你喜欢

  • 核心提示:经过经过几年来的观察与实践,这个模型已经基本能够涵盖和解释大部分的社区网站结构,同时,所有的网站盈利模式也包含在其中。基础层:万丈
  • 核心提示:整站优化对于搜索引擎营销来说是一个必不可少的环节,是否能够做好整站优化关系着网站搜索营销的效果的好坏,并且搜索引擎营销SEM对于网
  • 这几天很多朋友的站都不同程度的快照回档,有的甚至直接被k的一页都不剩了,包括我自己的小站114美女也不能幸免,于是咨询了很多业内知名人士,总
  • 本人作站也有段不少的时间了。今天闲来无事说一下我的做站优化思路吧。其中也许会有些地方是错误的,请高手给扶正一下。经过近一年时间来对GOOGL
  • 本文介绍了CentOS下MySQL的彻底卸载的几种方法,分享给大家,具体如下:1:查看MySQL是否安装:方式1:[root@localho
  • seo新手也许会误解,也许是静态化好理解,现在很多新手,对一个网站进行优化诊断,第一个步骤就是不管三七二十一,建议客户进行页面静态化。页面由
  • Ubuntu 20.04已经在2020年4月份正式发布,笔者今天正式安装了一个镜像系统,并在该系统中安装vncserver以便于远程图形化管
  • 有人问到“国内以产品为王的公司有哪些?”此问题放大来谈,就是说以产品为核心竞争力的互联网有公司有哪些?问题很尖锐,因为目前以产品为核心竞争力
  • VMware vSphere 是业界领先且最可靠的虚拟化平台。vSphere将应用程序和操作系统从底层硬件分离出来,从而简化了 IT操作。您
  • 现在是个人主页风行的年代,只要上网,必定穿梭在网上人家的大街小巷之中。不可否认,这些网站当中优秀的比比皆是,但不值一提的网站也是屡见不鲜。显
  • 1、使用Akisment或者Math Comment插件,保护博客不受垃圾链接的侵扰;2、将Google Analytics等统计服务代码尽
  • 第一步:数据表修改首先将数据表中的keyword的varchar()改为varchar(任意长度,例如200)dede_archivesde
  • Exchange Server2007 已经面市将近一年了,相信大家一定对它的强大功能已经有所体验了,其中值得我们关注的就是Exchange
  • 1,TCP/IP半开连接数限制是绝对不存在的2,Windows Server 2008的协议栈设计与Vista基本上相同,相对于X
  • 本修改经过多次测试在 大部分国外空间都安装正常。如果不会修改的,请下载我提供的dedecms5.1UTF-8英文版本 文章模块。已经修改好的
  • 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个
  • 随着校园网络建设和应用的逐步深入,越来越多的学校建立了自己的Web服务器。IIS(Internet Information Server)作
  • 1、网站打开的速度要快;网站的打开速度,直接影响用户对所使用网站的感受。很难想像,一个半天都打不开的网站会给浏览者一种什么样的感觉。如果是我
  • 首先,在这里感谢军哥和LEB博主,这个一键包主要借鉴的就是这两位高手的脚本。其中前端后端配置是军哥的,脚本的主要结构是LEB的。请向上面两位
  • 什么是 vim?Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来
手机版 网站运营 asp之家 www.aspxhome.com