标签:
/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