宿主机的地址比如是192.168.1.51
而docker容器比如web1,的ip地址是172.17.0.3
容器如何与外界通信?
通过NAT,网络地址转换
首先,宿主机需要设置
echo 'net.ipv4.ip_forward =1 ' >> /etc/sysctl.conf
sysctl -p
开启路由转发功能
通过宿主机和外界通信
但问题是,docker的172网段如何与192.168网段通信。
会自动配置SNAT和DNAT这些iptables的规则
容器访问外界的时候,报文的源ip被修改为宿主机的ip,
数据返回时,
在宿主机收到响应数据包之后,NAT会根据之前保存的转换记录(NAT表项)将数据包的目的IP地址改回容器的私有IP地址,然后将数据包发送给正确的容器。
这样就完成的容器对外界的访问。
外界对容器内部服务访问的链路流程:
外部请求流程:外部客户端发送请求到宿主机的公共IP地址和端口。
请求通过 PREROUTING 链进行 DNAT 转换。
请求通过 INPUT 链到达容器。
容器处理请求并生成响应。
容器响应流程:容器生成响应数据包。
响应数据包通过 docker0 接口到达宿主机。
响应数据包通过 POSTROUTING 链进行 SNAT 转换。
响应数据包通过外部网络接口发送到外部客户端。
通过这种方式,Docker 自动配置的 NAT 规则确保了外部网络可以访问容器内的服务,同时也保证了容器可以正常响应外部请求。
总的来说,当宿主机上安装了docker软件之后,docker会自动把容器需要用的iptables的四表五链的各种规则设置好,以保证容器与外界的通信。
可以这么来说,k8s作为好用的容器编排管理工具,可以很好的提供自动化容器管理服务。但同时,容器化的基础还是建立在docker联合行业所指定的一系列规则的基础之上的。