理解docker0
清空环境:
docker rm $(docker ps --filter status=exited -q)
Docker如何处理容器网络访问?
[root@iZwz93269bclc8ax50f8azZ ~]# docker run -it --name centos01 centos ip addr
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
linux可以ping通docker容器内部
[root@iZwz93269bclc8ax50f8azZ ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.061 ms
192.168.0.1 路由器
192.168.0.2、192.168.0.3 手机、其它设备等,同一个网段可以ping通
原理
- 每次启动一个docker容器,docker都会给容器分配一个ip,只要安装了docker, 就有一个网卡docker0的桥接模式,使用的技术是evth-pair技术。
容器外:
容器内:
如果再启动一个容器,发现多了一对网卡
容器外,与容器内执行ip addr
容器带来的网卡,是一对对的。使用evth-pair 就是一堆虚拟设备接口,他们都是成对出现的,一段连接着协议,彼此相连。正因为有这个特性,可以连接各种细腻网络设备。
容器与容器之间是可以ping通的:
sh-4.4# ping 172.17.0.3 docker centos2 -> docker centos1
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.082 ms
centos01,02都是公用的一个路由器,docker0
所有容器不指定网络的清空下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
255.255.0.1/16, 最后8位为网络地址,相当于一个域。
00000000.00000000.00000000.00000000
255.255.255.255
255.255就是一个网络 , 255*255 - 0.0.0.0 - 255.255.255.255=65535个ip
docker中所有的网络接口都是虚拟的,因为虚拟效率更高。
容器删除,对应的一个网桥就就没了。