Docker网络

Posted @Kerry~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker网络相关的知识,希望对你有一定的参考价值。

服务器的基本网络 

Lo: 表示本机回环地址

eth0: 表示阿里云内网(私网)地址

docker0: 表示docker的网络地址(Docker的网卡),只要安装了Docker就会有的。

理解Docker0

Docker0就是docker 的网卡,只要安装了Docker就会自带Docker0。

Docker如何处理容器网络访问?

思考问题:我们宿主机是如何和docker容器进行网络通信,意思就是docker如何处理容器网络访问?

例如:我们在docker 上面运行运行了一个项目,访问项目需要先经过宿主机,再由到容器里面的。

先查看本机网络环境: ip addr

运行一个容器
docker run -d --name mycentos01 centos /bin/sh -c “while true;do echo ymb;sleep 20;done”;

[root@iZ2ze4zc54bfy36wjglfqsZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS     NAMES
fcf812b93aef   centos    "/bin/bash"              2 hours ago   Up 2 hours             mycentos02
15fdfd378264   centos    "/bin/sh -c 'while t…"   2 hours ago   Up 2 hours             mycentos01

查看容器里面的网络  docker exec -it 容器ID ip addr

[root@iZ2ze4zc54bfy36wjglfqsZ ~]# docker exec -it 15fdfd378264 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
14: eth0@if15: <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


发现容器启动会得到一个新的网络地址:14: eth0@if15 ip地址:172.18.0.2 这个是由docker0所分配的

这时候我们再次查看宿主机的网络。发现宿主机也新增加了一个网络地址。

ip addr 

[root@iZ2ze4zc54bfy36wjglfqsZ ~]# ip addr
15: vethb45f56f@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether fe:c2:fe:1a:50:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fcc2:feff:fe1a:505d/64 scope link 
       valid_lft forever preferred_lft forever


我们由下面的图可以知道 宿主机上面的也产生了 15: vethb45f56f@if14 网络地址。发现这两个网卡居然是一对的。

我们再次启动一个容器测试
docker run -d --name mycentos02 centos /bin/sh -c "while true;do echo hel;sleep 10;done;"

[root@iZ2ze4zc54bfy36wjglfqsZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS     NAMES
fcf812b93aef   centos    "/bin/bash"              2 hours ago   Up 2 hours             mycentos02

查看容器网络
[root@iZ2ze4zc54bfy36wjglfqsZ ~]# docker exec -it fcf812b93aef 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
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

我们会发现出现:16: eth0@if17 ip为:172.18.0.3 网卡

这个时候我们再次查看宿主机里面的网卡地址
[root@iZ2ze4zc54bfy36wjglfqsZ ~]# ip addr
17: veth8d0f47d@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 32:ab:7e:22:70:82 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::30ab:7eff:fe22:7082/64 scope link 
       valid_lft forever preferred_lft forever

我们会发现:宿主机里面的也是存在 17: veth8d0f47d@if16 网卡

这就是证明这些网卡是一对对出现的,并且相互绑定。

  这个时候我们思考一个问题:宿主机Linux能不能 ping 容器内部呢?

经过实验:答案是可以ping通的。

 思考一个问题:为什么Linux能够可以 ping 通 docker 容器内部?
原理:我们每启动一个docker容器,docker就会给docker容器分配一个ip(网络地址:172.18.0.2),其次是docker0,我们只要安装了docker,就会有一个网卡docker0,而这个docker0使用的是Linux的桥接模式,使用的技术veth-pair技术!

什么是veth-pair技术?

在上面我们发现容器带来的网卡和宿主机是一对对的。

veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连接着协议,一端彼此相连

正是因为有这个特性,veth-pair 充当一个桥梁,连接各种虚拟网络设备。

例如:Docker容器之间的连接。

 

我们再次测试一下:mycentos01 和 mycentos02 能否相互ping通呢?

答案是可以pinh通的。

 绘画一个网络图:大家就知道是什么意思了。

结论:mycentos01 和 mycentos02 是公用一个路由器(网络),就是docker0,通过docker0来转发,所有的容器不指定网络的情况下,都是docker0 路由的,docker会给我们的容器分配一个默认可用IP地址。

关于docker网络的小结:

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 就是Docker0

Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!

只要删除容器,对应的网桥(网卡)一对就自动消除。 

以上是关于Docker网络的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!