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

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网络如何路由


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值