创建overlay网络可以解决跨主机通信的问题

    1,官方创建overlay网络

    1, 设置一个key-value仓库

    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

    2, 创建一个Swarm集群

    在该步骤, 你将使用 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

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

    3,创建overlay网络

    创建 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网络就运行成功了。

    2,手动搭建overlay网络

    环境配置

    配置三台机器( 注意一定要修改hostname):

    consul: 192.168.31.181 node1: 192.168.31.182 node2: 192.168.31.183

    三台机器同时都要安装docker1.9
    关闭防火墙
    将内核升级到3.18,这里升级到了4.3

    1,选择consul主机,启动consul服务,这里启动的是一个单节点的Consul服务,使用docker提供的容器服务可以方便的让我们启动它,只需简单输入:

    docker run -d -p “8500:8500” -h “consul” progrium/consul -server -bootstrap

    2,在node节点上启动docker daemon 进程:
    docker daemon -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 —cluster-store=consul://192.168.31.181:8500 —cluster-advertise=enp0s3:2376

    —cluster-store指定了consul服务发现地址,—cluster-advertise指定了本机服务注册地址,其中enp0s3是自己网卡的名称,也可以用内网网址192.168.31.182代替。

    3,启动好了之后一开始daemon会no route类似的错误,不用管它,过一会就会注册好,就会报如下类似信息:

    DEBU[6143] Watch triggered with 2 nodes discovery=consul DEBU[6148] Watch triggered with 2 nodes discovery=consul DEBU[6148] Watch triggered with 2 nodes discovery=consul DEBU[6149] 2015/11/25 02:08:12 [DEBUG] memberlist: Initiating push/pull sync with: 192.168.31.132:7946

    memberlist 说明可以发现其它节点,这就说明已经注册成功,也可打开consul所在的主机ip:8500查看:

    http://192.168.31.181:8500

    可以看到consul的ui界面。

    4,使用docker network命令:
    docker network ls docker network create —driver overlay my-net docker run -it —net=my-net centos