一、docker网络常见模式(5种)
默认的有三个:
作用:
容器间的互联和通信以及端口映射
容器IP变动时候可以通过服务名直接网络通信而不受到影响
1、bridge模式
定义:Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
第二幅图,是宿主机上查看ip配置的相关结果
我们可以看到有个docker0,这个网络存在
这个网络是在启动docker软件的时候,就会被创建的
所以,通过图1,我们就可以简单的理解
容器-docker0网络-宿主机ens32或ens33网络之间的关系
所以,容器间的网络交互,都是通过docker0网络间接实现的
2、host模式
定义:容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
我们启动容器时选择这种模式,是无需指定端口映射的,因为使用的就是宿主机的端口和网络
所以,命令可以这么写:
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
访问方式:http://宿主机IP:8080/
因为tomcat的默认端口是8080
就可以简单的理解为,直接在宿主机上启动了一个tomcat,用的就是宿主机的网络。
3、none模式
不考虑
4、container模式
定义:新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
这个模式的案例,无法使用tomcat镜像来演示
因为,tomcat启动默认端口是8080
于是,你两个容器公用一套网络端口,会导致端口冲突。
就简单的理解为,一台服务器上启动两个tomcat,都是8080端口,当然会报错冲突。
案例:
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
alpine1容器内部:
alpine2容器内部:
由上面两幅图,可以看出,这两个容器,公用一个IP。
这种模式情况下,当alpine1容器被停止后
alpine2容器的网络将丢失,就等价于none模式,没有自己的IP网络可用了。
5、自定义网络模式
使用场景:
规划容器网络,我们根据自己的设计,创建对应的docker网络,然后,在启动容器时,指定这个网络
这样,就可以把N多的容器网络,进行网段划分,方便管理容器。
当容器被重启时,对应的容器IP可能会发生变化,所以,我们在实际中使用的时候,会采取服务名进行互相调用,这样,无论容器IP如何变化,都不会影响服务互相调用。
而这个时候,我们用模式1的情况下,ping 容器名,是无法ping通的,所以,这种情况,通过容器名
无法互相访问。
这个时候,自定义网络就体现出它的作用了!!!
创建自定义网络:
docker network create pzj_network
创建容器实例的时候,使用自己创建的网络:
docker run -d -p 8081:8080 --network pzj_network --name tomcat1 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network pzj_network --name tomcat2 billygoo/tomcat8-jdk8
进入tomcat1容器,ping tomcat2
进入tomcat2容器,ping tomcat1
会发现,此时,可以通过容器名,进行互相ping通。
这样就做到了,容器和IP解耦,服务间可以通过容器名进行互相访问。
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)