Docker网络
1、docker0
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理 解为一个软件交换机。它会在挂载到它的网口之间进行转发。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外 一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器 之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
原理:
- 我们每启动一个docker容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0。
- 桥接模式,使用的技术是veth-pair技术。
- 这个容器带来的网卡都是一一对应的。
- veth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
- 正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的。
2、使用link方式连接容器
通过link方式,可以将两个容器相互连接。
使用busybox进行测试,可以直接docker pull busybox拉取镜像
# 启动一个名字为busy1的容器 docker run -itd --name busy1 busybox # 启动一个名字为busy2的容器并且连接busy1 docker run -itd --name busy2 --link busy1 busybox # 进入busy2 docker exec -it busy2 sh # ping busy1 ping busy1
经过测试可以ping通,说明busy2容器已经和busy1相连。
原理:link方式实际上就是在容器的hosts配置中增加一个映射。
# 进入busy2容器 docker exec -it busy2 sh # 查看hosts cat /etc/hosts
如图可以看见,在busy2容器中的hosts,自动配置上了busy1的映射,包括名字和容器id,同理,通过容器id也可以ping通。
3、使用网络连通
3.1、docker安装后会自动生成三个网络,通过 docker network ls 可以查看
# 查看docker网络 docker network ls
- bridge:桥接模式(默认)
- host:和宿主机共享网络
- none:不配置网络
3.2、创建容器并加入网络
# 创建busy1 并加入bridge docker run -itd --name busy1 --net bridge busybox # 创建busy2 并加入bridge docker run -itd --name busy2 --net bridge busybox # 进入busy1 ping busy2 经过测试,只能用容器的内网ip ping,用容器id和容器名称均ping不通 docker exec -it busy1 sh ping 172.17.0.3 # 进入busy2 ping busy1 经过测试,只能用容器的内网ip ping,用容器id和容器名称均ping不通 docker exec -it busy2 ping 172.17.0.2
3.3、自己创建一个网络并运行容器后加入
# 创建自定义网络,默认类型是bridge桥接网络 docker network create mynet # 创建busy1 并加入mynet docker run -itd --name busy1 --net mynet busybox # 创建busy2 并加入mynet docker run -itd --name busy2 --net mynet busybox # 进入busy1 ping busy2 经过测试,自己创建的网络,可以使用容器名称,容器id和容器内网ip ping通 docker exec -it busy1 sh ping busy2 # 进入busy2 ping busy1 经过测试,自己创建的网络,可以使用容器名称,容器id和容器内网ip ping通 docker exec -it busy2 ping busy1
经过测试:自己创建的网络,可以使用容器名称,容器id和容器内网ip ping通。
3.4、加入网络
# busy3容器加入mynet网络 docker network connect mynet busy3
3.5、查看docker网络信息
# 查看docker网络信息列表 docker network ls # 查看docker网络信息详情 docker network inspect 0ba825577fe7
运行并加入该网络的容器,会在这个网络配置里面看到,如下图