最近公司使平台网络更加灵活,满足更多网络需求,所以研究docker的几种网络模式,在此记录一下,便于后期查看。
一、docker安装完成后默认的创建了host 、bridge、none三种网络模式:其中none这次不是研究的重点
1、none 网络使用场景一般比较少见,主要应用于安全性比较高的场景,且不需要与外部进行通信的任务。
示例:使用--network 指定网络模式简写 --net
docker run -dit --net=none --name=
bbox3 busybox 运行一个docker容器 指定none模式
docker exec -it f6e86cecb64c /bin/sh 进入容器查看 只有lo回环地址
验证 ping www.baidu.com:
验证 ping 127.0.0.1:
无需和外部网络进行通信的场景
2、
使用host网络的容器,和宿主机共享网络栈
,容器的端口和IP,容易发生冲突,多个容器无法对外暴露相同的端口。有点效率高
指定host模式的容器,可以通过宿主机的ip和端口访问容
器
。
示例:使用--network 指定网络模式简写 --net
docker run -dit --net=host --name=
nginx1 nginx
运行一个docker容器 指定host模式(通常请求下,宿主机访问访问容器内部得做端口的映射才可以)
docker run -dit --net=host --name=bbox4 busybox
docker exec -it 292abce5491b /bin/sh 进入容器查看 然后在宿主机执行ifconfig 对比下面内容
docker exec -it 5d8581b971f4 /bin/sh
宿主机ifconfig
host主机模式能够支撑容器的跨主机通信(因为容器和宿主机使用的是同一network namespace,引申为不同的容器之间的通信实际上是宿
主机之间的通信)【但是存在弊端,同一宿主机上的多个容器不能使用同一端口,这种模式并没有充分发挥到容器的隔离特性,容器和容器之间共
享宿主机共享栈】
主要用于跨主机的容器之间的通信(一般大规模部署的情况下,这种模式不常用)
3、
bridge模式(容器的默认网络模式,这里不做过多的解释,直接上图,自己画了一个图)
总的概括就是docker0网桥+两个虚拟网卡的实现方式.容器间通过网桥的方式传递数据包。
4、
macvlan模式:一些传统的应用或者监控应用需要直接使用主机的物理网络、可以采取macvlan模式,macvlan是直接在HOST网卡上创建多个子网卡,并分配独立的IP和mac地址,把子网卡分配给容器实
例、从而实现容器实例和物理网络的直通,并同时保持了容器实例的隔离性。
host主机收到数据包后,根据不同的mac地址将数据包转发到不同的子网
1、拉取镜像
docker pull busybox
docker images
docker pull busybox
docker images
如果之前创建过network,可以通过下面的命令进行删除
删除掉之前创建的network,重新执行下面的命令,发现可以了
删除network:docker network rm networkid(docker network ls 查询得出)
删除network:docker network rm networkid(docker network ls 查询得出)
---------------------------------------------------------------------------------------------------
master和node节点执行:(创建相同的macvlan网络)
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=ens160 macvlan_1
master和node节点执行:(创建相同的macvlan网络)
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=ens160 macvlan_1
--------------------------------------------------------------------------------------------------
master执行:后台创建容器
docker run -it -d --network macvlan_1 --ip=10.0.0.155 busybox /bin/sh
node执行: 后台创建容器
docker run -it -d --network macvlan_1 --ip=10.0.0.156 busybox /bin/sh
master执行:后台创建容器
docker run -it -d --network macvlan_1 --ip=10.0.0.155 busybox /bin/sh
node执行: 后台创建容器
docker run -it -d --network macvlan_1 --ip=10.0.0.156 busybox /bin/sh
进入node节点 容器内部
docker exec -it 容器id /bin/sh
ping 10.0.0.155
相反:在master可以ping node节点的容器
结论:同一macvlan之间,跨主机的容器能够相互通信