zoukankan      html  css  js  c++  java
  • Docker网络模型

    Docker网络基础知识

    基于对network namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。按Docker官方的说法,docker容器的网络有五种模式,bridge为默认的,不需要使用-net来指定,而其它的三种却需要在创建容器的时候,使用-net来指定网络模式,最后一种为用户自定义模式

    模式 指定参数
    bridge模式 使用-net=bridge指定,不指定默认会被设置为此模式
    none模式 使用-net=none指定
    host模式 使用-net=host指定
    container模式 使用-net=container:容器名称或ID指定

    Docker网络初始化的过程如下:

    初始化设备 ---> 初始化bridge ---> 初始化iptables ---> 初始化ip forward(内核路由转发) ---> registry network job function ---> end

    Dcoker模式介绍:

    1.bridge模式:docker默认的网络模式,为容器创建独立的网络命令空间,容器具有独立的网卡等所有单独的网络栈。容器从原理上是可以与宿主机及至外界的其他机器通信的。同一台宿主机上,容器之间都是连接到docker0这个网桥上,它可以作为虚拟交换机使容器间相互通信。然而,由于宿主机的IP地址与容器的veth pair的IP地址均不在同一个网段,所以仅仅依靠veth pair和namesapce的技术,还不足以使宿主机以外的网络主动发现容器的在下。为了使外界可以访问容器中的进程,docker采用了端口绑定的方式,也即是通过iptables的NAT,将宿主机上的端口流量转发到容器内的端口上。

    bridge模式中的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,对宿主机端口的管理会是一个比较在的问题,同时,由于容器与外界通信是基于三层iptables NAT,性能和效率上的损耗肯定是不可避免的

    1587658393048

    2.host模式:容器直接与宿主机使用同一网络命令空间,采用此模式的容器,可以直接使用宿主机的IP地址与外面进行通信,如宿主机具有公网的IP地址时,那容器也会拥有这个公有的IP地址,与此同时,容器内服务的端口地址也能直接使用宿主机的端口,无需再进行额外的NAT转换。由于容器通信时,不再需要通过linux bridge等方式转发或者数据包的拆封,性能上将会得到很大的提高。此种模式有优势,也会存在劣势,主要包括如下几个方面:

    (1)容器将不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈使用,并且容器的崩溃也可能会导致宿主机崩溃,在生产的环境中,这种问题可能是不被允许的

    (2)容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其它服务占用掉了

    1587798579235

    3.none模式:为容器创建独立网络命名空间,但不为它做什么网络配置,容器中只有lo回环地址,用户可以在此基础上,对容器网络做任意的定制

    4.其它容器:与host模式类似,只是容器将与指定的容器共享网卡,其它的网络模式是docker中一种较为特别的网络模式。在此模式下的容器,会使用其它容器的网络命名空间,其网络隔离性会处于bridge桥接模式与host模式之间。当容器共享其他容器的网络命令空间,则在这两个容器之间不存在网络隔离,而它们又与宿主机以及除此之外的其它的容器存在网络隔离

    1587798539625

    5.用户自定义:允许容器使用第三方的网络实现或者创建单独的bridge网络,提供网络隔离功能。除了Docker自动创建的三个网络外,用户可以为Docker创建新的网络。为Dokcer增加新的网络的方式有两种---使用Docker自带的bridge和overlay两种网络驱动,或者提供新的网络插件

    这5种网络模式在相互网络通信方面的对比如下:

    模式 支持多主机 访问外部网络 容器互访
    bridge NO 宿主机端口绑定 Linux bridge
    host YES 宿主机网络 宿主机网络
    none NO 无法通信 只能通过link通信
    其它容器 NO 宿主机端口绑定 通过link通信
    用户自定义 按网络实现而定 按网络实现而定 按网络实现而定

    Docker跨主机之间容器通信的overlay网络模式作简要介绍

    ​ Docker内置overlay网路模式驱动libnetwork,可以用于创建跨多个主机的网络。在同一个overlay网络里的容器,无论运行在哪个主机上,都能相互通信。
    要创建overlay网络,首先要有一个提供key-value存储服务的服务器,当前Docker支持的key-value存储服务器有Consul, Etcd和ZooKeeper. 组成overlay网络的Docker的主机之间、Docker主机和key-value存储服务器之间都要能互通互联。在Docker主机上还要开放如下两个端口:
    udp端口:4789,用于传输VXLAN网络数据的端口
    tcp/udp端口:7946,用于控制平面的端口

    对要加入overlay网络里里的每台Docker主机,都要完成如下配置:
    --cluster-store=PROVIDER://URL/ 配置key-value存储服务器的地址
    --cluster-advertise=HOST_IP|HOST_IFACE:PORT Docker所在的当前主机的地址和端口
    --cluster-store-opt=KEY-VALUE OPTIONS 其他配置信息,如TLS证书等

  • 相关阅读:
    并发与并行的区别
    Java 中的JSON 字符串
    java spark list 转为 RDD 转为 dataset 写入表中
    SparkConf和SparkContext
    Java 中清空map
    java JSON的使用和解析
    presto计算日期间隔天数或者小时间隔——date_diff函数使用
    Nginx 负载均衡配置
    Nginx 反向代理配置示例(conf文件配置)
    前端同学 linux常用指令汇总
  • 原文地址:https://www.cnblogs.com/Heroge/p/12773162.html
Copyright © 2011-2022 走看看