docker容器内部怎么查看id(docker容器中无法获取宿主机hostname的解决方案)
docker容器内部怎么查看id
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的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持开心学习网。如有错误或未考虑完全的地方,望不吝赐教。
- dockercompose的常用命令的作用(PIP安装docker-compose超时问题解决方案)
- dockerswarm网络模式(详解Docker Swarm概念与用法)
- docker中的mongodb(Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解)
- docker安装java8(docker安装java环境的实现步骤)
- elasticsearch docker(在Docker中安装Elasticsearch7.6.2的教程)
- docker 网络映射启动失败(解决docker安装完成报:bridge-nf-call-iptables is disabled问题)
- docker配置源不生效(解决docker CMD/ENTRYPOINT执行sh脚本报: not found/run.sh:)
- docker启动springboot项目(Docker运行springboot项目的实现)
- docker进入redis容器(Docker配置redis哨兵模式的方法多服务器上)
- 在windows安装docker详细步骤(Docker 部署 Prometheus的安装详细教程)
- docker如何搭建mysql(docker容器访问宿主机的MySQL操作)
- docker 退出容器详解(Docker 使用nsenter工具进入容器的操作)
- docker 容器端口查不到(docker容器无法访问宿主机端口的解决)
- dockerfile挂载目录(解决docker run中使用 ./ 相对路径挂载文件或目录失败的问题)
- docker数据卷是什么(Docker数据卷容器创建及使用方法解析)
- linux下python安装pip(在Docker中的ubuntu中安装Python3和Pip的问题)
- 阴阳师孟婆御魂推荐 孟婆御魂搭配毕业套(阴阳师孟婆御魂推荐)
- 袁冰妍终于接到新剧,饰演反追男主,看到合作演员 眼光果然毒辣(袁冰妍终于接到新剧)
- 记忆中的台词(记忆中的台词)
- 袁冰妍轧戏 拍《琉璃》的同时还在拍《将夜》,难怪被骂演技差(拍琉璃的同时还在拍将夜)
- 刚红就耍大牌,《琉璃》角色滤镜碎一地,心疼工作人员(琉璃角色滤镜碎一地)
- 袁冰妍郑业成这对可以处,有脸红情话他们是真的敢说(袁冰妍郑业成这对可以处)
热门推荐
- docker容器内部怎么查看id(docker容器中无法获取宿主机hostname的解决方案)
- sql server数据库权限(SQL Server中通用数据库角色权限的处理详解)
- windows10怎么设置iis框架(Windows10系统如何安装IIS服务器)
- python实现栈和队列(Python利用heapq实现一个优先级队列的方法)
- 操作mysql的jdbc(JDBC连接的六步实例代码与mysql连接)
- dedecms有哪些功能(dedecms 二次开发之审核时间同步更新)
- php nginx 底层执行流程(nginx/apache/php隐藏http头部版本信息的实现方法)
- docker容器重启配置没了(docker修改未启动容器的配置信息操作)
- python函数的参数有几种类型(在Python中居然可以定义两个同名参数的函数)
- php开发模式有哪些(PHP设计模式之简单工厂和工厂模式实例分析)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9