首页 > 代码库 > docker容器互联并且暴露真实网络
docker容器互联并且暴露真实网络
在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。
多台物理主机之间的容器互联(暴露容器到真实网络中)
docker 默认的桥接网卡是 docker0 。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 vethxxx,而 docker 只是把所有这些网卡桥接在一起
pipework工作原理分析
那么容器到底发生了哪些变化呢?我们docker attach到test1上,发现容器中多了一块eth1的网卡,并且配置了192.168.1.150/24的IP,而且默认路由也改为了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出去,而不是通过eth0和docker0。(若想完全抛弃自带的网络设置,在启动容器的时候可以指定--net=none)
以上就是pipework配置Docker网络的过程,这和Docker的bridge模式有着相似的步骤。事实上,Docker在实现上也采用了相同的底层机制。
通过源代码,可以看出,pipework通过封装Linux上的ip、brctl等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。当然,如果想了解底层的操作,我们也可以直接使用这些Linux命令来完成工作,甚至可以根据自己的需求,添加额外的功能。
2 单主机Docker容器VLAN划分
pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分。下面,就来简单演示一下,在单机环境下,如何实现Docker容器间的二层隔离。
使用link参数可以让容器之间安全的进行交换
创建容器使用--name指定自定义容器名
然后创建一个新的容器自定义为web,并将它连接到test1中
然后使用docker ps ---no-trunc 查看容器的连接状态
--link name:alias name是要链接的容器名,alias是链接的别名
进入容器查看两个容器是否链接 查看hosts文件
有两个hosts证明成功了,第一个是web容器,第二个是test1容器的ip和主机名
实现多台物理机之间的容器互联
不同容器之间通讯可以使用pipework工具
使用yum安装下面相关依赖包
设置桥接网络
在network-scripts目录下添加虚拟主机文件
写入下面内容
重启network服务 systemctl restart network
使用brctl命令查看虚拟网桥
修改配置文件,指向br0,需要停止docker
启动docker,创建容器时最好在加上--net-none,避免ip发生冲突
使用pipework指定网卡地址
使用外网ping容器ip
实现单主机docker容器VLAN划分
安装openvswitch,并安装相关依赖包
创建yum源
解压与打包
查看目录是否有两个文件
安装里面的第一个软件包
启动openvswitch
查看状态
创建交换机 绑定物理接口(需要把br0接口删除)
启动ovs1
查看地址
在主机上创建4个docker容器
将test划分到vlan中
进入容器后ping其他vlan,正确的test1能通test2,不通test3,test4
本文出自 “centos7” 博客,请务必保留此出处http://12832314.blog.51cto.com/12822314/1929936
docker容器互联并且暴露真实网络