gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章docker容器中无法获取宿主机hostname的解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

在nodejs环境中测试通过,其它语言同理,只需要使用获取环境变量的方法即可.

思路:

docker容器和宿主机环境是隔离的,但是可以在启动docker容器时将宿主机的主机名以环境变量的形式传入,代码在容器中获取该值即可.

操作:

?
1
docker run -d -p 3000:3000 --name myTest -e HOST_Q=$( hostname ) mytest:v1 # 使用-e 参数传入环境变量,值为主机名

如果使用yml文件启动:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:

?
1
2
3
4
5
6
7
# 从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:

?
1
2
3
4
5
6
7
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> 关闭宿主机的防火墙 。

?
1
systemctl stop firewalld

2> 在防火墙上开发指定的端口 。

?
1
2
3
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的解决方案的文章就讲到这里了,如果你想了解更多关于docker容器中无法获取宿主机hostname的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com