docker的网络模式

本文详细介绍了Docker的四种网络模式:bridge、host、none和container,以及它们的特点和应用场景。同时,讨论了Docker容器互联的网络方案,如overlay网络和常用的网络插件如flannel、calico,以及CNI和CNM规范的作用。重点讲解了不同网络模式下容器的通信方式和性能差异,为Docker网络配置提供了深入理解。

一、docker容器的4种网络模式:

      1、 bridge模式:使用--net=bridge指定,默认设置

     桥接模式,一个主机上的容器是通过本主机的网卡来通讯的,每个容器有独立的IP地址,并且在本机上是可以ping通的。

     Docker0网卡相当于一个交换机,相当于是在一台主机上创建一个vlan,一台主机上的所有容器都是通过docker0来通讯的,docker0再与主机网络端口路由连接通讯,通过nat方式访问外网。

网络是单向的,可以从内到外,但外网无法访问容器网络。Ip  route.可以采用端口映射的方式访问容器内部网络,之前的版本docker-proxy 进程负责实现端口映射功能(userland-proxy=false选项关闭docker-proxy,因为每个docker-proxy会直接消耗4-10M内存和1个进程),这个过程中并没有用到DNAT,而是完全依靠docker-proxy做的4层代理,这点与现在的k8有些区别,k8s用的ip-table内核转发。

     打通多个主机上的容器网络,可以用overlay,在主机物理网络之上做虚拟网络来通讯。

     ​​​​​ 2、 Host模式: 使用--net=host指定

     主机模式,容器不产生网卡(但容器内可以看到docker0网卡,这并不是容器的),而是直接用主机的IP地址和网络堆栈来通讯,经常是一个主机上只开一个容器,给予其一个端口使用,它没有网路损耗,网络性能最高。

    例:host网络模式的mysql容器,在网络性能上与native  mysql没有什么差异

      3、 None模式: 使用--net=none指定

     jnone模式:不分配不指定网卡,主要为了编程服务,可以用户(程序)通过api的方式生成网卡(也可以分配多个网卡)并实现固定IP这样的特殊功能

       4、 Container模式: 使用--net=container:NAME_or_ID指定

用的较少,几个容器共用一个network namespace 虚拟网卡,即共享某个容器的TCP/IP栈,共享一个IP,在一个主机上的多个container可以通讯。

例:docker  run --name=mybox -it  busybox  sh    >>>>   ip  a

    Docker  run --net=container:mybox  it  busybox  sh   >>>>  ip  a

可以看出两个容器的ip栈是完全一样的。

K8s pod的pause容器与用户的容器之间即采用了container网络模式,共享pause的ip地址。

 

二、docker容器互联的网络方案:

Overlay网络的3种主流报文封包协议,GRE隧道(微软级的协议)、vxlan(标准化的网络厂商级的协议,有硬件支持)、自定义封包隧道,现在更倾向于vxlan,其可以理解为2层交换,虚拟化的网,把容器的IP地址加进来,范围更大一些。Docker使用vxlan封包实现overlay网络。

      1 、 coreos做的flannel网络(比较早的)

    特点:没有复杂的配置,是自动完成路由(两台主机相当于是两个路由器,路由交换模式实现网络相通)的方式,报文的封装是自动完成的,用的是udp的方式。各容器IP地址不能是重复的。Vxlan是比较标准的方式。

      2、  三层路由模式

把每个容器的主机都当成一个路由器,这台主机去分发容器的报文,不需要改变容器的报文,容器网络报文直接直传,不用做封装,可以提升性能。需要开启linux的ipforward的路由转发功能

echo  “1”  >  /proc/sys/net/ipv4/ip_forward

IPVlan三层路由模式,是用容器的IP地址作为转发,是路由模式,需要在路由器上配置路由。需要LINUX kerner 3.19以上版本。K8S也可以使用。

calico的三层路由网络模式,报文通过物理网络走,用BGp网络协议(属于边界网关协议),可以做大规模的容器网络

      3、 layer 二层网络模式

     Macvlan模式,需要linux内核支持,需要v3.9以上的版本,它是由mac地址对应vlan的,利用mac地址做二层交换。K8s也可以使用

三、 Docker网络插件规范:

   Docker如何统一纳入各种容器网络方案呢,运用标准的网络插件规范。容器网络插件的两种标准规范。

     1、  Docker的cnm规范

     2、  OCI   的 cni规范

   接口层很简单,CNI插件是一个可执行文件,配置好容器网络后,给容器返回IP路由等信息,容器内部就可以用ip地址路由通讯。现在一般用CNI规范,docker容器不可能只有一个网卡,可能有多个网卡,可以动态编程方式增删,利用CNI规范。

### Docker 网络模式详解及配置方法 #### 1. **Bridge 模式** 这是 Docker 默认的网络模式。当启动一个容器时,如果没有显式指定 `--network` 参数,则会自动使用 Bridge 模式[^2]。在这种模式下,Docker 守护进程会在主机上创建一个名为 `docker0` 的虚拟网桥,并为每个容器分配独立的 IP 地址和子网掩码。 - 配置方式: ```bash docker run --network=bridge <image_name> ``` 这种模式适合大多数场景下的应用部署需求,因为它提供了良好的隔离性和灵活性。 --- #### 2. **Host 模式** 在 Host 模式下,容器不会被分配单独的网络命名空间,而是共享宿主机的操作系统网络栈。这意味着容器内的服务可以直接绑定到宿主机的真实接口地址,而无需 NAT 或端口映射操作。 - 配置方式: ```bash docker run --network=host <image_name> ``` 需要注意的是,在此模式下运行的应用可能会与其他正在监听相同端口号的服务发生冲突。 --- #### 3. **None 模式** 如果希望完全屏蔽掉某个特定容器对外部世界的访问能力,可以选用 None 模式。此时除了 loopback 接口外不会再有其他任何形式的联网支持存在[^4]。 - 配置方式: ```bash docker run --network=none <image_name> ``` 用户需手动完成所有的必要设置比如添加额外物理适配器或者调整路由表项等工作才能让此类实例重新获得连通性。 --- #### 4. 自定义 Overlay/Custom Networks (User-defined networks) 为了实现更复杂的跨节点集群环境中的多台机器之间相互协作的需求, 可以考虑构建自定义overlay类型的逻辑拓扑结构来满足实际业务情况的要求[^3]. 这种高级别的抽象层允许不同主机上的多个容器彼此透明地交换数据包而不必关心底层具体的传输细节. - 创建一个新的覆盖型网络: ```bash docker network create -d overlay my_overlay_network ``` 之后就可以像平常一样把新产生的资源关联至目标镜像文件之上啦! --- ### 总结 每种 docker 网络模型都有其独特之处以及适用范围。对于简单的单机测试用途来说 bridge 已经足够强大;而对于追求极致性能表现又不想牺牲太多安全性的朋友而言 host 则是个不错的选择;最后当我们面临分布式计算框架搭建难题的时候不妨试试看 user defined ones 吧!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值