Docker网络:

  • docker 为什么需要网络?
    • 容器与容器,容器与宿主机需要通信。

1: Docker通信机制(桥接)

  • 1: docker启动的时候会在主机上创建一个docker0的网桥,并且给这个网桥分配一个私有网段(172.17.0.1)

  • 2:当我们创建容器的时候,会同时创建一个Veth接口对,这个接口对有两个,一个就是docker容器内部的eth0, 另一个保存在网桥上。这个接口对的作用是同步数据包。同时,创建的docker会同时创建一个与网桥在同一个网段的IP地址。

  • 3:主机与容器通信: 主机发送数据包(携带docker的目的IP)到网桥—>网桥在所有Veth对中查找这个IP,然后将数据包转发给接口---->接口对会同时得到这个数据包,也就是docker中的eth0就拿到了这个数据包。

  • 4:容器与容器之间进行通讯:容器A发送数据包给容器B---->网桥先收到这个数据包,网桥查询目的docker的IP,将数据包转发给与B通信的接口对—>容器B的eth0

  • 图示:
    (三)docker 网络_it技术

2: 通信机制存在的问题

  • 1: 这样的桥接方式导致当某个传输数据太频繁的时候,导致其他的docker通信受阻,(因为网桥带宽原因)。

  • 2: 每次创建docker,都是自动分配IP,这就导致每次都要查看IP。

  • 3:因此,在实战中,我们不同的项目要建立不同的网桥,因为项目于项目之间基本是不需要通信的。

3: 创建网桥

  • 1: 查看网桥配置:

    • docker network ls

      NETWORK ID     NAME      DRIVER    SCOPE
      be1a8ac6789f   bridge    bridge    local
      7f55c4454162   host      host      local
      08ba9b9e5b66   none      null      local
      
  • 2: 创建网桥:

    • docker network create tianyan_network

      renshanwen@A230604-nc01:~$ docker network create tianyan_network
      e9dd93eb9afbf7999878415d28b04fbe51aa816d0f1b252b98b6d7f0a7debabb
      
  • 3: 启动容器指定网桥:

    • 启动增加–network参数即可

      renshanwen@A230604-nc01:~$ docker run -d  --name centos_33  --network tianyan_network centos
      bd8da7c6e4d963fa9f99e918b412146d89e598cf2e22356b6011eb198b5ca335
      
  • 4: 现在存在问题

    • 由于创建网桥是随机分配IP,导致网桥关联的容器也是随机IP,现在这个网桥有三个应用:A: Mysql, B : ES, C:tianyan应用,如果A,B,C三者进行相互通信,网桥地址是改变的,如何保证通信呢?
    • docker创建的时候会将自己的名字与自己创建的Ip地址进行一个映射,因此我们项目中直接使用docker名称作为IP就可以了,这样无论docker的IP地址如何改变,同个网桥内的docker是可以相互通信的。
  • 5: 网桥的删除:

    • docker network rm 网桥的名称
  • 6: 查看网桥的信息:

    • docker network inspect 网桥名称

    • 网桥的信息中包含网桥关联所有docker的IP地址。