宿主机的地址比如是192.168.1.51

而docker容器比如web1,的ip地址是172.17.0.3

容器如何与外界通信?

通过NAT,网络地址转换

首先,宿主机需要设置

echo  'net.ipv4.ip_forward =1 '  >>  /etc/sysctl.conf

sysctl  -p

开启路由转发功能

那么docker 容器就可以用路由转发的方式

通过宿主机和外界通信

但问题是,docker的172网段如何与192.168网段通信。

是由于docker软件在运行容器的时候

会自动配置SNAT和DNAT这些iptables的规则

容器访问外界的时候,报文的源ip被修改为宿主机的ip,

数据返回时,

在宿主机收到响应数据包之后,NAT会根据之前保存的转换记录(NAT表项)将数据包的目的IP地址改回容器的私有IP地址,然后将数据包发送给正确的容器。

这样就完成的容器对外界的访问。

外界对容器内部服务访问的链路流程:

外部请求流程:

外部客户端发送请求到宿主机的公共IP地址和端口。
请求通过 PREROUTING 链进行 DNAT 转换。
请求通过 INPUT 链到达容器。
容器处理请求并生成响应。
容器响应流程:

容器生成响应数据包。
响应数据包通过 docker0 接口到达宿主机。
响应数据包通过 POSTROUTING 链进行 SNAT 转换。
响应数据包通过外部网络接口发送到外部客户端。

通过这种方式,Docker 自动配置的 NAT 规则确保了外部网络可以访问容器内的服务,同时也保证了容器可以正常响应外部请求。

总的来说,当宿主机上安装了docker软件之后,docker会自动把容器需要用的iptables的四表五链的各种规则设置好,以保证容器与外界的通信。

可以这么来说,k8s作为好用的容器编排管理工具,可以很好的提供自动化容器管理服务。但同时,容器化的基础还是建立在docker联合行业所指定的一系列规则的基础之上的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐