©
本文档使用
php.cn手册 发布
本文使用一个示例来解释创建多主机网络的基础知识。Docker 通过overlay
网络驱动程序支持多主机网络。与bridge
网络不同,覆盖网络需要一些预先存在的条件才能创建一个:
Docker以群集模式运行
使用密钥值存储的主机群集
使用以群模式运行的 Docker,您可以在管理器节点上创建覆盖网络。
群体使覆盖网络只能用于群体中需要服务的节点。当您创建使用覆盖网络的服务时,管理器节点会自动将覆盖网络扩展到运行服务任务的节点。
要了解有关在群集模式下运行 Docker 的更多信息,请参阅群集模式概述。
下面的例子显示了如何创建一个网络并将其用于群中管理器节点的服务:
# 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
群集的覆盖网络不适用于非托管容器。有关更多信息,请参阅 Docker 群集模式覆盖网络安全模型。
另请参阅将服务附加到覆盖网络。
要将 Docker 引擎与外部键值存储一起使用,您需要以下内容:
访问键值存储。Docker 支持 Consul,Etcd 和 ZooKeeper(分布式存储)键值存储。
连接到键值存储的主机集群。
daemon
集群中每台主机上配置正确的引擎。
集群中的主机必须具有唯一主机名,因为键值存储使用主机名来标识集群成员。
虽然 Docker Machine 和 Docker Swarm 不是强制性体验 Docker 多主机网络的关键值存储,但此示例使用它们来说明它们是如何集成的。您将使用 Machine 来创建键值存储服务器和主机群集。这个例子创建了一个swarm 集群。
注意:以群集模式运行的 Docker Engine 与外部键值存储的网络不兼容。
在开始之前,请确保您的网络上安装了最新版本的 Docker Engine 和 Docker Machine。这个例子也依赖于VirtualBox。如果您使用 Docker Toolbox 安装在 Mac 或 Windows上,则已经安装了所有这些设备。
如果您尚未这样做,请确保将 Docker Engine 和 Docker Machine 升级到最新版本。
覆盖网络需要键值存储。键值存储保存有关网络状态的信息,其中包括发现,网络,端点,IP 地址等。Docker 支持 Consul,Etcd 和 ZooKeeper键值存储。这个例子使用 Consul。
登录到使用先决条件 Docker Engine,Docker Machine 和 VirtualBox软件准备的系统。
配置名为的 VirtualBox 机器mh-keystore
。
$ docker-machine create -d virtualbox mh-keystore
当您供应新机器时,该流程会将 Docker Engine 添加到主机。这意味着不是手动安装 Consul,而是使用Docker Hub 的 consul镜像创建一个实例。你会在下一步做到这一点。
将您的本地环境设置为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
为您的网络配置主机。此时,您不会真正创建网络。您将在VirtualBox中创建多台机器。其中一台机器将作为swarm master; 你会先创建它。在创建每台主机时,您需要在overlay
网络驱动程序所需的机器上传递引擎。
创建一个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
在创建时,您可以为引擎daemon
提供--cluster-store
选项。该选项告诉引擎overlay
网络的键值存储位置。bash扩展$(docker-machine ip mh-keystore)
解析为您在“步骤1”中创建的Consul服务器的IP地址。该--cluster-advertise
选项通告网络上的机器。
创建另一个主机并将其添加到群集。$ 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
此时,您的网络上正在运行一组主机。您已准备好使用这些主机为容器创建多主机网络。
将您的终端打开并继续下一步。
创建覆盖网络
将 docker 环境设置为 swarm master。$ eval $(docker-machine env --swarm mhs-demo0)使用该--swarm
标志docker-machine
限制了docker
单独集群信息的命令。
使用该docker info
命令查看群。
$ docker info容器:3图像:2角色:主要策略:传播过滤器:亲和力,健康,约束,端口,依赖关系节点: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
根据这些信息,您可以看到您正在 Master 上运行三个容器和两个图像。
创建您的overlay
网络。$ docker network create --driver overlay --subnet = 10.0.9.0 / 24 my-net您只需要在集群中的单个主机上创建网络。在这种情况下,您使用了swarm master,但您可以轻松地在集群中的任何主机上运行它。 注意:强烈建议--subnet
在创建网络时使用该选项。如果--subnet
未指定,则docker守护进程会自动选择并为网络分配一个子网,并且可能会与您的基础架构中未由 docker 管理的另一个子网重叠。当容器连接到该网络时,这种重叠会导致连接问题或失败。
检查网络是否正在运行:
$泊坞窗网LS网络ID名称驱动程序412c2496d0eb MHS-demo1的/主机主机dd51763e6dd2 MHS-demo0 /桥桥6b07d0be843f b4234109bd9b MHS-demo0 /无空1aeead6dd890 MHS-demo0 /主机主机我的网覆盖d0bb78cbe7bd MHS-demo1的/桥桥1c0eb8f69ebb MHS -demo1 / null的无
当您处于 swarm master 环境中时,您会看到所有 swarm agent 上的所有网络:每个引擎上的默认网络和单个覆盖网络。注意每个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。您现在正在运行多主机容器网络!在网络上运行应用程序一旦创建了网络,您就可以在任何主机上启动容器,并且它自动成为网络的一部分。
将你的环境指向 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 的内置覆盖网络驱动程序可在同一网络中多个主机上的容器之间提供开箱即用的连接。另外,连接到多主机网络的容器会自动连接到docker_gwbridge
网络。该网络允许容器在群集外部具有外部连接。
将您的环境更改为swarm agent。$ eval $(docker-machine env mhs-demo1)
docker_gwbridge
通过列出网络来查看网络。
$ LS泊坞窗网络ID网络名称驱动程序6b07d0be843f我网覆盖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容器的网络接口。
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状态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
覆盖网络的容器接口。虽然eth1
接口代表连接到所述容器的接口docker_gwbridge
网络。
请参阅 Compose V2 格式中介绍的网络功能,并在上述群集中执行多主机网络场景。
了解 Docker 容器网络
使用网络命令
Docker群集概述
Docker机器概述