前言
本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍容器网络模式, 属于了解范畴,充分了容器的网络模式,更有助于更好的理解Docker的容器之间的访问逻辑。
疑问:为什么要了解容器的网络模式?
首先,容器之间虽然不是物理隔离,但是它们彼此之间默认是不互联互通的,这也有助于保持每个容器的纯粹性,相互之间互不影响。
其次,既然使用了容器,通常情况下,容器需要与宿主机通信,或者A容器与B容器通信而B不需要知道A的存在,或者A/B两容器相互通信。
从而,就引出了本节内容,他们相互通信,就绕不开容器的网络模式!
概述
1.容器通信模式分类
模式名称 | 简介 | 备注 |
---|---|---|
bridge |
容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,它们分别通过docker0虚拟网卡与宿主机的eth0网卡交互,进而和外界网络交互 | 默认模式 |
host | 容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间 | 弊端:同一个端口只能同时被一个容器服务绑定 |
none | 该模式关闭了容器的网络功能,仅有独自的网络空间(一个空架子),并且该模式不会给容器分配任何网络资源,包括虚拟网卡、路由、防火墙、IP、网关、端口等 | 光秃秃的一个容器,没有任何的网络资源,就是自娱自乐的光杆司令(很少用) |
container | 它是bridge和host模式的合体,优先以bridge方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为container,它们均共享第一个容器的网络资源,除了网络资源,其他资源,容器彼此之间依然是相互隔离的 | 第一个以bridge方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务 |
自定义 | 该模式也更为灵活,可以通过-d 指定自定义的网络模式的类型,可以是bridge或者overlay,其中overlay功能更为强大,可以指定多个subnet子网网段。 | 该模式,在容器之间可以使用别名相互通信,这一点很nice(重要) |
docker0虚拟网卡科普:
当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,宿主机上以Bridge模式启动的容器会链接到这个虚拟网桥上。docker0默认地址172.17.0.0/16。虚拟网桥的工作方式和物理交换机类似,这样宿主机上的所有容器就通过docker0连在一个二层网络中,再通过docker0和物理网卡eth0交互(我本机的物理网卡名字是ens33)。
Docker 安装以后,会默认创建三种网络,可以通过 docker network ls 查看。
[root@centOS7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fad4a56fe429 bridge bridge local
2ec1ca3d2105 host host local
17d14a812fce none null local
预告:剩余的两种需要手动定义后,再通过docker network ls命令查看才会展现出来!
2.网络模式的使用方式
docker run 后面添加 --net参数即可。
示例:--net=bridge、 --net=host 、--net=container、--net=none
3.ip a 默认的网卡资源信息
查看目的:对以下两个网卡混个脸熟。
ens33是宿主机的物理网卡,大部分电脑是eth0。
docker0,它是docker的虚拟网卡,桥接模式下,内部容器都会把信息汇总给docker0网卡,由它再转发给eth0,来和外界交互。
ip addr #或者ip a 都可以查看所有的网络资源
下面一起深入探讨一下各模式的使用方式吧!
一、bridge桥接网络模式
docker run默认模式,最为常用。所以 --stat=bridge 可以省略不写。
特点:
1.默认为每个容器分配单独的网络空间,彼此相互隔离。
2.每个容器都单独的网卡、路由、IP等一些列基本的网络设施。
3.每个容器启动后,都会被分配一个独立的虚拟IP。
4.该模式会自动,将宿主机上的所有容器,都链接到 #ip a 看到的docker0的虚拟网卡上。
5.外界主机不能直接访问宿主机内的容器服务,需要宿主机通过-p做端口映射后访问宿主的映射端口。
1.准备工作,启动nginx前查看宿主机桥接模式网关、80端口占用情况
1)docker inspect bridge 总览桥接模式下的网关和子网网段
docker inspect bridge #查看桥接网络模式docker0虚拟网卡的详细信息(子网网段、网关等)
注意:下图中查看的网关信息,是bridge模式下的网关信息,可以看到桥接模式的网关和IP,docker0是桥接模式下,所有容器交互通信的交通枢纽。
稍后会查看host模式下的网关信息,里面都是空的。
2)开启nginx前,先查看宿主机80端口占用情况
查看目的,可以得知,在桥接模式下,容器自始至终使用的都是容器自身的虚拟网卡和虚拟IP,并不会占用宿主机的(80)端口和IP。
桥接模式实验结束后,会再次查看宿主机的80端口有没被占用(实际情况下,不会被占用的)
docker ps -a #实验前,查看是否有启动的容器,如果有暂时先停掉,特别是nginx容器
netstat -nalpt #实验前,先查看宿主机的(80)端口占用情况
2.通过启动nginx容器服务,深入了解bridge模式
1)以桥接模式启动nginx容器
docker images #查看镜像列表
docker run -d --name nginx_V1 nginx:alpine #默认就是桥接,不用--net单独指定bridge
docker ps #查看已启动的容器
2)查看桥接模式下,nginx容器的网络资源分配情况
ip a ,目的:可以看到系统给nginx容器服务单独分配了一个虚拟网卡veth****
注意:在桥接模式下,每个容器启动后,都会被分配一个独属于容器自己的虚拟网卡和虚拟IP。
ip a #发现多了一个虚拟网卡:vetha7cac49@if44
下面再通过:docker inspect nginx_v1 命令,查看桥接模式下,容器的网络配置详细信息
docker ps
docker inspect nginx_v1 #通过nginx容器别名查看容器的详细信息,可以看到容器的网关和IP 172.17.0.2
可以看到独立的IP、Port、GateWay、Mac等资源。
3)宿主机下,curl nginx容器IP,可以正常访问
curl 172.17.0.2 #桥接模式下,系统自动为nginx容器分配的虚拟IP
4)开启新窗口,进入同一宿主机的其他Tomcat容器内部curl nginx容器IP
可以发现,宿主机内的其他容器,依然可以访问nginx容器服务
docker run -it -p 8080:8080 tomcat:8.5.46-jdk8-openjdk /bin/bash # 进入其他容器内部
curl 172.17.0.2 #在Tomcat容器中,访问nginx容器