Docker网络
理解Docker0
测试,进入一个docker容器中,查看其网络环境
三个网络
#问题: docker是如何处理容器网络访问的?
#查看容器的内部网络地址 ip addr
#docker exec -it tomcat01 ip addr
#linux可以ping通docker容器内部
原理
#每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会又一个网卡docker0桥接模式,使用的技术是veth-pair技术! veth-pair充当一个桥梁,连接各种虚拟网络设备的协议
# veth virtual ethernet 虚拟网卡
介绍一些网络知识
在我们使用虚拟机的时候,经常会有桥接模式和NAT模式去配置
bridged networking(桥接模式):虚拟出来的容器就像局域网中的一个独立的主机,它可以访问网内的任意一台机器。如果使用的VMWare,在这种模式下还需要自己手动的配置IP地址、子网掩码,并且还要和宿主机处于同一网段,这样虚拟系统才能和宿主机进行通讯
NAT模式:Network address translation,使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。NAT模式下的虚拟系统的TCP/IP配置信息有VMnet(NAT)虚拟网络的DHCPserver提供,无法手动修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势就是接入互联网很easy。
因此使用docker-compose 去进行容器间通讯的网络,默认是桥接模式。
3、我们来测试一下tomcat01和tomcat02
# 容器和容器之间是可以相互ping通的!
结论:tomcat01和tomcat02是共用一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
–link
思考一个场景,我们编写了一个微服务,database url=ip; 项目不重启,数据库ip换掉了,我们希望处理这个问题,可以名字来进行访问容器?
使用docker-compose去部署,可以在同个网络下去通过域名去访问
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!
只要容器删除,对应网桥一对就没了!
Docker Compose 网络规则
网络规则:
查看网络
[root@VM-16-12-centos louyu_pure]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4428d4d0c09e bridge bridge local
16ee19ed647f host host local
5fd188828ce6 louyu_pure_app_net bridge local
3d93dd81bd1b none null local
5064e48e1778 old_louyu_2_app_net bridge local
一个项目中如果有10个服务(项目中的服务都在通过网络域名访问去进行访问)
类似去连接数据区 ,不再通过IP:3306去连接数据库。
url: jdbc:mysql://louyu_mysql:3306/louyu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
通过域名连接数据库可以避免了IP改变后,自己还要去维护修改程序中的数据连接。
查看网络细节:
查看docker-compose的内部网络中,发现各个容器都在一个网段下,都有自己的域名
因此通过docker-compose打包的项目,可以通过网络域名去进行访问
docker network insepct xxx
[root@VM-16-12-centos louyu_pure]# docker network inspect louyu_pure_app_net
[
{
"Name": "louyu_pure_app_net",
"Id": "5fd188828ce6531dcf77e201fc5710986c0c00d1c6426dfd4a7f3b59e8a1e795",
"Created": "2021-07-31T11:05:15.330757936+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Containers": {
"17d5dddb14c24f2c18bb283c234da26beea5c1547116f635fff1d6563d051205": {
"Name": "louyu_show",
"EndpointID": "9c461ce70f814283511d5ecfc170473224e9457539beb9819d8aa5fa40fdca19",
"MacAddress": "02:42:ac:13:00:05",
"IPv4Address": "172.19.0.5/16",
"IPv6Address": ""
},
"66375ae1816a7b41bfb59622224fc40360f36faef314bb5eaf9070c97ad5627e": {
"Name": "louyu_mysql",
"EndpointID": "ea666cf12dbb7b5d01237e32a62febc77432812ecdc438d3eb4b24b15149c3ba",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"d8f1e4fa521fb2661f357d758709a81187739dfd59d73e65fce691d7bac62678": {
"Name": "louyu_serv",
"EndpointID": "4b158585d7a61f26945369f841d2fc4cc48a4e2cf135bfba39661147139cbfe9",
"MacAddress": "02:42:ac:13:00:04",
"IPv4Address": "172.19.0.4/16",
"IPv6Address": ""
},
"f609b22ac59bbf071c8ce73315d40271d832654930f6817c8a30386cdcc30509": {
"Name": "louyu_redis",
"EndpointID": "0865d8ecef37a9f9450376aadde4cfdee22ebc513cbcb7377809a1af64d06dd1",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "app_net",
"com.docker.compose.project": "louyu_pure",
"com.docker.compose.version": "1.21.2"
}
}
]