天天看点

Docker网络模式实现原理

Docker网络模式

  • 实现原理
    • 四类网络模式
    • *bridge模式
    • *多机覆盖网络
    • *Ingress 网络
    • *覆盖网络

转 Docker网络模式

实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p或-P参数来启用,访问容器的时候就通过【宿主机IP】:【容器端口】访问容器

四类网络模式

Docker网络模式/配置 /说明

  • host模式/-net=host/容器和宿主共享Network namespace
  • conatiner模式/-net=container:NAME_or_ID/容器和另外一个容器共享Network namespace。kubernets中的pod就是多个容器共享一个Network namespace
  • none模式/-net=none/容器有独立的Network Namespace,但并没有对齐进行任何网络设置,如分配veth pair和网桥连接,配置IP等
  • bridge模式/-net=bridge/默认为该模式

*bridge模式

通过bridge模式实现一个docker部署远程的rocketmq集群

参考:部署远程的rocketmq集群

tips:

- 在修改rocketmq的配置文件,或者docker-compose.yml后需要重新部署应用使其变更生效 意思就是docker-compose restart的作用 != reload ; restart命令会重启已停止的Compose应用

*多机覆盖网络

覆盖忘了适用于多机环境.它允许单个网络包含多个主机,这样不同主机上的容器间就可以在链路层实现通信,覆盖忘了视理想的容器间通信方式,支持完全容器话的应用,并且具备良好的伸缩性

docker network create -d overlay

*Ingress 网络

通过Ingress模式发布的服务,可以保证从Swarm集群内任意一节点(即使没有运行服务的副本)都能访问该服务;以host模式发布的服务只能通过允许服务副本的节点来访问

*覆盖网络

docker覆盖网络: docker network create -d overlay uber-net <创建一个覆盖网络>

工作原理:VXLAN,docker使用VXLAN隧道技术创建了虚拟二层覆盖网络。因此两台不同物理IP的主机上的容器,通过这个VXLAN隧道能够连接在一起

Docker网络模式实现原理

通信示例:

在本例中,将node1上的容器称为C1,node2上的容器称为C2

  1. C1发起ping请求,目标IP为C2的地址10.0.0.4。
  2. 该请求流量通过连接到Br0虚拟交换机的veth接口发出
  3. 虚拟交换机并不知道将包发送到哪里,因为在虚拟交换机的MAC地址映射表(ARP映射表)中并没有与当前目的IP对应的MAC地址。所以虚拟交换机会将该包发送到其上的全部端口
  4. 连接到Br0的VTEP接口知道如何转发这个数据帧,所以将自己的MAC地址返回
  5. 这就是一个代理的ARP响应
  6. 接下来虚拟交换机更新自己的ARP映射表,将10.0.0.4映射到本地的VTEP的MAC地址上
  7. 交换机将包转发到VTEP接口,VTEP完成数据帧的封装,这样就能在底层网络中进行传输了
  8. 数据包根据端口号进行转发,到达C2容器