标签:
/etc/network/interfaces
里);docker0
IP范围的一小部分,防止新容器的IP地址发生重叠。.deb
文件(一次),然后分发给不同主机。为了保持生产机的整洁,可另外找台小主机来安装开发包,并构建安装包。#获取最新存档 wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz tar xzvf openvswitch-2.3.1.tar.gz cd openvswitch-2.3.1 #安装依赖 sudo apt-get install -y build-essential fakeroot debhelper autoconf automake bzip2 libssl-dev openssl graphviz python-all procps python-qt4 python-zopeinterface python-twisted-conch libtool # 构建(不使用并行检查) DEB_BUILD_OPTIONS=‘parallel=8 nocheck‘ fakeroot debian/rules binary # 得到最新deb文件并复制到某处 cd .. ls -al *deb
.deb
安装包,接下来将其推送并安装到所有主机上。# 复制包到各主机并ssh登录 scp -r *deb user@remote_host:~/. ssh user@remote_host # 安装一些依赖(后面需要)并安装包 sudo apt-get install -y bridge-utils sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb openvswitch-switch_2.3.1-1_amd64.deb
ovs-vsctl
),不过Ubuntu提供了一个辅助工具让你可以通过/etc/network/interfaces
文件定义网络。/etc/network/interfaces
大概如下。... # eth0、eth1和lo配置 ... # auto:为了有效地在主机启动时启动它 # br0=br0:防止在`ifquery --list`时被找到 auto br0=br0 allow-ovs br0 iface br0 inet manual ovs_type OVSBridge ovs_ports gre1 gre2 ovs_extra set bridge ${IFACE} stp_enable=true mtu 1462 # 没有auto,这是ovs的一个额外配置 # 两台主机的gre名字必须相符 allow-br0 gre1 iface gre1 inet manual ovs_type OVSPort ovs_bridge br0 ovs_extra set interface ${IFACE} type=gre options:remote_ip=2.2.2.2 allow-br0 gre2 iface gre2 inet manual ovs_type OVSPort ovs_bridge br0 ovs_extra set interface ${IFACE} type=gre options:remote_ip=3.3.3.3 # auto:启动时创建 # 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上 # 每台主机需要使用不同的IP地址(不要相互冲突!) auto docker0=docker0 iface docker0 inet static address 172.17.42.1 network 172.17.0.0 netmask 255.255.0.0 bridge_ports br0 mtu 1462
remote_ip
的IP地址要相互配对。br0
网桥添加stp_enable=true
将确保一些gre
隧道被切断。同时确保网状网络的冗余,允许网络在其中一台主机下线时恢复。=
”:对于具有固定IP的服务器这不是必需的,但有些云服务商(这里就不说是谁了……Digital Ocean(译者:软广再次乱入))使用了一个依靠ifquery --list --allow auto
的init服务(/etc/init/cloud-init-container.conf
)。不加上“=
”号将包含OpenVSwitch网卡,并延迟整个启动过程直到init脚本失败并超时。172.17.42.1
、172.17.42.2
)。由于docker0
网桥处在br0
网桥之上,它们将(也应该!)可以相互连接。想象一下,要解决IP冲突会有多乱……这也是为什么我们要在启动时定义它,而不依赖docker服务来为我们创建这个网桥。ifconfig
时你可以看到gre0
,却看不到其他隧道。这可能是gre0
作为虚拟网卡的一个副作用。从gre1
开始将让所有的gre
隧道对ifconfig
“隐身”(好过于只能看见一个)。别着急,你还是可以使用ovs-vsctl
命令显示隧道/网桥。br0
网桥定义中更新ovs_ports
以包含interfaces
文件中定义的所有gre
隧道。ping 172.17.42.2
或其他IP;iperf
,通过ifconfig
查看使用中的链接;docker0
网桥上。让Docker自动完成这步不是很棒么?答案在于Docker有能力分配一个最小的IP地址池!1.1.1.1
、2.2.2.2
、3.3.3.3
)挂接到前面创建的docker0
网桥上,其各自的IP地址是172.17.42.1
、172.17.42.2
、172.17.42.3
;docker0
网卡指定了一个/16的IP范围;docker0
的IP范围,以/18 fixed-cidr
的形式保存在它们的docker服务配置中。分别是172.17.64.0/18
、172.17.128.0/18
、172.17.192.0/18
。/etc/default/docker
)是这样的:BRIDGE=docker0 CIDR=172.17.64.0/18 wait_ip() { address=$(ip add show $BRIDGE | grep ‘inet ‘ | awk ‘{print $2}‘) [ -z "$address" ] && sleep $1 || : } wait_ip 5 wait_ip 15 DOCKER_OPTS=" -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --fixed-cidr=$CIDR --bridge $BRIDGE --mtu 1462 "
DOCKER_OPTS
配置,添加镜像、不安全的registry、DNS等等。docker0
网桥最后被创建,获取IP地址可能需要花点时间。使用wait_ip
“功能”,你可以在返回docker init脚本前安全地等待几秒钟。该配置文件是被真正的init脚本(/etc/init/docker.conf
)所引用。0.0.0.0
将其“公开”(或绑定到服务器“真实”网卡之一),你也可以将它安全地绑定到……该主机的docker0
IP地址(比如172.17.42.2
)!这样,你可以从任何一台主机访问到私有网状网络里的任何一个docker服务。# 访问host1 ssh user@host1 # 运行一个新容器 docker run -ti ubuntu bash # 检查IP(在容器内运行) ip add | grep eth0 # # 在其他窗口中 # # 访问另一台主机(host2或3) ssh user@host2 # 运行一个新容器 docker run -ti ubuntu bash # Ping其他的容器! ping $IP
标签:
原文地址:http://www.cnblogs.com/cexo/p/4379473.html