如何在多主机之间创建docker覆盖网络?
- 2024-10-18 09:00:00
- admin 原创
- 72
问题描述:
我一直尝试在两台主机之间创建覆盖网络,但没有成功。我一直收到错误消息:
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:8400
或consul 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 的多主机覆盖网络,因此服务可以根据服务名称相互解析。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件