一、 docker 0
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥
启动两个容器tomcat01和tomcat02并查看主机和容器网络
# 相关命令
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat02 tomcat
ip addr
docker exec -it tomcat01 ip addr
docker exec -it tomcat02 ip addr
主机:
容器:
此时 docker0、eth0@if7、eth0@if9之间相互均能ping通,主机与容器之间的网络通过桥接的方式连接
# 相关命令
docker exec -it tomcat01 ping 172.17.0.01
docker exec -it tomcat01 ping 172.17.0.03
在主机上创建一对虚拟网卡veth pair设备,veth-pair 就是一对的虚拟设备接口,成对出现,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
二、容器互联 --link(理解原理,不推荐使用)
由于容器启动时ip时随机分配的,如何使用名称ping通,从而达成类似于feign组件那样的高可用场景
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#ping通
docker exec -it tomcat03 ping tomcat02
#ping不通
docker exec -it tomcat02 ping tomcat03
探究原因:
查看tomcat03的容器配置 docker inspect tomcat03
查看tomcat03的hosts配置,发现--link
参数的原理
如果想在tomcat02中通过容器名称ping通tomcat03,可以手动修改其hosts文件后重启。
这种–link的方法是不推荐使用的
在实际开发中我们通过自定义网络来解决
三、自定义网络
1. docker的网络模式
查看所有网络
- Host
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 - Bridge
此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。(默认网络模式,自己创建也使用这个方式
) - None
该模式关闭了容器的网络功能,不创建网络。 - Container
创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
默认方式使用名称为bridge的已有网络
# 之前的创建容器方式带了默认参数 --net bridge
docker run -d -P --name tomcat04 tomcat
docker run -d -P --name tomcat04 --net bridge tomcat
2. 创建网络
创建网络主要参数
创建网络mynet1
用自定义网络mynet1创建两个容器tomcat05和tomcat06
3. 自定义网络的好处
- 直接通过服务(容器)名称通信,实现高可用,比如重新运行mysql(ip重新分配)不必更改连接数据库配置的ip)
- 不同集群使用不同网络,实现集群网络安全与隔离,比如redis和mysql集群使用不同的网络
问题来了
如何实现两个网络间的通信呢
4. 连通网络
将tomcat01与mynet1连通