理解Docker0
先把之前的容器和镜像全部删除
docker rm -f $(docker ps -qa)
docker rmi $(docker images -qa)
查看网络信息
ip a
里面有一个docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:83:27:d2:d4 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
创建一个容器
docker run -d -P --name tomcat01 tomcat
容器外的docker0和容器内网卡的地址都是同一个网段
[root@docker ~]# docker exec -it tomcat01 ip a
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
5: eth0@if6: <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
我们在容器外ping容器内的地址
[root@docker ~]# 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.131 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.119 ms
linux可以ping通docker容器内部
docker network ls可以查看网络方式
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bb3aac34755d bridge bridge local
faa06498f8b8 host host local
674f1e2caf4c none null local
常见的容器之间通信方式
同一个宿主机内部
- 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡 docker0
- 网卡之间是桥接模式 通过docker network ls 可以查看,使用的技术是evth-pair技术
- 通过虚拟交换机来实现容器间通信
再创建一个容器
docker run -d -P --name tomcat02 tomcat
再次查看网络信息
ip a
6: veth091d8e1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 62:f8:47:a3:d9:be brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::60f8:47ff:fea3:d9be/64 scope link
valid_lft forever preferred_lft forever
8: veth9a5c240@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4e:42:99:58:92:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::4c42:99ff:fe58:92f1/64 scope link
valid_lft forever preferred_lft forever
发现又多了一张网卡
- 我们发现这个容器带来网卡,都是一对对的
- evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
- 正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
- openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
测试两个容器之间能否通信
[root@docker ~]# docker exec -it tomcat01 ping 172.17.0.3
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.127 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.051 ms
[root@docker ~]# docker exec -it tomcat02 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.112 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.063 ms
- tomcat01和tomcat02是公用的一个路由器,docker0
- 所有的容器不指定网络的情况下,都是docker0来路由,docker会给我们的容器分配一个默认的可用ip
- Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
- Docker 中所有的网络都是虚拟的。虚拟的转发效率高
- 只要容器删除,对应的网桥就没了
docker rm -f $(docker ps -qa)
ip a
容器网络信息查看
ip link show
docker network ls
docker network inspect bridge
容器互联
我们编写了一个微服务,database url=ip ,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以使用容器名字来进行访问容器?
这时候