bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。

               多台物理主机之间的容器互联(暴露容器到真实网络中)

docker容器互联并且暴露真实网络_第1张图片

docker  默认的桥接网卡是 docker0 。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 vethxxx,而 docker 只是把所有这些网卡桥接在一起

pipework工作原理分析
那么容器到底发生了哪些变化呢?我们docker attachtest1上,发现容器中多了一块eth1的网卡,并且配置了192.168.1.150/24IP,而且默认路由也改为了192.168.1.1。这些都是pipework帮我们配置的。

  ·首先pipework检查是否存在br0网桥,若不存在,就自己创建。
  ·创建veth pair设备,用于为容器提供网卡并连接到br0网桥。

  ·使用docker inspect找到容器在主机中的PID,然后通过PID将容器的网络命名空间链接到/var/run/netns/目录下。这么做的目的是,方便在主机上使用ip netns命令配置容器的网络。因为,在Docker容器中,我们没有权限配置网络环境。

 ·将之前创建的veth pair设备分别加入容器和网桥中。在容器中的名称默认为eth1,可以通过pipework-i参数修改该名称。

 ·然后就是配置新网卡的IP。若在IP地址的后面加上网关地址,那么pipework会重新配置默认路由。这样容器通往外网的流量会经由新配置的eth1出去,而不是通过eth0docker0(若想完全抛弃自带的网络设置,在启动容器的时候可以指定--net=none)

以上就是pipework配置Docker网络的过程,这和Dockerbridge模式有着相似的步骤。事实上,Docker在实现上也采用了相同的底层机制。
通过源代码,可以看出,pipework通过封装Linux上的ipbrctl等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。当然,如果想了解底层的操作,我们也可以直接使用这些Linux命令来完成工作,甚至可以根据自己的需求,添加额外的功能。

2 单主机Docker容器VLAN划分
pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分。下面,就来简单演示一下,在单机环境下,如何实现Docker容器间的二层隔离。

使用link参数可以让容器之间安全的进行交换

创建容器使用--name指定自定义容器名

docker容器互联并且暴露真实网络_第2张图片 

然后创建一个新的容器自定义为web,并将它连接到test1

然后使用docker  ps ---no-trunc 查看容器的连接状态

docker容器互联并且暴露真实网络_第3张图片 

--link namealias name是要链接的容器名,alias是链接的别名

进入容器查看两个容器是否链接  查看hosts文件

docker容器互联并且暴露真实网络_第4张图片 

有两个hosts证明成功了,第一个是web容器,第二个是test1容器的ip和主机名

实现多台物理机之间的容器互联

不同容器之间通讯可以使用pipework工具

docker容器互联并且暴露真实网络_第5张图片 

 

使用yum安装下面相关依赖包

wKioL1kn87HTY5VhAAAVHC22w-Y847.png-wh_50 

设置桥接网络

wKioL1kn88Cj8h8jAAASpkKuprc302.png-wh_50 

docker容器互联并且暴露真实网络_第6张图片 

network-scripts目录下添加虚拟主机文件

wKioL1kn89njYawjAAANhlJlkRc393.png-wh_50 

写入下面内容

docker容器互联并且暴露真实网络_第7张图片 

重启network服务 systemctl  restart  network

wKioL1kn8-qxWFD9AABCEv_zvqg321.png-wh_50 

使用brctl命令查看虚拟网桥

 

修改配置文件,指向br0,需要停止docker

 

 

启动docker,创建容器时最好在加上--net-none,避免ip发生冲突

wKiom1kn9DuAVO5uAABJRI2FPQc471.png-wh_50 

使用pipework指定网卡地址

docker容器互联并且暴露真实网络_第8张图片 

wKioL1kn9FHQ07RFAAAvUJr5-1c879.png-wh_50 

使用外网ping容器ip

docker容器互联并且暴露真实网络_第9张图片 

实现单主机docker容器VLAN划分

安装openvswitch,并安装相关依赖包

创建yum

wKioL1kn9GTAJoJmAAAOwfzbHgc656.png-wh_50wKiom1kn9HmQijQvAAAiiBck7pI523.png-wh_50 

解压与打包

wKioL1kn9IfyIeHFAAANuq13cz8916.png-wh_50 

wKiom1kn9JTi4wSxAAANLnqHSDA770.png-wh_50 

wKioL1kn9ZPQV96qAABWGvBIXYU175.png-wh_50 

查看目录是否有两个文件

wKioL1kn9LLCsLvvAAA-e9QCzdw120.png-wh_50 

安装里面的第一个软件包

wKiom1kn9Lyy_LgBAAAY2YU8QSw650.png-wh_50 

启动openvswitch

wKiom1kn9NfjPkJnAAAj23igyY8497.png-wh_50 

查看状态

wKioL1kn9O6CUD8aAAAXSRyD70Y557.png-wh_50 

创建交换机 绑定物理接口(需要把br0接口删除)

wKioL1kn9PvAkecEAAAK2BX2ndQ274.png-wh_50 

启动ovs1

wKiom1kn9Qbja7XTAAAY4EnVQFg325.png-wh_50 

查看地址

 

在主机上创建4docker容器

docker容器互联并且暴露真实网络_第10张图片 

test划分到vlan

 

进入容器后ping其他vlan,正确的test1能通test2,不通test3test4

docker容器互联并且暴露真实网络_第11张图片