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

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

在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

标签:docker,容器,宿主机,hostname
0
投稿

猜你喜欢

  • 官方消息:Adsense三月付款将延迟

    2008-04-05 13:58:00
  • 图文并茂配置Exchange Server 2003

    2010-03-08 18:46:00
  • 美国主机startlogic图文介绍

    2010-03-30 08:49:00
  • CNNIC:域名转移不存在手续费

    2008-04-23 11:51:00
  • 在Apache服务器上安装SSL支持的教程

    2023-11-03 10:04:19
  • 从A到Z:获得网站流量语汇大全

    2007-09-08 08:31:00
  • Ubuntu 20.04 上安装和使用 Docker的详细过程(安装包)

    2021-11-30 08:49:19
  • 应如何去量化web设计中的用户体验(多图)

    2009-01-12 10:13:00
  • Linux操作系统下设置Telnet方法介绍

    2010-08-17 18:37:00
  • 数据中心虚拟化安全隐患 十步监控预防

    2009-10-21 18:05:00
  • 开发者感兴趣的IE8 beta1的七大改进

    2008-03-09 15:13:00
  • Typecho评论列表不要显示博主回复

    2011-04-22 12:49:00
  • centos7使用supervisor的详细教程

    2021-04-19 21:16:15
  • 详解ubuntu下安装Docker

    2023-10-14 14:43:00
  • .htaccess 顶级域名重定向绑定空间目录

    2023-08-31 19:29:29
  • 把搜索优化做在建站之前 网建与优化结合

    2009-01-20 13:17:00
  • 人民网欲推出微博客产品 近期或上线(图)

    2009-11-13 08:55:00
  • 译言网:如何构建用户喜欢的web2.0网站

    2008-12-31 09:00:00
  • 美国主机BlueHost介绍及购买图文教程

    2010-03-28 17:19:00
  • 如何申请Google AdSense

    2007-08-18 10:46:00
  • asp之家 网站运营 m.aspxhome.com