转载

Docker 1.9 Overlay Network实现跨主机网络互通

11月4日,Docker发布了1.9版本,实现了原本实验性的Networking组件的支持。用户可以在Swarm中使用它或者将其作为Compose 工具。创建虚拟网络并将其连接到容器上,可实现多个主机上容器相互通信,并且实现不同的应用程序或者应用程序不同部分能够相互隔离。互联子系统设计为可插拔式,兼容VXLAN或者IPVLAN等技术。

Docker 容器实现跨主机通讯主要通过几种方式:自带overlay network插件,第三方插件如weave、ovs等,docker swarm(虽然也是通过key value service进行调用)。在这里主要介绍直接使用自带插件,以及通过docker swarm的两种实现方式。

直接使用自带插件实现容器跨主机访问

测试环境为ubuntu14.04。根据docker建议要求,将内核升级到3.19.如果内核版本过低,将会出现overlay network创建失败或加入失败等一系列问题。

内核升级

#apt-get install linux-generic-lts-vivid

升级完成,重启主机。

# uname -a
Linux ukub09 3.19.0-33-generic #38~14.04.1-Ubuntu SMP Fri Nov 6 18:17:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

启动key value service

可以选择使用zookeeper、etcd、consul等多种组件。本例使用额外一台虚拟机,启用和官方文档相一致的consul镜像。

docker $(docker-machine config consul2) run -d /
-p "8501:8500" /
-h "consul" /
progrium/consul -server -bootstrap

此时可以通过ip:8501对consul服务进行访问。

将key value service信息加入docker daemon

修改希望加入docker overlay network的所有主机上docker daemon服务。

#vi /etc/dafault/docker
DOCKER_OPTS='
-H tcp://0.0.0.0:2376
-H unix:///var/run/docker.sock
--cluster-store=consul://172.25.2.43:8501
--cluster-advertise=eth0:2376

'

通过修改以下两个参数实现

--cluster-store= 参数指向docker daemon所使用key value service的地址

--cluster-advertise= 参数决定了所使用网卡以及docker daemon端口信息

重启docker服务。

#service docker restart

docker 网络的创建与操作

此时可以通过docker network create创建-d overlay属性的驱动。

#docker network create -d overlay over

列出当前网络

root@ukub10:~# docker network ls
NETWORK ID NAME DRIVER
b95efb2ab985 over overlay
0a4a123fc278 bridge bridge
2da9ecadf108 none null
5ca3275ec2a9 host host

在另一台已加入key value service指向的主机上同样可以看到这个网络

root@ukub09:~# docker network ls
NETWORK ID NAME DRIVER
b95efb2ab985 over overlay
b5f9713c9f2b bridge bridge
16e1cdf30f97 none null
cf257529463c host host

docker网络的连接方式

可以在两台主机上分别创建容器,互相进行ping或ssh访问。官方文档例子创建一个nginx容器,并在另一个容器内抓取其状态进行验证。这里不再详述。

创建容器接入指定网络

#docker run -itd --name=testcontainer --net=over  nginx

将容器从指定网络中退出

#docker network disconnect over testcontainer 

重新连入指定网络

#docker network connect over testcontainer

连接与断开将会是实时的。在连接之后,即可通过容器名访问本网络中所有容器。

使用Swarm创建docker cluster实现跨主机管理和网络访问

根据官方文档,需要搭建起基于swarm的cluster,来实现Docker overlay network。为部署整套Docker cluster,需要安装docker machine/compose/swarm等组件。

使用第三方网络插件实现跨主机容器通讯也变得更容易了。

安装docker machine

docker machine用来进行docker的推送安装,可以在许多driver上安装部署docker:

  • amazonec2 azure digitalocean exoscale generic google none

    openstack rackspace softlayer virtualbox vmwarevcloudair

    vmwarevsphere

首先需要安装好docker engine,之后下载并将docker machine的库文件移动到bin下。

#curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip && /
unzip machine.zip && /
rm machine.zip && /
mv docker-machine* /usr/local/bin

验证安装

# docker-machine -v
docker-machine version 0.5.0 (04cfa58)

docker-machine ls

NAME   ACTIVE   DRIVER   STATE   URL   SWARM

官方文档的使用virtualbox进行各种角色主机的启用。本篇文档则在已有的虚拟机环境中进行。

使用docker-machine进行推送安装

首先需要拥有一台linux系统,并使docker-machine主机可以无密码访问到这台系统。

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.2.43

之后即可通过docker-machine进行安装。

安装通过internet下载相关包,并通过docker-machine进行设置安装的。必须保证网络畅通,否则可能安装失败。

#docker-machine create -d generic --generic-ip-address=172.25.2.43 --generic-ssh-user=root test5

安装后,可以查看所有被docker-machine安装控制后的主机状态

# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
c0-master - generic Running tcp://172.25.2.44:2376 c0-master (master)
c0-n1 - generic Running tcp://172.25.2.45:2376 c0-master
c0-n2 - generic Running tcp://172.25.2.46:2376 c0-master
dm01 - generic Running tcp://172.25.2.43:2376
local - generic Running tcp://172.25.2.34:2376

可以查看相应主机的环境变量

#docker-machine env local 

把当前操作环境变更为指定主机

#eval "$(docker-machine env local)"

在docker-machine主机上操纵host

#docker $(docker-machine config local) run -tid ubuntu /bin/bash

通过ssh连接到相应主机

# docker-machine ssh dm01

Docker Compose安装

docker compose用于同时启动多个容器,构成同一组应用环境,在这里用于支持swarm的安装。

curl -L https://github.com/docker/comp ... ose-X 10X- uname -m > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

Docker Swarm集群安装

启用一台主机安装key value service,用于节点、主机发现等工作。

本例使用了consul的镜像,也可以使用如etcd、zookeeper等组件。

在dm01上启动一个consul服务:

docker $(docker-machine config dm01) run -d /
-p "8500:8500" /
-h "consul" /
progrium/consul -server -bootstrap

创建swarm集群可以通过key value服务,也可以使用swarm cluster ID字符串创建。

创建swarm manager

docker-machine create /
-d generic --generic-ip-address=172.25.2.44 --generic-ssh-user=root/
--swarm /
--swarm-master /
--swarm-discovery="consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-advertise=eth0:2376" /
c0-master

创建swarm node

docker-machine create /
-d generic --generic-ip-address=172.25.2.45 --generic-ssh-user=root /
--swarm /
--swarm-discovery="consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-advertise=eth0:2376" /
c0-n1

docker-machine create /
-d generic --generic-ip-address=172.25.2.46 --generic-ssh-user=root /
--swarm /
--swarm-discovery="consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" /
--engine-opt="cluster-advertise=eth0:2376" /
c0-n2

Overlay Network创建

设置环境变量

#eval "$(docker-machine env --swarm c0-master)"

可以用docker info看到现在的集群状况

#docker network create -d overlay myStack1

root@local:~# docker network ls
NETWORK ID NAME DRIVER
685ed9e9f701 myStack1 overlay
4c88e7c52a7c c0-n1/bridge bridge
7fd49a4f6a64 c0-n1/none null
8b2372139902 c0-n2/host host
d998a91dcfea c0-n2/bridge bridge
afd7a1190fb4 c0-n2/none null
0f2b5dae67f7 c0-n1/host host
a45b8049f8e6 c0-master/bridge bridge
d13eed83f250 c0-master/none null
364a592ae9ae c0-master/host host

测试

在c0-n1上启动一个nginx,并加入myStack1网络

#docker run -itd --name=web --net=myStack1 --env="constraint:node==c0-n1" nginx

在c0-n2上启动一个shell,同样加入myStack1网络

#docker run -ti --name=webtest --net=myStack1 --env="constraint:node==c0-n2" ubuntu /bin/bash

在shell中将可以通过容器名或ip获取到web容器的状态

{{{#apt-get install wget

wget -O- http://web }}}

docker在官方文档上主推以swarm的方式创建cluster,相对比较复杂,但提供了整体Cluster的解决方案,可以将容器进行整体管理、推送、使用。

正文到此结束
Loading...