docker从容器中怎么访问宿主机

docker从容器中怎么访问宿主机,第1张

在你的宿主机启动docker的时候会多出一个docker0的虚拟网卡,然后容器都通过这个和外面通信。容器和docker宿主机之间是NAT的方式共享网络的,也就是说宿主机可以访问的资源,容器也是可以直接访问,你要使用apt-get,你就要保证你的宿主机可以上外网,否则免谈。

只要在宿主机里正常共享就行,虚拟机里的Linux可以通过smb/cifs协议来访问宿主机,不过需要你安装一个小工具smbclient,通常这条命令在samba的软件包里,也可以通过桌面的文件管理器来访问,比如你的宿主机ip192.168.0.1共享了一个共享名为123的文件夹,那么就可以在文件管理器的地址栏里输入\\192.168.0.1\123来访问了,前提是你的虚拟机里的Linux系统获得了ip地址

[TOC]

一般我们在创建容器的时候都可以 -p 指定多个端口或者 -P 指定随机端口,但是比较麻烦的是我们在创建了容器之后又想映射多一个或者多个端口,但是这时候docker 又没有支持的命令进行 *** 作。

那首先就需要先了解docker 端口映射是怎么一个工作原理了。

一般情况下,容器是可以访问外网,而外部网络是不能访问到容器的。

容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 iptables 的源地址转换实现的。

查看宿主机的NAT表

可以看到上面的iptables的规则把所有源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量都进行了转换(伪装)从宿主机的网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。

以上的端口转换是在创建容器时指定的:

使用 -p 命令来进行端口映射,在这里可以看出,当外部访问宿主机与容器所映射的端口时,iptables 的NAT表会对目的端口进行转换,转换为相应的容器的 ip:port

经过上面的分析我们知道了外部网络是如何访问带容器内部的。

因此我们需要添加 DNAT 规则以及允许访问宿主机的容器IP和端口。

测试

在容器中用 nc 监听一个端口

然后添加了上面两条防火墙规则后,再去测试能否连通宿主机的 123 端口

验证了是可以通的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8727136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存