Docker网络(一)

Docker 网络

理解Docker0

准备工作:清空所有的容器,清空所有的镜像

docker rm -f $(docker ps -a -q) # 删除所有容器 
docker rmi -f $(docker images -qa) # 删除全部镜像

我们先来做个测试

  • 查看本地ip ip addr
    在这里插入图片描述
  • 这里我们分析可得,有三个网络:
lo 127.0.0.1 # 本机回环地址 
eth0 172.17.90.138 # 阿里云的私有IP 
docker0 172.18.0.1 # docker网桥 

问题:Docker 是如何处理容器网络访问的?

实际场景中,我们开发了很多微服务项目,那些微服务项目都要连接数据库,需要指定数据库的url地
址,通过ip。但是我们用Docker管理的话,假设数据库出问题了,我们重新启动运行一个,这个时候数
据库的地址就会发生变化,docker会给每个容器都分配一个ip,且容器和容器之间是可以互相访问的。
我们可以测试下容器之间能不能ping通过:

# 启动tomcat01 [root@kuangshen ~]# docker run -d -P --name tomcat01 tomcat 
# 查看tomcat01的ip地址,docker会给每个容器都分配一个ip! [root@kuangshen ~]# docker exec -it tomcat01 ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
inet 127.0.0.1/8 scope host lo 
	valid_lft forever preferred_lft forever 
122: eth0@if123: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
state UP group default 
	link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 
	inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
		 	valid_lft forever preferred_lft forever 

# 思考,我们的linux服务器是否可以ping通容器内的tomcat ? [root@kuangshen ~]# ping 172.18.0.2 
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data. 
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.070 ms # 可以ping通!

原理

1、每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。这是个桥接网卡,使用了veth-pair技术!
# 我们再次查看主机的 ip addr 
[root@kuangshen ~]# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
inet 127.0.0.1/8 scope host lo 
valid_lft forever preferred_lft forever 

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
link/ether 00:16:3e:30:27:f4 brd ff:ff:ff:ff:ff:ff 
inet 172.17.90.138/20 brd 172.17.95.255 scope global dynamic eth0 
valid_lft 310954997sec preferred_lft 310954997sec 

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
	link/ether 02:42:bb:71:07:06 brd ff:ff:ff:ff:ff:ff 
	inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0 
		valid_lft forever preferred_lft forever
123: vethc8584ea@if122: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
 link/ether 0a:4b:bb:40:78:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
 # 发现:本来我们有三个网络,我们在启动了个tomcat容器之后,多了一个!123的网络!
2、每启动一个容器,linux主机就会多了一个虚拟网卡。
# 我们启动了一个tomcat01,主机的ip地址多了一个 123: vethc8584ea@if122 
# 然后我们在tomcat01容器中查看容器的ip是 122: eth0@if123 
# 我们再启动一个tomcat02观察 
[root@kuangshen ~]# docker run -d -P --name tomcat02 tomcat
 
# 然后发现linux主机上又多了一个网卡 125: veth021eeea@if124: 
# 我们看下tomcat02的容器内ip地址是 124: eth0@if125: 
[root@kuangshen ~]# docker exec -it tomcat02 ip addr 
# 观察现象: 
# tomcat --- linux主机 vethc8584ea@if122 ---- 容器内 eth0@if123 
# tomcat --- linux主机 veth021eeea@if124 ---- 容器内 eth0@if125 
# 相信到了这里,应该能看出点小猫腻了吧!只要启动一个容器,就有一对网卡 
# veth-pair 就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。 
# 正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备! 
# “Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络 结构,比如 OpenStack Neutron。
3、我们来测试下tomcat01和tomcat02容器间是否可以互相ping通
[root@kuangshen ~]# docker exec -it tomcat02 ping 172.18.0.2 
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data. 
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.110 ms 
# 结论:容器和容器之间是可以互相访问的。
4.、网络模型图

在这里插入图片描述
结论:tomcat1和tomcat2共用一个路由器。是的,他们使用的一个,就是docker0。任何一个容器启动
默认都是docker0网络。
docker默认会给容器分配一个可用ip。

小结

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据
Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网
关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接
通信。
在这里插入图片描述
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并
让他们彼此联通(这样一对接口叫veth pair);
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中
进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容
器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值