?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
本文使用一個示例來解釋創(chuàng)建多主機網(wǎng)絡的基礎知識。Docker 通過overlay
網(wǎng)絡驅動程序支持多主機網(wǎng)絡。與bridge
網(wǎng)絡不同,覆蓋網(wǎng)絡需要一些預先存在的條件才能創(chuàng)建一個:
Docker以群集模式運行
使用密鑰值存儲的主機群集
使用以群模式運行的 Docker,您可以在管理器節(jié)點上創(chuàng)建覆蓋網(wǎng)絡。
群體使覆蓋網(wǎng)絡只能用于群體中需要服務的節(jié)點。當您創(chuàng)建使用覆蓋網(wǎng)絡的服務時,管理器節(jié)點會自動將覆蓋網(wǎng)絡擴展到運行服務任務的節(jié)點。
要了解有關在群集模式下運行 Docker 的更多信息,請參閱群集模式概述。
下面的例子顯示了如何創(chuàng)建一個網(wǎng)絡并將其用于群中管理器節(jié)點的服務:
# Create an overlay network `my-multi-host-network`.$ docker network create \ --driver overlay \ --subnet 10.0.9.0/24 \ my-multi-host-network 400g6bwzd68jizzdx5pgyoe95 # Create an nginx service and extend the my-multi-host-network to nodes where # the service's tasks run.$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx 716thylsndqma81j6kkkb5aus
群集的覆蓋網(wǎng)絡不適用于非托管容器。有關更多信息,請參閱 Docker 群集模式覆蓋網(wǎng)絡安全模型。
另請參閱將服務附加到覆蓋網(wǎng)絡。
要將 Docker 引擎與外部鍵值存儲一起使用,您需要以下內容:
訪問鍵值存儲。Docker 支持 Consul,Etcd 和 ZooKeeper(分布式存儲)鍵值存儲。
連接到鍵值存儲的主機集群。
daemon
集群中每臺主機上配置正確的引擎。
集群中的主機必須具有唯一主機名,因為鍵值存儲使用主機名來標識集群成員。
雖然 Docker Machine 和 Docker Swarm 不是強制性體驗 Docker 多主機網(wǎng)絡的關鍵值存儲,但此示例使用它們來說明它們是如何集成的。您將使用 Machine 來創(chuàng)建鍵值存儲服務器和主機群集。這個例子創(chuàng)建了一個swarm 集群。
注意:以群集模式運行的 Docker Engine 與外部鍵值存儲的網(wǎng)絡不兼容。
在開始之前,請確保您的網(wǎng)絡上安裝了最新版本的 Docker Engine 和 Docker Machine。這個例子也依賴于VirtualBox。如果您使用 Docker Toolbox 安裝在 Mac 或 Windows上,則已經(jīng)安裝了所有這些設備。
如果您尚未這樣做,請確保將 Docker Engine 和 Docker Machine 升級到最新版本。
覆蓋網(wǎng)絡需要鍵值存儲。鍵值存儲保存有關網(wǎng)絡狀態(tài)的信息,其中包括發(fā)現(xiàn),網(wǎng)絡,端點,IP 地址等。Docker 支持 Consul,Etcd 和 ZooKeeper鍵值存儲。這個例子使用 Consul。
登錄到使用先決條件 Docker Engine,Docker Machine 和 VirtualBox軟件準備的系統(tǒng)。
配置名為的 VirtualBox 機器mh-keystore
。
$ docker-machine create -d virtualbox mh-keystore
當您供應新機器時,該流程會將 Docker Engine 添加到主機。這意味著不是手動安裝 Consul,而是使用Docker Hub 的 consul鏡像創(chuàng)建一個實例。你會在下一步做到這一點。
將您的本地環(huán)境設置為mh-keystore
機器。$ eval“$(docker-machine env mh-keystore)”
啟動progrium/consul
在mh-keystore
機器上運行的容器。
$ docker run -d \ -p“8500:8500”\ -h“consul”\ progrium / consul -server -bootstrap
客戶端啟動progrium/consul
在mh-keystore
機器中運行的映像。服務器被調用consul
并正在偵聽端口8500
。
Run the docker ps
command to see the consul
container. $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d51392253b3 progrium/consul "/bin/start -server -" 25 minutes ago Up 25 minutes 53/tcp, 53/udp, 8300-8302/tcp, 0.0.0.0:8500->8500/tcp, 8400/tcp, 8301-8302/udp admiring_panini Keep your terminal open and move onto the next step.Create a swarm clusterIn this step, you use docker-machine
為您的網(wǎng)絡配置主機。此時,您不會真正創(chuàng)建網(wǎng)絡。您將在VirtualBox中創(chuàng)建多臺機器。其中一臺機器將作為swarm master; 你會先創(chuàng)建它。在創(chuàng)建每臺主機時,您需要在overlay
網(wǎng)絡驅動程序所需的機器上傳遞引擎。
創(chuàng)建一個swarm主。
$ docker-machine create \ -d virtualbox \ --swarm --swarm-master \ --swarm-discovery =“consul:// $(docker-machine ip mh -keystore):8500”\ --engine-opt = “cluster-store = consul:// $(docker-machine ip mh -keystore):8500”\ --engine-opt =“cluster-advertise = eth1:2376”\ mhs-demo0
在創(chuàng)建時,您可以為引擎daemon
提供--cluster-store
選項。該選項告訴引擎overlay
網(wǎng)絡的鍵值存儲位置。bash擴展$(docker-machine ip mh-keystore)
解析為您在“步驟1”中創(chuàng)建的Consul服務器的IP地址。該--cluster-advertise
選項通告網(wǎng)絡上的機器。
創(chuàng)建另一個主機并將其添加到群集。$ docker-machine create -d virtualbox \ --swarm \ --swarm-discovery =“consul:// $(docker-machine ip mh -keystore):8500”\ --engine-opt =“cluster-store = consul :// $(docker-machine ip mh-keystore):8500“\ --engine-opt =”cluster-advertise = eth1:2376“\ mhs-demo1
列出您的機器以確認它們全部正常運行。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default - virtualbox運行tcp://192.168.99.100:2376 mh -keystore * virtualbox運行tcp://192.168.99.103:2376 mhs-demo0 - virtualbox運行tcp://192.168 .99.104:2376 mhs-demo0(主)mhs-demo1 - virtualbox運行tcp://192.168.99.105:2376 mhs-demo0
此時,您的網(wǎng)絡上正在運行一組主機。您已準備好使用這些主機為容器創(chuàng)建多主機網(wǎng)絡。
將您的終端打開并繼續(xù)下一步。
創(chuàng)建覆蓋網(wǎng)絡
將 docker 環(huán)境設置為 swarm master。$ eval $(docker-machine env --swarm mhs-demo0)使用該--swarm
標志docker-machine
限制了docker
單獨集群信息的命令。
使用該docker info
命令查看群。
$ docker info容器:3圖像:2角色:主要策略:傳播過濾器:親和力,健康,約束,端口,依賴關系節(jié)點:2 mhs-demo0:192.168.99.104:2376└容器:2└保留的CPU:0/1└保留內存:0 B / 1.021 GiB└標簽:executiondriver = native-0.2,kernelversion = 4.1.10-boot2docker,operatingsystem = Boot2Docker 1.9.0(TCL 6.4); master:4187d2c - Wed Oct 14 14:00:28 UTC 2015,provider = virtualbox,storagedriver = aufs mhs-demo1:192.168.99.105:2376└Containers:1└Reserved CPUs:0/1└Reserved Memory:0 B / 1.021 GiB└標簽:executiondriver = native-0.2,kernelversion = 4.1.10-boot2docker,operatingsystem = Boot2Docker 1.9.0(TCL 6.4); master:4187d2c - Wed Oct 14 14:00:28 UTC 2015,provider = virtualbox,storagedriver = aufs CPUs:2總內存:2.043 GiB名稱:30438ece0915
根據(jù)這些信息,您可以看到您正在 Master 上運行三個容器和兩個圖像。
創(chuàng)建您的overlay
網(wǎng)絡。$ docker network create --driver overlay --subnet = 10.0.9.0 / 24 my-net您只需要在集群中的單個主機上創(chuàng)建網(wǎng)絡。在這種情況下,您使用了swarm master,但您可以輕松地在集群中的任何主機上運行它。 注意:強烈建議--subnet
在創(chuàng)建網(wǎng)絡時使用該選項。如果--subnet
未指定,則docker守護進程會自動選擇并為網(wǎng)絡分配一個子網(wǎng),并且可能會與您的基礎架構中未由 docker 管理的另一個子網(wǎng)重疊。當容器連接到該網(wǎng)絡時,這種重疊會導致連接問題或失敗。
檢查網(wǎng)絡是否正在運行:
$泊塢窗網(wǎng)LS網(wǎng)絡ID名稱驅動程序412c2496d0eb MHS-demo1的/主機主機dd51763e6dd2 MHS-demo0 /橋橋6b07d0be843f b4234109bd9b MHS-demo0 /無空1aeead6dd890 MHS-demo0 /主機主機我的網(wǎng)覆蓋d0bb78cbe7bd MHS-demo1的/橋橋1c0eb8f69ebb MHS -demo1 / null的無
當您處于 swarm master 環(huán)境中時,您會看到所有 swarm agent 上的所有網(wǎng)絡:每個引擎上的默認網(wǎng)絡和單個覆蓋網(wǎng)絡。注意每個NETWORK ID
都是唯一的。
Switch to each swarm agent in turn and list the networks. $ eval $(docker-machine env mhs-demo0) $ docker network ls NETWORK ID NAME DRIVER 6b07d0be843f my-net overlay dd51763e6dd2 bridge bridge b4234109bd9b none null 1aeead6dd890 host host $ eval $(docker-machine env mhs-demo1) $ docker network ls NETWORK ID NAME DRIVER d0bb78cbe7bd bridge bridge 1c0eb8f69ebb none null 412c2496d0eb host host 6b07d0be843f my-net overlay Both agents report they have the my-net
network with the 6b07d0be843f
ID。您現(xiàn)在正在運行多主機容器網(wǎng)絡!在網(wǎng)絡上運行應用程序一旦創(chuàng)建了網(wǎng)絡,您就可以在任何主機上啟動容器,并且它自動成為網(wǎng)絡的一部分。
將你的環(huán)境指向 swarm master。
$ eval $(docker-machine env --swarm mhs-demo0)
在mhs-demo0
實例上啟動一個Nginx Web服務器。$ docker run -itd --name = web --network = my-net --env =“constraint:node == mhs-demo0”nginx
在實例上運行 BusyBox 實例mhs-demo1
并獲取Nginx服務器主頁的內容。
$ docker run -it --rm --network=my-net --env="constraint:node==mhs-demo1" busybox wget -O- http://web Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox ab2b8a86ca6c: Pull complete 2c5ac3f849df: Pull complete Digest: sha256:5551dbdfc48d66734d0f01cafee0952cb6e8eeecd1e2492240bf2fd9640c2279 Status: Downloaded newer image for busybox:latest Connecting to web (10.0.0.2:80) <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> - 100% |*******************************| 612 0:00:00 ETA
如您所見,Docker 的內置覆蓋網(wǎng)絡驅動程序可在同一網(wǎng)絡中多個主機上的容器之間提供開箱即用的連接。另外,連接到多主機網(wǎng)絡的容器會自動連接到docker_gwbridge
網(wǎng)絡。該網(wǎng)絡允許容器在群集外部具有外部連接。
將您的環(huán)境更改為swarm agent。$ eval $(docker-machine env mhs-demo1)
docker_gwbridge
通過列出網(wǎng)絡來查看網(wǎng)絡。
$ LS泊塢窗網(wǎng)絡ID網(wǎng)絡名稱驅動程序6b07d0be843f我網(wǎng)覆蓋dd51763e6dd2橋橋b4234109bd9b返回null 1aeead6dd890主機主橋e1dbd5dff8be docker_gwbridge
重復swarm master上的步驟1和2。$ eval $(docker-machine env mhs-demo0)$ docker network ls NETWORK ID NAME DRIVER 6b07d0be843f my-net overlay d0bb78cbe7bd bridge bridge 1c0eb8f69ebb none null 412c2496d0eb host host 97102a22e8d2 docker_gwbridge bridge
檢查Nginx容器的網(wǎng)絡接口。
00:00:00:00:00 brd 00:00:00:00:00:$ docker exec web ip addr 1:lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group默認鏈接/ 00 inet 127.0.0.1/8作用域主機lo valid_lft永遠preferred_lft永遠inet6 :: 1/128作用域主機valid_lft永遠preferred_lft永遠22:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue狀態(tài)UP組默認鏈接/ ether 02:42:0a:00:09:03 brd ff:ff:ff:ff:ff:inet 10.0.9.3/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80 :: 42:aff:fe00:903/64 scope永久鏈接valid_lft preferred_lft forever 24:eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link / ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff :ff inet 172.18.0。2/16范圍全局eth1 valid_lft永遠preferred_lft永遠inet6 fe80 :: 42:acff:fe12:2/64范圍鏈接valid_lft forever永遠preferred_lft永遠
該eth0
接口表示連接到my-net
覆蓋網(wǎng)絡的容器接口。雖然eth1
接口代表連接到所述容器的接口docker_gwbridge
網(wǎng)絡。
請參閱 Compose V2 格式中介紹的網(wǎng)絡功能,并在上述群集中執(zhí)行多主機網(wǎng)絡場景。
了解 Docker 容器網(wǎng)絡
使用網(wǎng)絡命令
Docker群集概述
Docker機器概述