0.Docker网络与宿主机网络的关系
容器默认使用宿主机上的网络栈。当你创建一个容器时,Docker 会为该容器配置一个虚拟的网络接口,这个接口可以理解为一个虚拟网卡,它连接到宿主机的网络栈中。
容器与宿主机之间的通信是通过宿主机的网络来实现的。当容器需要与宿主机通信时,它们可以直接通过宿主机上的 IP 地址或主机名进行通信。这种通信在网络层面上是相当高效的,因为容器和宿主机共享同一个网络栈,不需要经过额外的网络转发或路由。
对外通信则需要通过网络端口映射或者 Docker 网络模式来实现。Docker 提供了多种网络模式,例如桥接模式、主机模式、overlay 等,每种模式都有不同的特性和适用场景。其中,桥接模式是最常用的一种模式,它会为每个容器分配一个独立的 IP 地址,并使用网络地址转换(NAT)来实现容器与外部网络的通信。在桥接模式下,可以通过 -p 参数或者 Docker Compose 中的端口映射来将容器内部的端口映射到宿主机上的端口,从而实现容器对外提供服务的功能。
1.禁用docker自动修改iptables规则
查看docker.service文件/usr/lib/systemd/system/docker.service
默认在宿主机部署容器,映射了端口的话,docker能自己修改iptables规则,把这些端口暴露到公网。
如果要求这些端口不能暴露到公网,则可以在docker.service加上–iptables=false这个配置,则可以禁用掉此功能。随之而来的问题是,需要自己配置网络流量在宿主机网口和docker桥接网口之间的流转,否则就会出现网络流量只能出去,回不来的情况。
解决这个问题可以先不添加–iptables=false,让docker服务先运行起来,它就自己创建了对应的规则,然后通过iptables-save > ./iptables.txt 命令把iptables规则保存成一个文件。再把文件内的暴露端口的相关规则删除掉。然后通过iptables-restore < ./iptables.txt命令把规则刷到iptables即可。需要的就是下面这些流量转发的规则。
然后iptables需要放开对docker 网络中指定ip段的访问即可。
如果使用的是firewalld并不使用iptables,则需要编辑/etc/firewalld/direct.xml文件中的规则并重新加载防火墙以激活这些规则。Direct 规则主要由服务或应用程序用来添加特定的防火墙规则。
参考:https://blog.csdn.net/qq_38263083/article/details/130385278
这篇文章详细说明了docker 网络对iptables的影响:https://blog.csdn.net/weixin_39789525/article/details/110640003
Docker 添加了 DOCKER, DOCKER-USER, DOCKER-ISOLATION-STAGE-1, DOCKER-ISOLATION-STAGE-2 四条链
2.docker网络的NAT
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
docker容器无法访问宿主机报出 No route to host
docker网络和iptables规则
3.docker网络类型
- bridge,使用bridge类型的驱动,这个网络就是我们一直在用的默认网络,此网络使用docker0作为虚拟交换机。
- host,使用host类型的驱动,当容器接入此网络时,会共享宿主机的网络空间。
- none,没有使用任何类型的网络驱动,当容器使用none网络时,表示禁用网络。
- overlay,使得多个Docker主机可以连接在一起,形成一个虚拟网络,从而实现多主机之间的容器通信。Docker Overlay网络使用VXLAN协议实现跨主机的网络通信。
当你初始化一个 Swarm 或将一个Docker主机加入到一个现有的Swarm时,在该Docker主机上会创建两个新的网络:
- 一个ingress的 overlay 网络,它处理与 swarm 服务相关的控制和数据流量。当你创建一个 swarm 服务,并且没有把它连接到用户定义的 overlay 网络时,它默认连接到 ingress 网络。
- 一个docker_gwbridge 的 bridge 网络,它将单个 Docker daemon 与 Swarm 里的其他daemon 连接起来。
4.会影响docker网络的iptables配置
1.DOCKER链规则:Docker使用名为DOCKER的链来管理容器的网络流量。确保不要删除或阻止DOCKER链中的规则,否则可能导致Docker容器无法访问网络。
iptables -L DOCKER -n
2.NAT规则:Docker使用NAT来实现容器的网络地址转换。确保不要阻止Docker容器的网络地址转换规则。
iptables -L -t nat
3.FORWARD链规则:Docker容器之间的网络通信通常是通过FORWARD链实现的。确保不要阻止Docker容器之间的通信。
iptables -L FORWARD -n
4.INPUT链规则:如果你的Docker容器需要从外部访问,确保不要阻止Docker容器的输入流量。
iptables -L INPUT -n
5.OUTPUT链规则:确保不要阻止Docker容器的输出流量。
iptables -L OUTPUT -n
这些规则中的任何一个被修改或者删除都有可能影响到Docker服务的网络通信。修改iptables规则时务必谨慎,并确保你了解如何操作以及对Docker服务的网络通信可能产生的影响。
docker overlay网络原理详解
docker swarm网络如何路由