如何在多主机之间创建docker覆盖网络?

2024-10-18 09:00:00
admin
原创
71
摘要:问题描述:我一直尝试在两台主机之间创建覆盖网络,但没有成功。我一直收到错误消息:mavungu@mavungu-Aspire-5250:~$ sudo docker -H tcp://192.168.0.18:2380 network create -d overlay myapp Error respons...

问题描述:

我一直尝试在两台主机之间创建覆盖网络,但没有成功。我一直收到错误消息:

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

我有一个 Swarm 集群,可以很好地与 Consul 配合使用作为发现机制:

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并且它与 Swarm 集群配合良好。

我希望能够在两台主机之间创建一个覆盖网络。我已使用以下附加设置在两台主机上配置了 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"

我不得不停止并重新启动引擎,然后重置 Swarm 集群...在无法创建覆盖网络后,我将 --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"

但还是没用。我不确定应该为 设定什么 ip:port --cluster-advertise=。文档、讨论和教程都不清楚这个广告的事情。

这里有些地方我搞错了。请帮忙。


解决方案 1:

执行docker run命令时,请务必添加--net myapp。以下是完整的分步教程(在线版本):

如何在具有多主机网络的集群上部署 Swarm

TL;DR:使用Swarm部署多主机网络的分步教程。我想尽快将本教程放到网上,所以我甚至没有花时间做演示。markdown 文件可在我的网站的 github上找到。欢迎随意改编和分享,它已获得 Creative Commons Attribution 4.0 International License 的许可。

先决条件

环境

  • 本教程使用docker engine 1.9.0完成。

  • Swarm代理是通过共享文件发现的(其他方法也可用)。

  • Consul 0.5.2用于多主机网络群容器的发现。

Swarm管理器和consul主节点将在名为 bugs20 的机器上运行。其他节点 bugs19、bugs18、bugs17 和 bugs16 将成为Swarm代理和consul成员。

开始之前

Consul用于多主机网络,可以使用任何其他键值存储 - 请注意,该引擎支持Consul Etcd 和 ZooKeeper。令牌(或静态文件)用于群集代理发现。令牌使用 REST API,最好使用静态文件。

网络

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

Docker 守护进程

所有节点都运行docker daemon,如下所示:

/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

将守护进程绑定到接口以允许其成为Swarm集群的一部分。显然可以指定 IP 地址,如果您有多个 NIC,这是一个更好的解决方案。

--cluster-advertise eth0:2375

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

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

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

由于consul是分布式的,因此 URL 可以是本地的(请记住,swarm代理也是consul成员),这样更加灵活,因为您不必指定consul主服务器的 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

确保你的 中有 consul 二进制文件的路径$PATH。进入目录后,只需输入export PATH=$PATH:$(pwd)即可。

还假设变量$IP已正确设置并导出。这可以通过.bashrc以下.zshrc方式完成:

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

领事

让我们开始根据需要部署所有consul成员和 master。

领事主管 (bugs20)

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

选项详细信息:

agent -server

启动consul代理作为服务器。

-bootstrap-expect 1

我们仅期望有一位主人。

-node=master20

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

-bind=192.168.196.20

指定应绑定的 IP 地址。如果只有一个 NIC,则可选。

-client=192.168.196.20

指定服务器应绑定的 RPC IP 地址。默认情况下为 localhost。请注意,我不确定此选项的必要性,并且这会强制添加-rpc-addr=192.168.196.20:8400本地请求,例如consul members -rpc-addr=192.168.196.20:8400consul join -rpc-addr=192.168.196.20:8400 192.168.196.9加入具有 IP 地址的consul192.168.196.9成员。

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

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

建议使用tmux或者类似程序,并使用:setw synchronize-panes on以下选项执行以下命令:consul -d agent -data-dir /tmp/consul -node=$HOST -bind=$IP启动所有consul成员。

加入领事成员

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验证你的成员是否是你的consul部署的一部分:

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

Consul成员和 master 已部署并运行。现在的重点将放在 docker 和swarm上。


群体

下面详细介绍了使用两种不同方法创建集群管理器和发现集群成员的方法:令牌和静态文件。令牌使用 Docker Hub 托管的发现服务,而静态文件只是本地的,不使用网络(也不使用任何服务器)。静态文件解决方案应该是首选(实际上也更容易)。

[静态文件]加入群组成员时启动群组管理器

创建一个名为/tmp/cluster.disco且内容为 的文件swarm_agent_ip:2375

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 管理器:

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

您已经完成了!

[token] 创建并启动 Swarm 管理器

在 Swarm Master(bugs20)上,创建一个 Swarm:

ldocker run --rm swarm create > swarm_id

这将创建一个 swarm 并将 token ID 保存在swarm_id当前目录的文件中。创建后,swarm 管理器需要作为守护进程运行:

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

要验证它是否已启动,您可以运行:

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

[token] 将 Swarm 成员加入到 Swarm 集群中

然后,群体管理器将需要一些群体代理加入。

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] 会很忙,这些命令需要在不同的终端上运行。-d在 之前添加 ajoin应该可以解决这个问题,并允许使用 for 循环进行连接。

群组成员加入后:

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

在发现群体成员后

要验证成员是否已被很好地发现,您可以执行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

然后是:

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

如图所示,这些容器通过 bug{16...19} 进行传播。


多主机网络

需要网络覆盖,以便所有容器都可以“插入”此覆盖。要创建此网络覆盖,请执行:

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

瞧!

创建此覆盖后,将其添加--net net到命令中swarm-docker run --rm -it ubuntu bash,您的所有容器将能够像在同一个 LAN 上一样进行本地通信。默认网络为 10.0.0.0/24。

启用多播

默认覆盖不支持多播。需要另一个驱动程序才能使用多播。docker 插件weave net支持多播。

要使用此驱动程序,安装后,您需要$weave launch在所有 Swarm 代理和 Swarm 管理器上运行。然后,您需要将编织连接在一起,这可以通过运行来完成$weave connect $SWARM_MANAGER_IP。它显然不是 Swarm 管理器的 IP 地址,但这样做更简洁(或使用除 Swarm 代理之外的其他节点)。

此时 weave 集群已部署,但尚未创建 weave 网络。运行$swarm-docker network create --driver weave weave-net将创建名为 的 weave 网络weave-net。使用 启动容器--net weave-net将使它们能够共享同一 LAN 并使用多播。启动此类容器的完整命令示例为:$swarm-docker run --rm -it --privileged --net=weave-net ubuntu bash

解决方案 2:

我认为您指定的选项应该使用cluster-store=consul而不是cluster-store-consul。尝试重置并重新启动引擎和 Swarm 并检查它是否正常工作。之后它应该可以正常工作。入门文档清楚地解释了如何使用 consul 作为后备数据存储来配置 docker 覆盖网络。

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"

解决方案 3:

对于自Docker 1.12发布以来接触这一领域的人来说,这现在变得非常简单 - Swarm Mode内置于引擎中,你不需要 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

该主机成为集群中的第一个管理器节点,并写出用于将其他节点加入集群的命令 - 秘密令牌和管理器正在监听的 IP 地址。

在第二台主机上:

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

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

使用以下命令在管理节点上创建覆盖网络:

> docker network create -d overlay my-net
d99lmsfzhcb16pdp2k7o9sehv

现在您拥有一个具有内置 DNS 的多主机覆盖网络,因此服务可以根据服务名称相互解析。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用