1、查看服务器本机器的网卡信息
1:本机的回环地址
2:阿里云内网地址
3:docker0的地址
三个网络代表了不同的环境。那么docker是如何处理容器网络访问的?
启动一个容器。
再次查看主机的网卡。
发现多了一个网卡,每增加一个网卡,端口都是成对出现。
2、宿主机本身是可以ping同容器内部的。每启动一个docker容器,docker就会给每个容器分配一个ip。
每安装一个docker,就会有一个网卡docker0桥接模式,使用的是veth-pair技术。veth-pair就是一对的虚拟设备接口,都是成对出现,一端连着协议,一端彼此相连。所以一般veth-pari充当桥梁,连接各种虚拟网络设备。这就是主机本身可以ping同容器内部的原因。
3、容器内部之间也是可以互相ping通的。
(1)容器之间的通信都需要经过docker0这个网卡,经过docker0的路由分发,才能实现容器之间互相通信。
(2)容器内部的网卡地址与路由器进行了绑定,当容器之间进行访问的时候,会先通过绑定的网卡通过路由器进行分发。
路由器进行分发有两种方式:第一种是提前将目标地址写到注册表中,然后通过注册表中的记录进行访问;第二种是通过广播形式将数据全部发送出去,对有响应的地址进行数据发送。
(3)容器之间共用docker0。所有的容器在不指定网络的情况下,都是docker0路由的,docker会给容器自动分配一个默认的可用ip。
4、总结
(1)容器之间的通信使用的是veth-pair的桥接技术,即Lunix的虚拟化技术。主机有一个docker容器的网桥--docker0,最多可以分配65535个ipd
(2)docker中所有的网络接口都是虚拟的,转发效率高,类似于内网传送文件。
(3)完整的结构。物理网卡是主机自己的网卡,物理网卡和docker0路由是直接连接的。
(4)只要容器被删除,对应的网桥对就被删除了。
(5)容器每次重启,ip都会发生变化!
5、link模式
(1)如上所述,每次停掉一个docker再重启,ip地址都会刷新,对于有些需要固定ip地址的场景并不适用,如何解决这个问题?
(2)可以适用 --link 指令绑定服务,实现通过服务名就可以完成访问。
之所以可以通过link模式,使用容器名直接访问,是因为在tomcat03中将tommcat02写入到了配置中,可以进入到host目录下查看绑定信息。
其他没有绑定容器中并没有相关的配置。
但是实际项目中不会使用这种方式,因为这种绑定会使得其他容器不能互相访问。
(3)
查看本机的网络信息。
其中的bridge就是网桥。2中的Subnet就是物理网卡地址,Gateway网关就是docker0.
6、自定义网络
(1)网络的模式
- bridge:桥接模式(默认),通过docker0搭桥
- none:不配置网络
- host:和主机共享网络
- container:容器网络连通(使用少,局限大)
(2)自定义网络,也是通过桥接模式实现。
(3)创建一个网络
命令: docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
解释:如下。
查看自定义网络的配置信息。
命令:docker inspect mynet
(4)启动容器并使用自定义的网络
命令:docker run -d -P --name tomcat01-mynet --net mynet tomcat
(5)查看自定义网络是否添加有容器的ip
命令:docker network inspect mynet
分配的网络ip就是预设的网络地址上递增。
(6)自定义网络的优点。
在不使用--link的情况下,可以直接通过容器名进行连接,相当于对docker0缺失的功能进行了修复
所以在项目中推荐使用自定义的方式使用网络,因为当有多个集群的时候使用自定义的网络可以保证集群的安全和健康。如下图所示,两个mysql和redis集群通过自定义的网络可以实现互相隔离。
7、网络连通
(1)命令:docker network connect 网络名 容器名
本质就是将目标容器的ip配置写到目标网络下,即一个容器两个ip地址。
如上图所示,两个网络之间不能直接打通,但是容器和网络之间可以通过连接方式打通,从而实现访问。
(2)将tomcat01与mynet进行连接。
(3)查看mynet
在mynet下面直接添加了目标容器的网络信息。
*-*本篇指令*-*
1、查看网卡信息
指令:ip addr
2、
docker run -d -P --name tomcat03 --link tomcat02 tomcat
启动一个tomcat容器,将其与tomcat02连接,每次就可以通过制定名字就可以实现通信。可以通过ping命令检验。
3、查看网络信息
docker network COMMAND
COMMAND:ls inspect等
4、创建一个网络
实例:docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
--driver : 网络模式,默认是桥接模式
--subnet :子网掩码,网段。自定义的子网掩码
--gateway :网关地址,一般是从0.1开始
mynet:自己创建的网路的名字。
5、启动一个使用自定义网络的容器
实例:docker run -d -P --name tomcat01-mynet --net mynet tomcat
--net:指定网络名
6、 docker network connect mynet tomcat01
将容器tomcat01与mynet进行连接。