我一直在尝试在两台主机之间创建一个覆盖网络但没有成功.我一直收到错误消息:
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
并且它与群集群一起使用.
我希望能够在两台主机上创建一个覆盖网络.我已使用以下附加设置在两台主机上配置了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"
我必须停止并重新启动引擎并重置群集群集...在无法创建覆盖网络后,我将--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=
.关于这个广告的文档,讨论和教程并不清楚.
我在这里遇到了一些问题.请帮忙.
执行docker run
命令时,请务必添加--net myapp
.这是一个完整的分步教程(在线版本):
TL; DR:使用Swarm部署多主机网络的分步教程.我想尽快在线提供这个教程,所以我甚至没有花时间进行演示.markdown文件可以在我网站的github上找到.随意适应和分享,它是根据知识共享署名4.0国际许可证授权.
使用docker engine 1.9.0完成的教程.
通过共享文件发现Swarm代理(其他方法可用).
Consul 0.5.2用于发现多主机网络群集容器.
Swarm管理器和consul master将在名为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守护进程,如下所示:
/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地址进行说明,如果您有多个NIC,这是一个更好的解决方案.
--cluster-advertise eth0:2375
定义docker守护程序用于通告自身的接口和端口.
--cluster-store consul://127.0.0.1:8500
定义分布式存储后端的URL.在我们的案例中,我们使用consul,尽管还有其他可以使用的发现工具,如果您想下定决心,您应该对阅读此服务发现比较感兴趣.
随着consul的分发,URL可以是本地的(请记住,swarm代理也是consul成员),这更灵活,因为您不必指定consul master 的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
.一旦你进入目录,只需输入即可export PATH=$PATH:$(pwd)
.
还假设$IP
已正确设置和导出变量.这可以通过以下方式完成,.bashrc
或者通过以下方式完成.zshrc
:
export IP=$(ifconfig |grep "192.168.196."|cut -d ":" -f 2|cut -d " " -f 1)
让我们开始根据需要部署所有领事成员和主人.
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=master -bind=$IP -client $IP选项细节:
agent -server
将consul代理作为服务器启动.
-bootstrap-expect 1
我们只希望有一位大师.
-node=master20
该consul服务器/主服务器将命名为"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地址的领事成员192.168.196.9
.
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
领事成员和主人都已部署并正在工作.重点将放在码头和群上.
在下文中,使用两种不同的方法详细说明了swarm管理器和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
而且你已经完成了!
在swarm master(bugs20)上,创建一个swarm:
ldocker run --rm swarm create > swarm_id
这将创建一个swarm并将令牌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
然后,群体管理器将需要一些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
之前添加join
应该解决这个问题并使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
如图所示,容器通过虫子传播{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 launch
在所有Swarm代理和Swarm管理器上运行.然后你需要将编织连接在一起,这是通过运行来完成的$weave connect $SWARM_MANAGER_IP
.它显然不是Swarm管理器的IP地址,但它更干净(或者使用除Swarm代理之外的其他节点).
此时已部署编织群集,但尚未创建编织网络.Running $swarm-docker network create --driver weave weave-net
将创建名为的编织网络weave-net
.使用它启动容器--net weave-net
将使它们共享相同的LAN并使用多播.启动此类容器的完整命令示例如下:$swarm-docker run --rm -it --privileged --net=weave-net ubuntu bash
.