Docker网络原理
Docker网络原理
ip addr # 查看网络地址
# 我们安装docker后,就会有一个docker0的网卡(桥接模式),使用的技术是Veth-pair技术.
# 我们每启动一个容器,docker就给容器分配一个ip,并桥接到docker0网卡
启动一个tomcat容器并测试:
启动第二个tomcat容器并测试:
# 我们发现,每个docker容器的网卡,都是成对出现的(10:11)(12:13)
# Veth-pair 就是一对虚拟设备接口,它们都是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性,Veth-pair充当一个桥梁,连接各种虚拟网络设备

测试:tomcat01,tomcat02和宿主机之间互相ping ip,都是可以ping通的

结论:tomcat01和tomcat02是公用一个路由器docker0
所有的容器在不指定网络的情况下,默认都是docker0路由,docker会给每个容器分配一个可用IP。
Docker中的所有网络接口都是虚拟的,因为虚拟的转发效率高(例如:内网传递文件)
--link
-
我们知道,每次重新启动容器,容器IP都会被重新指派,如果应用程序在连接mysql容器的情况下,如果mysql容器ip被改变,应用程序连接数据库的配置ip也需要相应随之改变,否则就无法继续访问mysql。那么,如何才能做到让应用程序不受mysql容器ip变换的影响呢?
-
在docker网络中我们学到,容器之间通过Vech-pair技术实现了通信功能,容器之间通过ip是可以互相ping通的,那么,通过容器名,能互相ping通吗?
docker exec -it tomcat01 ping tomcat02 # 我们发现通过容器名是无法ping通的

-
通过 --link 实现通过容器名,实现容器间的互通
docker run -d -P --name tomcat03 --link tomcat02 diytomcat # 启动tomcat,并--linktomcat02
docker exec -it tomcat03 ping tomcat02 # tomcat03 ping tomcat02![]()
![]()
-
那么问题来了,通过tomcat02能ping通tomcat03吗? 答案是不可以的!正向的连接可以,但反向连接不一定可以,因为反向没有配置,需要在tomcat02里面配置一下。
![]()
-
docker inspect containerID 查看tomcat03的元数据信息,可以发现Links配置信息,而tomcat02是"Links": null
![]()
-
进入tomcat03容器,查看/etc/hosts配置也可以发现,tomcat03容器添加了tomcat02 IP的映射,这就是link的原理
![]()
-
--link在实际中已不推荐使用,因为docker0存在很多的限制,例如不支持容器名(域名)访问等,通过我们都会自定义网络
自定义网络
1.C:\Users\Administrator>docker network ls # 查看docker网络
NETWORK ID NAME DRIVER SCOPE
9e647c9b14c1 bridge bridge local # docker0
81f003c2f271 host host local
806ea8983deb none null local
2.docker network inspect networkID # 查看网卡的元数据信息,里面有docker0以及使用该网络的容器信息
网络模式
1. bridge # 桥接:例如tomcat01和tomcat02本身是无法互通的,但通过docker0这个桥梁,就可以实现互通了(默认)
2. none # 不配置网络
3. host # 和宿主机共享网络
4. container # docker提供的容器网络互通(有局限性,使用少)
开始创建自己的网络
1. docker run -d -P --name tomcat01 tomcat # 这是我们通常启动镜像容器的命令
2. docker run -d -P --name --net bridge tomcat # 但实际上在运行是会默认添加--net bridge(桥接docker0)
# ----------- 创建自己的网络
3. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# --driver bridge (默认)
# --subnet 192.168.0.0/16 子网地址(范围:192.168.0.2 - 192.168.255.255)
# --gateway 192.168.0.1 网关(路由器地址)
4. docker netword inspect mynet # 查看自己创建的网络元数据信息,到这里我们自己的网络就创建好了

使用自己创建的网络
1. docker run -d -P --name tomcat01 --net mynet tomcat # 使用自己的网络启动tomcat01
2. docker run -d -P --name tomcat02 --net mynet tomcat # 使用自己的网络启动tomcat02
3. docker network inspect mynet # 这时候查看mynet网络元数据,就会发现多了tomcat01和tomcat02容器网络配置

使用自定义网络的好处
1. docker exec -it tomcat01 ping 182.168.0.3 # ip ping
2. docker exec -it tomcat01 ping tomcat02 # 容器名 ping
# 自定义的网络,docker都已经帮我们维护好了网络间的对应关系,实际工作中推荐这样使用!

在实际工作中,不同的集群使用不同的网络,来保证集群的安全和健康。例如:redis集群使用redis网络,mysql集群使用mysql网络,这两个网络是互不相通的(网段不同),那么怎么解决网络间的互通呢?

网络互通
1.docker network --help
connect Connect a container to a network
2. docker run -d -P --name tomcat01 tomcat # 使用默认docker0网络启动tomcat01
3. docker run -d -P --name tomcat02 tomcat # 使用默认docker0网络启动tomcat02
4. docker run -d -P --name tomcat-mynet01 --net mynet tomcat # 使用自定义网络启动tomcat-mynet01
5. docker run -d -P --name tomcat-mynet02 --net mynet tomcat # 使用自定义网络启动tomcat-mynet02
# 此时tomcat01和tomcat02是一个网络段的,tomcat-mynet01和tomcat-mynet02是一个网络段的,两个网络互不相通
6. docker exec -it tomcat01 ping tomcat02 # 测试:不通(ip通),虽在同一网络,但docker0有限制,需--link
7. docker exec -it tomcat01 ping tomcat-mynet01 # 测试,不通,因不在同一网段
8. docker exec -it tomcat-mynet02 ping tomcat-mynet01 # 测试,通(自定义网络的优势)
---
9. docker network connect mynet tomcat01 # 让mynet网络与tomcat01容器互通
10. docker exec -it tomcat01 ping tomcat-mynet01 # 测试:通
11. docker network inspect mynet # 查看mynet网络元数据,我们会发现,tomcat01直接被加入到了mynet网络中
# 这样情况官网叫法:一个容器两个IP,就好比公网IP和私网IP
# 正常情况下,网卡和网卡是无法打通的,但容器和网络是可以打通的







浙公网安备 33010602011771号