如何在多主机之间创builddocker覆盖networking?

我一直在尝试在两台主机之间创build一个覆盖networking,但没有成功。 我不断收到错误消息:

mavungu@mavungu-Aspire-5250:~$ sudo docker -H tcp://192.168.0.18:2380 network create -d overlay myapp Error response from daemon: 500 Internal Server Error: failed to parse pool request for address space "GlobalDefault" pool "" subpool "": cannot find address space GlobalDefault (most likely the backing datastore is not configured) mavungu@mavungu-Aspire-5250:~$ sudo docker network create -d overlay myapp [sudo] password for mavungu: Error response from daemon: failed to parse pool request for address space "GlobalDefault" pool "" subpool "": cannot find address space GlobalDefault (most likely the backing datastore is not configured) 

我的环境详情:

 mavungu@mavungu-Aspire-5250:~$ sudo docker info Containers: 1 Images: 364 Server Version: 1.9.1 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 368 Dirperm1 Supported: true Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 3.19.0-26-generic Operating System: Ubuntu 15.04 CPUs: 2 Total Memory: 3.593 GiB Name: mavungu-Aspire-5250 Registry: https://index.docker.io/v1/ WARNING: No swap limit support 

作为发现机制,我有一个群集与领事合作的很好:

 mavungu@mavungu-Aspire-5250:~$ sudo docker -H tcp://192.168.0.18:2380 info Containers: 4 Images: 51 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 2 mavungu-Aspire-5250: 192.168.0.36:2375 └ Containers: 1 └ Reserved CPUs: 0 / 2 └ Reserved Memory: 0 B / 3.773 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.19.0-26-generic, operatingsystem=Ubuntu 15.04, storagedriver=aufs mavungu-HP-Pavilion-15-Notebook-PC: 192.168.0.18:2375 └ Containers: 3 └ Reserved CPUs: 0 / 4 └ Reserved Memory: 0 B / 3.942 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.2.0-19-generic, operatingsystem=Ubuntu 15.10, storagedriver=aufs CPUs: 6 Total Memory: 7.715 GiB Name: bb47f4e57436 

我的领事是在192.168.0.18:8500可用,它适用于群集。

我希望能够跨两个主机创build覆盖networking。 我已经在这两个主机上configuration了这个附加设置的docker引擎:

 DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:0" DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:0" 

我必须停止并重新启动引擎并重置群集…在创build覆盖networking失败后,我将–cluster-advertise设置更改为:

 DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:2375" DOCKER_OPTS="-D --cluster-store-consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:2375" 

但仍然没有奏效。 我不确定应该为--cluster-advertise=设置什么ip:port。 文档,讨论和教程不清楚这个广告的东西。

有什么我在这里错了。 请帮忙。

当你执行--net myapp docker run命令时,一定要添加--net myapp 。 这是一个完整的一步一步的教程( 在线版 ):

如何在具有多主机networking的群集上部署群集

TL; DR:使用Swarm部署多主机networking的分步教程。 我想把这个教程尽快在网上,所以我甚至没有花时间来演示。 降价档案可在我网站的github上find 。 随意调整和分享它,它是根据知识共享署名4.0国际许可证授权的 。

先决条件

环境

  • 使用docker engine 1.9.0完成的教程。
  • Swarm代理通过共享文件被发现( 其他方法可用 )。
  • Consul 0.5.2用于多主机networking群集容器的发现 。

Swarm经理和领事高手将在名为bugs20的机器上运行。 其他节点,bugs19,bugs18,bugs17和bugs16,将是群体代理和领事成员。

在我们开始之前

Consul用于多主机networking,可以使用任何其他键值存储 – 请注意引擎支持Consul Etcd和ZooKeeper 。 令牌(或静态文件)用于群体代理发现。 令牌使用REST API,首选静态文件。

networking

networking范围是192.168.196.0/25。 名为bugsN的主机的IP地址为192.168.196.N.

docker守护程序

所有节点都运行docker守护进程如下:

 /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-advertise eth0:2375 --cluster-store consul://127.0.0.1:8500 

选项详情:

 -H tcp://0.0.0.0:2375 

将守护进程绑定到一个接口以允许成为群集的一部分。 一个IP地址显然可以指定,如果你有几个网卡,这是一个更好的解决scheme。

 --cluster-advertise eth0:2375 

定义docker守护进程应该用来宣传自己的接口和端口。

 --cluster-store consul://127.0.0.1:8500 

定义分布式存储后端的URL。 在我们的案例中,我们使用consul ,尽pipe还有其他可以使用的发现工具,但是如果您想下定决心,您应该对阅读这个服务发现比较感兴趣。

由于领事分布,URL可以是本地的(记住, 群代理也是领队成员),这是更加灵活的,因为你不必指定领事主的IP地址,并在docker守护进程启动后被选中。

使用的别名

在以下命令中使用这两个别名:

 alias ldocker='docker -H tcp://0.0.0.0:2375' alias swarm-docker='docker -H tcp://0.0.0.0:5732' #used only on the swarm manager 

请确保您的$PATH中有consul二进制文件的$PATH 。 一旦你在目录中,只需inputexport PATH=$PATH:$(pwd)就可以了。

还假设variables$IP已被正确设置和导出。 可以这样做,感谢.bashrc.zshrc ,否则,就像这样:

 export IP=$(ifconfig |grep "192.168.196."|cut -d ":" -f 2|cut -d " " -f 1) 

领事

让我们开始部署所有领事成员,并根据需要掌握。

领事大师(bugs20)

 consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=master -bind=$IP -client $IP 

选项详情:

 agent -server 

作为服务器启动领事代理。

 -bootstrap-expect 1 

我们只期望一个主人。

 -node=master20 

这位领事服务器/主人将被命名为“master20”。

 -bind=192.168.196.20 

指定应该绑定的IP地址。 如果你只有一个网卡,可选。

 -client=192.168.196.20 

指定服务器应绑定到的RPC IP地址。 默认情况下它是本地主机。 请注意,我不确定此选项的必要性,并强制为本地请求(如consul members -rpc-addr=192.168.196.20:8400consul join -rpc-addr=192.168.196.20:8400 192.168.196.9 -rpc-addr=192.168.196.20:8400添加-rpc-addr=192.168.196.20:8400 consul join -rpc-addr=192.168.196.20:8400 192.168.196.9join具有IP地址192.168.196.9的领事成员。

领事成员(错误{16..19})

 consul agent -data-dir /tmp/consul -node=$HOSTNAME -bind=192.168.196.N 

build议使用tmux或类似的选项:setw synchronize-panes on so this one command: consul -d agent -data-dir /tmp/consul -node=$HOST -bind=$IP启动所有领事成员。

join领事成员

 consul join -rpc-addr=192.168.196.20:8400 192.168.196.16 consul join -rpc-addr=192.168.196.20:8400 192.168.196.17 consul join -rpc-addr=192.168.196.20:8400 192.168.196.18 consul join -rpc-addr=192.168.196.20:8400 192.168.196.19 

一行命令也可以使用。 如果你正在使用zsh,那么consul join -rpc-addr=192.168.196.20:8400 192.168.196.{16..19}就够了,或者是一个foor循环: for i in $(seq 16 1 19); do consul join -rpc-addr=192.168.196.20:8400 192.168.196.$i;done for i in $(seq 16 1 19); do consul join -rpc-addr=192.168.196.20:8400 192.168.196.$i;done 。 您可以使用以下命令validation您的成员是否是您的领事部署的一部分:

 consul members -rpc-addr=192.168.196.20:8400 Node Address Status Type Build Protocol DC master20 192.168.196.20:8301 alive server 0.5.2 2 dc1 bugs19 192.168.196.19:8301 alive client 0.5.2 2 dc1 bugs18 192.168.196.18:8301 alive client 0.5.2 2 dc1 bugs17 192.168.196.17:8301 alive client 0.5.2 2 dc1 bugs16 192.168.196.16:8301 alive client 0.5.2 2 dc1 

领事成员和硕士部署和工作。 现在的重点是docker和群 。


一群

在下文中,使用两种不同的方法来详细描述swarm manager和swarm members discovery的创build:令牌和静态文件。 令牌使用Docker Hub托pipe的发现服务,而静态文件只是本地的,不使用networking(也不使用任何服务器)。 静态文件解决scheme应该是首选(实际上更容易)。

[静态文件] 在joinswarm成员时启动swarmpipe理器

使用内容swarm_agent_ip:2375创build一个名为/tmp/cluster.disco的文件。

 cat /tmp/cluster.disco 192.168.196.16:2375 192.168.196.17:2375 192.168.196.18:2375 192.168.196.19:2375 

然后按照以下步骤启动swarm manager:

 ldocker run -v /tmp/cluster.disco:/tmp/cluster.disco -d -p 5732:2375 swarm manage file:///tmp/cluster.disco 

你完成了!

[令牌]创build并启动swarmpipe理器

在swarm master(bugs20)上,创build一个swarm:

 ldocker run --rm swarm create > swarm_id 

这将创build一个群并将令牌I​​D保存在当前目录的文件swarm_id中。 一旦创build,swarmpipe理器需要作为守护进程运行:

 ldocker run -d -p 5732:2375 swarm manage token://`cat swarm_id` 

要validation它是否启动,您可以运行:

 ldocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d28238445532 swarm "/swarm manage token:" 5 seconds ago Up 4 seconds 0.0.0.0:5732->2375/tcp cranky_liskov 

[令牌]将swarm成员joinswarm群集

然后swarm经理将需要一些swarm代理join。

 ldocker run swarm join --addr=192.168.196.16:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.17:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.18:2375 token://`cat swarm_id` ldocker run swarm join --addr=192.168.196.19:2375 token://`cat swarm_id` 

std [in | out]会很忙,这些命令需要在不同的terminal上运行。 在join添加-d应该解决这个问题,并使得for-loop可以用于连接。

团队成员join之后:

 auzias@bugs20:~$ ldocker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1de6e4ee3fc swarm "/swarm join --addr=1" 5 seconds ago Up 4 seconds 2375/tcp fervent_lichterman 338572b87ce9 swarm "/swarm join --addr=1" 6 seconds ago Up 4 seconds 2375/tcp mad_ramanujan 7083e4d6c7ea swarm "/swarm join --addr=1" 7 seconds ago Up 5 seconds 2375/tcp naughty_sammet 0c5abc6075da swarm "/swarm join --addr=1" 8 seconds ago Up 6 seconds 2375/tcp gloomy_cray ab746399f106 swarm "/swarm manage token:" 25 seconds ago Up 23 seconds 0.0.0.0:5732->2375/tcp ecstatic_shockley 

虫群成员发现后

为了validation这些成员是否被发现,你可以执行swarm-docker info

 auzias@bugs20:~$ swarm-docker info Containers: 4 Images: 4 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 4 bugs16: 192.168.196.16:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs17: 192.168.196.17:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs18: 192.168.196.18:2375 └ Containers: 0 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs bugs19: 192.168.196.19:2375 └ Containers: 4 └ Reserved CPUs: 0 / 12 └ Reserved Memory: 0 B / 49.62 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), storagedriver=aufs CPUs: 48 Total Memory: 198.5 GiB Name: ab746399f106 

此时swarm被部署,所有的容器运行将在不同的节点上运行。 通过执行几个:

 auzias@bugs20:~$ swarm-docker run --rm -it ubuntu bash 

然后a:

 auzias@bugs20:~$ swarm-docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 45b19d76d38e ubuntu "bash" 6 seconds ago Up 5 seconds bugs18/boring_mccarthy 53e87693606e ubuntu "bash" 6 seconds ago Up 5 seconds bugs16/amazing_colden b18081f26a35 ubuntu "bash" 6 seconds ago Up 4 seconds bugs17/small_newton f582d4af4444 ubuntu "bash" 7 seconds ago Up 4 seconds bugs18/naughty_banach b3d689d749f9 ubuntu "bash" 7 seconds ago Up 4 seconds bugs17/pensive_keller f9e86f609ffa ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/pensive_cray b53a46c01783 ubuntu "bash" 7 seconds ago Up 4 seconds bugs18/reverent_ritchie 78896a73191b ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/gloomy_bell a991d887a894 ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/angry_swanson a43122662e92 ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/pensive_kowalevski 68d874bc19f9 ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/modest_payne e79b3307f6e6 ubuntu "bash" 7 seconds ago Up 5 seconds bugs18/stoic_wescoff caac9466d86f ubuntu "bash" 7 seconds ago Up 5 seconds bugs17/goofy_snyder 7748d01d34ee ubuntu "bash" 7 seconds ago Up 5 seconds bugs16/fervent_einstein 99da2a91a925 ubuntu "bash" 7 seconds ago Up 5 seconds bugs18/modest_goodall cd308099faac ubuntu "bash" 7 seconds ago Up 6 seconds bugs19/furious_ritchie 

如图所示,这些容器通过错误{16 … 19}传播。


多主机networking

networking覆盖是必要的,所以所有的容器可以“插入”这个覆盖。 要创build此networking覆盖,请执行:

 auzias@bugs20:~$ swarm-docker network create -d overlay net auzias@bugs20:~$ swarm-docker network ls|grep "net" c96760503d06 net overlay 

瞧!

一旦创build了这个覆盖层,添加--net net到命令swarm-docker run --rm -it ubuntu bash并且你的所有容器都能够本地通信,就好像它们在同一个局域网上一样。 默认networking是10.0.0.0/24。

启用多播

多播不支持默认的覆盖。 另一个驱动程序需要能够使用多播。 docker插件编织网确实支持多播。

要使用这个驱动程序,一旦安装,你将需要在所有Swarm代理和Swarmpipe理器上运行$weave launch 。 然后,您需要将织物连接在一起,这通过运行$weave connect $SWARM_MANAGER_IP 。 这显然不是Swarmpipe理器的IP地址,但是它更清洁(或者使用另一个节点,而不是Swarm代理)。

此时,编织群集已部署,但尚未创build编织networking。 运行$swarm-docker network create --driver weave weave-net将创build名为weave-net的编织networking。 使用--net weave-net启动容器将使它们能够共享相同的局域网并使用组播。 启动这样的容器的完整命令的例子是: $swarm-docker run --rm -it --privileged --net=weave-net ubuntu bash

我认为你指定的选项应该使用cluster-store=consul而不是cluster-store-consul 。 尝试重置并重新启动引擎,并检查它是否工作。 它应该在那之后工作。 入门文档清楚地说明了如何使用consul作为后台数据存储来configurationdocker覆盖networking。

 DOCKER_OPTS="-D --cluster-store=consul://192.168.0.18:8500 --cluster-advertise=192.168.0.18:2375" DOCKER_OPTS="-D --cluster-store=consul://192.168.0.18:8500 --cluster-advertise=192.168.0.36:2375" 

对于任何来自Docker 1.12发布的人来说,现在这已经非常简单了 – 群集模式被内置到引擎中,并且不需要Consul或其他任何额外的组件。

假设你有两台安装了Docker的主机,在第一台机器上初始化Swarm:

 > docker swarm init Swarm initialized: current node (6ujd4o5fx1dmav5uvv4khrp33) is now a manager To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-54xs4bn7qs6su3xjjn7ul5am9z9073by2aqpey56tnccbi93zy-blugim00fuozg6qs289etc \ 172.17.0.54:2377 

该主机成为群中的第一个pipe理节点,并将用于join其他节点的命令写出到群中 – 秘密令牌和pipe理器正在侦听的IP地址。

在第二主机上:

 > docker swarm join 172.17.0.54:2377 --token SWMTKN-1-54xs4bn7qs6su3xjjn7ul5am9z9073by2aqpey56tnccbi93zy-blugim00fuozg6qs289etc This node joined a swarm as a worker. 

现在你有一个安全的双节点群,它具有服务发现 , 滚动更新和服务扩展 。

在pipe理器节点上创build覆盖networking:

 > docker network create -d overlay my-net d99lmsfzhcb16pdp2k7o9sehv 

现在你有一个内置DNS的多主机覆盖networking,所以服务可以根据服务名称来parsing对方。