一、前言
我们在一个容器中可以直接ping通www.baidu.com,也可以直接ping通任意一个地址,那么这个究竟是怎么实现的呢?
network
首先先来看下虚拟机中的网络列表:
sudo docker network ls
可以看到有三个网络:
学习bridge需要一个工具:bridge-utils
sudo yum install bridge-utils
二、bridge
1.容器间的连接
我现在有一个容器test1:
这个容器就是连在bridge上边的。
如何验证呢?
<1>首先,通过network的id,可以看到这个network的细节
sudo docker network inspect c743a
里面就有test1的相关信息,说明test1的container连接到了bridge的网络上边。
<2>输入命令:
ip a
可以看到有两个接口:
第一个是docker0
第二个veth是虚拟机的internet,可以通过veth去连接netword-namespace
然后再来看test1的ip a :
sudo docker exec test1 ip a
可以看到也有一个eth0,其实这个eth0和虚拟机的veth是一对,也就是说我们这个container通过这一对eth连到了主机上面。具体来讲是连接到了docker0面,这个时候就需要用到bridge0-utils工具了。
运行
brctl show
也就是说veth6d1ee84这个接口是连接到了docker的namespace上的。
总结容器间的连接就相当于是一个屋子里连接同一个路由器的两台可联网设备,相当于局域网,相互之间可以通信,这个路由器就是docker0
2.网络的连接
对于单个容器来讲,它是如何访问internet的呢?我们知道虚拟机可以通过eth0端口去访问外网,容器中的数据包经过docker0经过网络地址转换,通过eth0间接去访问外网的。这个网络地址转换其实就是通过iptables去实现的。