docker的原生网络
第一种:None
用到none网络的容器只有一个loopback回环的网络,没有mac地址,ip等信息,只能ping通自己,不能跟外界通信,是一个被隔离起来的网络。
所以他可以做一些安全系数比较高的容器。
第二种:Host
基于宿主机的网络,跟主机的ip一模一样。他是直接使用的宿主机的网络,在创建容器的时候,没有进行net网络栈的隔离。在网络上没有做隔离。
但是这种容器与宿主机容易出现端口冲突问题
第三种:Bridge
桥接网络,大多数场景下我们使用的都是这种网络类型。
在安装docker服务的时候,就会默认生成一张docker0的网卡。容器默认使用的网络是docker0网络。docker0此时相当于一个路由器,基于此网络的容器,网段都是和docker0一致的。
解决不同网络的容器之间的通信问题
基于bridge网络类型,创建一个自定义的网络来实现容器不同网络的通信问题。
//创建一个bridge网络mynet
docker network create -d bridge mynet
网卡类型 网卡名称
-d: 指定创建网卡的类型
查看一下,刚刚创建的网卡,就是红框内的(长串的id是一样的)
基于上面创建的网卡,建立两个容器
docker run -itd --name test3 --network mynet busybox:latest
docker run -itd --name test4 --network mynet busybox:latest
这时候再创建一张网卡mynet2,这里指定他的网段和网关,这样创建的网卡,在创建容器时,就可以指定容器的ip了
docker network create -d bridge --subnet 172.20.16.0/24 --gateway 172.20.16.1 mynet2
基于这张网卡,再创建两个容器,指定ip
docker run -itd --name test5 --ip 172.20.16.6 --network mynet2 busybox:latest
docker run -itd --name test6 --network mynet2 --ip 172.20.16.8 busybox:latest
这时候可以尝试使用ping命令来验证他们是否可以互相通信
先验证同一个网络下的不同容器可不可以通信
进入test5,去ping容器test6
这里解释一下为什么可以直接ping另一个容器的容器名。
因为自定义网络自带了一个containerDNSserver功能(域名解析功能),所以他可以通过容器的名称通信。
此时的test3和test4也是一样的,可以互相通信
但是如果想要使不同网络下的容器进行通信,比如test3和test5进行通信,就需要将test3的网卡mynet给到test5
docker network connect mynet test5
这样test5就能够与使用mynet网卡的容器test3和test4进行通信。
但是注意,因为test6并没有使用mynet网卡,所以test6是不能与test3和test4通信的。
如果想要test6也能与test3和test4进行通信,只需要将上面指令中的test5改成test6即可
docker network connect mynet test6
这样test6也能够与test3和test4进行通信了