Docker学习笔记(十六)— Docker0网络详解

Docker Alice 5个月前 (12-20) 229次浏览 0个评论

Docker 网络

理解 Docker0

清空所有环境

[root@cloud ~]# docker rm -f $(docker ps -aq)
[root@cloud ~]# docker rmi -f $(docker images -aq)

测试网络

[root@cloud ~]# ip addr

Docker 学习笔记(十六)— Docker0 网络详解

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

1、启动一个容器 tomcat01

[root@cloud ~]# docker run -d -P --name tomcat01 tomcat:9.0

2、查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个 eth0@if150 的 ip 地址,它是由 docker 分配的。

[root@cloud /]# 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
149: eth0@if150: <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
注意:
如果查看容器内部网络地址 ip addr 无法使用,
可以在容器内执行命令apt update && apt install -y iproute2就可以了
[root@cloud ~]# docker exec -it tomcat01 /bin/bash
root@7ba2ea6ba8ea:/usr/local/tomcat# apt update && apt install -y iproute2

3、测试 Linux 能否 ping 通 docker 容器内部。

[root@cloud /]# 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.125 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.073 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.075 ms

# 通过 ping 测试发现,linux 是可以 ping 通 docker 容器内部的

 

原理:

再次测试 ip addr,发现多了一对网卡!
Docker 学习笔记(十六)— Docker0 网络详解

可以看到多出的这对网卡,与容器 tomcat01 启动时得到的 eth0@if150,有相似之处

Docker 学习笔记(十六)— Docker0 网络详解

进入容器 tomcat02 测试ip addr

[root@cloud /]# docker exec -it tomcat02 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
151: eth0@if152: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

通过上面的测试发现:
容器启动时生成的网卡,都是一对一对的!
evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
正因为这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备
OpenStack、Docker 容器之间的连接、OVS 的连接,都是使用的evth-pair技术

# 在容器 tomcat02 中 ping 容器 tomcat01
[root@cloud /]# 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.169 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.087 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.083 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.081 ms
注意:
如果容器内 ping 命令无法使用,
可以在容器内执行命令apt install iputils-ping就可以了
[root@cloud /]# docker exec -it tomcat02 /bin/bash
root@418b6338ca59:/usr/local/tomcat# apt install iputils-ping

网络模型图
Docker 学习笔记(十六)— Docker0 网络详解

 

小结:

Docker 使用的是 Linux 的桥接,宿主机中是一个 Docker 容器的网桥,即 docker0。
Docker 学习笔记(十六)— Docker0 网络详解
Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高!
只要容器删除,对应的一对网桥就没了!

 

分享:Docker 学习视频地址:【狂神说 Java】Docker 最新超详细版教程通俗易懂


女程序员博客 , 版权所有丨本站采用BY-NC-SA协议进行授权 , 转载请注明Docker 学习笔记(十六)— Docker0 网络详解

【声明】:本博客仅为分享信息,不参与任何交易,也非中介,所有内容仅代表个人观点,均不作直接、间接、法定、约定的保证,读者购买风险自担。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。

【关于安全】:任何 IDC 都有倒闭和跑路的可能,备份永远是最佳选择,服务器也是机器,不勤备份是对自己极不负责的表现,请保持良好的备份习惯。

喜欢 (3)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址