关于docker网络实践中遇到的问题

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 连接起来。

docker overlay网络原理详解
docker swarm网络如何路由