Docker网络

理解docker0

首先清空所有镜像,保证干净环境。

docker rmi -f $(docker images -a -q)

lo: #本机回环地址

eth0: #本机网卡地址

docker0:docker0地址

docker是如何处理容器网络访问的?

测试

docker run -d -P --name tomcat01 tomcat


查看容器内部的网络地址

docker exec -it tomcat01 ip addr
[root@localhost ~]# 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
4: eth0@if5: <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
[root@localhost ~]#

发现容器启动的时候会得到一个docker分配的eth0@if5 网卡。

linux宿主机能不能ping通容器内的IP地址?

测试

结果:linux主机可以ping通容器内部

容器内是否可以ping通linux主机?

测试

结果:容器内否可以ping通linux主机。

docker0相当于家庭中的路由器,负责给网段内的主机分配IP地址。

docker0原理

1.我们每启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker, 就会有一个网卡docker 0 ,采用桥接模式, 使用的技术是ev th-pair技术!

2.启动容器再次测试ipaddr,发现多了一个网卡。

结论:启动一个容器linux宿主机会多出1个对应的网卡。

3.容器内和容器外网卡是相互绑定的。

容器内:

容器外:

4.再启动一个容器进行测试。

结论:启动N个容器linux宿主机会多出N个对应的网卡。

#我们发现这个容器带来网卡,都是相互绑定的。 
#veth-pair就是一对的虚拟设备接口, 他们都是相互绑定出现的, 一段连着协议, 一段彼此相连 
#正因为有这个特性, veth-pair充当一个桥梁, 连接各种虚拟网络设备的 
#OpenStak,Docker容器之间的连接,ovS的连接,都是使用veth-pair技术. 

容器间通信

测试容器之间是否可以互相通信?

tomcat01

tomcat02

测试ping


都能互相ping通。

知识:

可以不进入容器来ping。

docker exec -it tomcat02 ping 172.17.0.2


结论:容器和容器间是可以互相ping通的!

Docker0网络模型图:

结论:Docker使用的是Linux的桥接, 宿主机中是一个Dokcer容器的网桥docker0。

虚拟网卡,Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高! (内网传递文件!)

移除容器查看网卡

移除容器后网卡自动消失

测试

注:只要删除容器,对应的网卡就会删除!

场景:容器IP变更,不影响通信,以docker容器名称进行ping通信。

启动容器tomcat01和tomcat02

测试:用容器名称ping测试通信。

docker exec -it tomcat01 ping tomcat02

解决容器名称互通

如何可以解决?

再启动一个容器tomcat03,增加--link参数,测试通信。

docker run -d -P --name tomcat03 --link tomcat02 tomcat


测试用容器名称ping

docker exec -it tomcat03 ping tomcat02

反向ping测试

[坑]反向ping测试

docker network究竟

[root@localhost ~]# docker network --help

Usage:	docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks


查看docker0 bridge网卡详细信息

docker0网卡

docker network inspect 991190b12345


容器分配的地址信息

查看容器tomcat03的详细信息

docker inspect fc39850d8b31


拓展:

docker inspect conID|grep tomcat03 -n


查看tomcat03容器的hosts文件

docker exec -it fc39850d8b31 cat /etc/hosts


本质探究:--link就是我们在hosts配置文件中增加了1个tomcat02的映射。

不建议使用--link,因为--link需要相互绑定才能互相通信。

docker0问题:不支持容器名互相连接访问!

posted @ 2020-11-26 12:52  Lwenwu  阅读(238)  评论(0编辑  收藏  举报