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
-
图示:
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地址。
-