官方创建overlay网络

Step 1: Set up a key-value store

overlay网络需要key-value存储。存储内包含一些网络状态:discovery, networks, endpoints, ip-addresses等。docker支持Consul,Etcd以及Zookeeper(分布式存储)key-value 存储。以下以Consul为例。

1.登陆安装好以下软件等系统:

Docker Engine, Docker Machine, and VirtualBox software.

2.创建一个名叫 mh-keystore 的machine.

$ docker-machine create -d virtualbox mh-keystore

当你配置好了一个machine, 该进程将给主机添加Docker Engine。这意味着你无需手动安装Consual,而是使用Docker HUB上的Consual镜像来创建。下一步将执导你怎么做。

3.在 mh-keystore machine 上启动 progrium/consul 容器.

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

该命令将启动aprogrium/consul 镜像在mh-keystore machine上创建容器,consuland监听端口是8500.

4.给 mh-keystore machine设置本地的环境变量.

$  eval "$(docker-machine env mh-keystore)"

5.使用docker run 查看consul container.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                            NAMES
4d51392253b3        progrium/consul     "/bin/start -server -"   25 minutes ago      Up 25 minutes       53/tcp, 53/udp, 8300-8302/tcp, 0.0.0.0:8500->8500/tcp, 8400/tcp, 8301-8302/udp   admiring_panini

Step 2: Create a Swarm cluster

在该步骤, 你将使用 docker-machine 来扩展主机网络. 针对这点,你不是真的创建一个网络. 而是在VirtualBox中创建了一些machines .其中一个 machine 将被当作Swarm master; 首先你得创建它. 当你创建完所有主机之后,你要将overlay网络驱动需要的配置参数传递给Engine。

1.创建Swarm master.

$ docker-machine create \
-d virtualbox \
--swarm --swarm-image="swarm" --swarm-master \
--swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
mhs-demo0

在创建期间, 你要给 Engine daemon提供 --cluster-store 参数. 这个参数告诉Engine ,overlay 网络所需要的Key-value存储的位置。脚本$(docker-machine ip mh-keystore) 解析出你在第一步中创建的Consul server的IP address 。--cluster-advertise 参数advertises 将在网络上暴露 machine 。

2.创建其它主机加入到集群中.

$ docker-machine create -d virtualbox \
--swarm --swarm-image="swarm:1.0.0-rc2" \
--swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
mhs-demo1

3.列出machines来验证集群是否启动。

$ docker-machine ls 
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM
default               virtualbox   Running   tcp://192.168.99.100:2376   
mh-keystore           virtualbox   Running   tcp://192.168.99.103:2376   
mhs-demo0             virtualbox   Running   tcp://192.168.99.104:2376           mhs-demo0 (master)
mhs-demo1             virtualbox   Running   tcp://192.168.99.105:2376           mhs-demo0

此时你已经有了运行在网络上的主机,我们准备利用这些主机为容器创建多主机网络。保持终端连接来进行下一步。

Step 3: Create the overlay Network

创建 overlay 网络

1.为 Swarm master设置docker环境。

$ eval $(docker-machine env --swarm mhs-demo0)

使用 --swarm 参数 with docker-machine 限制 the dockercommands to Swarm information alone.

2.使用docker info 查看Swarm.

$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
mhs-demo0: 192.168.99.104:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0-rc1 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
mhs-demo1: 192.168.99.105:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0-rc1 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 2
Total Memory: 2.043 GiB
Name: 30438ece0915
从以上信息看出,在Master运行了3个容器以及保存了2个镜像。

3.创建 overlay 网络.

$ docker network create --driver overlay my-net

你只需在其中一台机器上创建一个overlay的网络即可.在本例中,我们使用master创建了一个overlay网络,但是你也可以在集群的其它任何主机上使用它。

4.验证网络是否可用:

$ docker network ls
NETWORK ID          NAME                DRIVER
412c2496d0eb        mhs-demo1/host      host                
dd51763e6dd2        mhs-demo0/bridge    bridge              
6b07d0be843f        my-net              overlay             
b4234109bd9b        mhs-demo0/none      null                
1aeead6dd890        mhs-demo0/host      host                
d0bb78cbe7bd        mhs-demo1/bridge    bridge              
1c0eb8f69ebb        mhs-demo1/none      null     

由于你处于Swarm master环境, 你可以看到在所有的 Swarm 代理上的所有网络. 注意每一个 NETWORK ID 唯一的. 默认的网络就是 overlay network.

5.依次切换到each Swarm 代理,然后列出网络

$ eval $(docker-machine env mhs-demo0)
$ docker network ls
NETWORK ID          NAME                DRIVER
6b07d0be843f        my-net              overlay             
dd51763e6dd2        bridge              bridge              
b4234109bd9b        none                null                
1aeead6dd890        host                host                

$ eval $(docker-machine env mhs-demo1)
$ docker network ls
NETWORK ID          NAME                DRIVER
d0bb78cbe7bd        bridge              bridge              
1c0eb8f69ebb        none                null                
412c2496d0eb        host                host                
6b07d0be843f        my-net              overlay        

所有的节点都展示出它们有ID为 6b07d0be843f 名为my-net的网络 。此时你的overlay网络就运行成功了。