[英]how to create docker overlay network between multi hosts?
我一直在嘗試在兩台主機之間創建一個覆蓋網絡但沒有成功。 我一直收到錯誤消息:
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"
但它仍然沒有用。 我不確定應該為--cluster-advertise=
設置什么ip:port。 關於這個廣告的文檔,討論和教程並不清楚。
我在這里遇到了一些問題。 請幫忙。
執行--net myapp
docker run
命令時,請務必添加--net myapp
。 這是一個完整的分步教程( 在線版本 ):
TL; DR:使用Swarm部署多主機網絡的分步教程。 我想盡快在線提供這個教程,所以我甚至沒有花時間進行演示。 markdown文件可以在我網站的github上找到 。 隨意適應和分享,它是根據知識共享署名4.0國際許可證授權 。
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守護程序啟動后選擇。
使用的別名在以下命令中,使用了這兩個別名:
-node=master20
一定要在$PATH
中使用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 agent -data-dir /tmp/consul -node=$HOSTNAME -bind=192.168.196.N
選項細節:
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
將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
我們只希望有一位大師。
-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
的領事成員。
ldocker run -v /tmp/cluster.disco:/tmp/cluster.disco -d -p 5732:2375 swarm manage file:///tmp/cluster.disco
建議使用tmux或類似的選項:setw synchronize-panes on
so this one命令: consul -d agent -data-dir /tmp/consul -node=$HOST -bind=$IP
啟動所有領事成員。
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
。 您可以使用以下命令驗證您的成員是否參與了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的托管發現服務,而靜態文件只是本地的,不使用網絡(也不使用任何服務器)。 靜態文件解決方案應該是首選(實際上更容易)。
使用內容swarm_agent_ip:2375
創建名為/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管理器如下:
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 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]將忙,這些命令需要在不同的終端上運行。 在join
添加-d
應解決此問題並啟用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插件編織網確實支持多播。
要使用此驅動程序,一旦安裝,您將需要在所有Swarm代理和Swarm管理器上運行$weave launch
。 然后你需要將編織連接在一起,這是通過運行$weave connect $SWARM_MANAGER_IP
。 它顯然不是Swarm管理器的IP地址,但它更干凈(或者使用除Swarm代理之外的其他節點)。
此時已部署編織群集,但尚未創建編織網絡。 運行$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
。
我認為您指定的選項應該使用cluster-store=consul
而不是cluster-store-consul
。 嘗試重置並重新啟動引擎和swarm並檢查它是否有效。 它應該在那之后工作。 入門文檔清楚地解釋了如何使用consul作為支持數據存儲來配置docker overlay網絡。
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發布以來的任何人來說,現在這很簡單 - Swarm模式內置於引擎中,您不需要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
該主機成為swarm中的第一個管理器節點,它寫出用於將其他節點加入swarm的命令 - 秘密令牌以及管理器正在偵聽的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的多主機覆蓋網絡,因此服務可以根據服務名稱相互解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.