`
阅读更多
    Docker 引擎可以利用 overlay 网络来创建一个跨主机的网络,不过在此之前需要 Docker 引擎以 swarm 模式运行或者拥有一个使用键值存储区的主机群。
    swarm 模式可以使 overlay 网络只能被 swarm 中需要服务的节点所使用。当创建使用 overlay 网络的服务时,swarm 中的管理器节点就会自动扩展 overlay 网络到运行服务任务的节点上。下面的示例演示如何创建网络并在 swarm 中的管理器节点中为服务使用它:
# 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 引擎,需要几个条件:
    1、能够访问键值存储区。
    2、一个能连接到该键值存储区的主机群。
    3、主机群中的每台主机都有一个配置正确的引擎 daemon。
    4、群中的主机必须拥有唯一的主机名,因为键值存储区使用主机名来区分群中的成员。
    条件满足后就可以建立键值存储区了,它里面包含了很多网络状态信息,比如网络、发现及 IP 地址等。Docker 支持 Consul、Etcd 和 ZooKeeper 等键值存储区,本例中使用 Consul。
    1、首先创建一个名为 mh-keystore 的 VirtualBox 机器:
$ docker-machine create -d virtualbox mh-keystore

       在创建一台新机器后,进程会自动为该主机添加 Docker 引擎。这意味着可以利用 Docker 仓库中的 Consul 镜像来创建其实例,而无需手动安装 Consul(见第 3 步)。
    2、设置本地环境为 mh-keyhost(相当于切换到该机器):
$ eval "$(docker-machine env mh-keystore)"

    3、在 mh-keystore 主机上运行 progrium/consul 容器:
$ docker run -d \
             -p "8500:8500" \
             -h "consul" \
             progrium/consul -server -bootstrap

    在建立好键值存储区后,就可以创建 swarm 群了。在此使用“docker-machine create”来创建多台主机,并把其中之一作为 swarm 的管理器。
    1、创建 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

        在创建时,我们为引擎后台程序提供了“cluster-store”选项,该选项会将用于 overlay 网络的键值存储区的位置告知引擎。而“cluster-advertise”选项则是用来在网络上通告该机器。
    2、创建另一台机器并将其添加到 swarm 中:
$ 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

    3、查看已创建的机器运行情况:
$ docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM
default      -        virtualbox   Running   tcp://192.168.99.100:2376
mh-keystore  *        virtualbox   Running   tcp://192.168.99.103:2376
mhs-demo0    -        virtualbox   Running   tcp://192.168.99.104:2376   mhs-demo0 (master)
mhs-demo1    -        virtualbox   Running   tcp://192.168.99.105:2376   mhs-demo0

    现在主机群已准备就绪,接下来就可以为运行在这些主机上的容器创建多主机的 overlay 网络了。
    1、切换 Docker 环境到 swarm 管理器:
$ eval $(docker-machine env --swarm mhs-demo0)

       此处使用了“--swarm”标记将 Docker 命令限制为仅 swarm 信息。
    2、查看 swarm 信息:
$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
mhs-demo0: 192.168.99.104:2376
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: 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
└ Labels: 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
Total Memory: 2.043 GiB
Name: 30438ece0915

       由此可看出在管理器上运行着三个容器和两个镜像。
    3、创建 overlay 网络(只需在 swarm 中的任一机器上创建即可):
$ docker network create --driver overlay --subnet=10.0.9.0/24 my-net

    4、查看运行的网络:
$ docker network ls
 NETWORK ID          NAME                DRIVER
 412c2496d0eb        mhs-demo1/host      host
 dd51763e6dd2        mhs-demo0/bridge    bridge
 6b07d0be843f        my-net              overlay
 b4234109bd9b        mhs-demo0/none      null
 1aeead6dd890        mhs-demo0/host      host
 d0bb78cbe7bd        mhs-demo1/bridge    bridge
 1c0eb8f69ebb        mhs-demo1/none      null

       因为是在 swarm 管理器上,所以在此能看到所有位于 swarm 代理上的网络,包括了每个引擎的默认网络和新创建的 overlay 网络。如果切换到其他 swarm 代理,就只能看到该代理的默认网络以及此处作为多主机的 overlay 网络。
    到此,我们的多主机网络就已经创建完成。接下来就可以在其中任意一台主机上启动一个容器,它会自动成为网络的一部分。下面咱们就来测试一下。
    1、把上下文环境切换到 swarm 管理器:
$ eval $(docker-machine env --swarm mhs-demo0)

    2、在 mhs-demo0 实例上启动 Nginx 服务:
$ docker run -itd --name=web --network=my-net --env="constraint:node==mhs-demo0" nginx

    3、在 mhs-demo1 实例上运行 BusyBox 容器,并获取 Nginx 服务器主页内容:
$ docker run -it --rm --network=my-net --env="constraint:node==mhs-demo1" busybox wget -O- http://web
### 省略输出

    还有一点需要注意的是,连接到多主机网络的容器会自动连接到 docker_gwbridge 网络,此网络允许容器在其群集之外进行外部连接。在任一 swarm 代理上使用“docker network ls”命令均可看到该网络:
$ 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 容器的网络接口将会看到如下情况:
$ docker exec web ip addr
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
     valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
     valid_lft forever preferred_lft forever
 22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
 link/ether 02:42:0a:00:09:03 brd ff: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 link
     valid_lft forever 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 scope global eth1
     valid_lft forever preferred_lft forever
 inet6 fe80::42:acff:fe12:2/64 scope link
     valid_lft forever preferred_lft forever

    可看出 eth0 接口代表的是连接到 my-net overlay 网络的容器接口,而 eth1 则代表的是连接到 docker_gwbridge 网络的容器接口。
分享到:
评论

相关推荐

    计算机网络 发现网络中的活动主机

    在计算机网络领域,发现网络中的活动主机是一项基本且重要的任务,它涉及到网络管理、安全监控以及故障排查等多个方面。这项工作通常通过网络扫描技术来实现,可以让我们了解网络上有哪些设备正在运行,以便进行...

    发现网络中的活动主机 网络应用课程设计

    在进行网络应用课程设计时,一个重要的环节是学习如何发现网络中的活动主机。这个主题涉及到网络扫描技术,它是网络安全和网络管理的基础。本项目以C++编程语言为工具,提供了实现这一功能的完整代码,以及相关的...

    主机overlay和网络overlay介绍 .pptx

    该技术通过在物理服务器上运行的软件实现网络虚拟化功能,如虚拟交换机等,可以跨多个物理服务器构建一个逻辑上的二层网络。 ##### 组网结构 - **TOR(Top-of-Rack)**:位于机架顶部的交换机。 - **Spine(GW)**:...

    Honeyd 创建虚拟主机的小型daemon

    Honeyd是一个可以在网络上创建虚拟主机的小型daemon。可以对此虚拟主机的服务和TCP进行配置,使其在网络中看起来是在运行某种操作系统。Honeyd可以使一台主机在局域网中模拟出多个地址以满足网络实验环境的要求。...

    行业分类-物理装置-一种通过网络策略模板创建云主机的方法、系统及设备.zip

    标题中的“行业分类-物理装置-一种通过网络策略模板创建云主机的方法、系统及设备”表明,这是一个关于云计算领域的技术方案,主要涉及物理设备在云环境中的应用,特别是利用网络策略模板来创建云主机的过程。...

    Honeyd-1.5络上创建虚拟主机的小型daemon

    Honeyd是一个可以在网络上创建虚拟主机的小型daemon。可以对此虚拟主机的服务和TCP进行配置,使其在网络中看起来是在运行某种操作系统。Honeyd可以使一台主机在局域网中模拟出多个地址以满足网络实验环境的要求。...

    C#编写的多线程多主机端口扫描程序

    总的来说,这个C#编写的多线程多主机端口扫描程序展示了如何利用C#的多线程特性来提高网络扫描的效率,同时体现了对网络编程和并发控制的理解。开发者可以通过阅读和分析代码,进一步学习C#的多线程编程和网络通信...

    Java网络编程获取主机信息

    在Java网络编程中,获取主机信息是至关重要的一个环节,这包括本地主机的IP地址、MAC地址、操作系统信息,以及联网后与其他主机交互时获取的...通过深入研究和实践,开发者可以掌握更多高级技巧,提升网络编程能力。

    利用ICMP数据包探测网络中的活动主机 VC++

    本文将深入探讨如何利用ICMP(Internet Control Message Protocol,互联网控制消息协议)数据包进行网络活动主机的探测,这一技术常用于网络管理和故障排查。我们将重点讨论如何使用VC++编程语言来实现这一功能。 ...

    VirtualBox中实现虚拟机与宿主机的网络桥接图解

    这对于需要进行网络测试、开发环境搭建或者进行多设备通信的场景非常有用。例如,你可以设置一个路由器模拟器的虚拟机,并通过桥接让宿主机和其他虚拟机共享该路由器,进行网络路由和流量控制的实验。 总的来说,...

    Netapp添加主机映射配置方式

    创建分区和文件系统是最后一步,这允许主机对存储进行逻辑划分并准备数据存储。 最后,验证主机对存储的访问是至关重要的,以确保所有设置正确无误,系统可以正常运行。这包括检查LUN的可见性、文件系统的挂载状态...

    发现网络中的活动主机

    发现网络中的活动主机 一、网络基础知识点 在计算机网络基础课程设计报告中,旨在让学生掌握网络基本工作原理与实现方法,了解网络课程设计的目的和意义。计算机网络是一门实践性较强的技术,课堂教学应该与实践...

    发现网络中的活动主机报告及源代码

    这一过程涉及到网络编程、错误处理和数据解析等多个方面,有助于提升学生的实际操作能力和对网络协议的理解。 在程序流程上,可能包括以下几个步骤: 1. 接收命令行参数,解析出开始和结束的IP地址。 2. 创建并发送...

    计算机网络试验—通过winsock获取IP主机名

    `gethostbyname`返回一个HOSTENT结构,包含主机的IP地址,而`getaddrinfo`则返回一个链表,其中包含了主机的多个地址信息。 5. **清理与关闭**: 完成所有操作后,记得释放资源。使用`closesocket`函数关闭套接字...

    发现网络中的活动主机(vc++)

    本项目名为“发现网络中的活动主机(vc++)”,其主要目标是利用VC++在局域网内检测并显示活动的主机。该项目涉及到MFC(Microsoft Foundation Classes)库的使用,这是一种C++类库,用于构建Windows GUI应用程序。...

    星外平台代理恒爱网络虚拟主机【后台一键添加插件】.rar

    "星外平台代理恒爱网络虚拟主机【后台一键添加插件】.rar" 这个压缩包文件似乎提供了一个集成解决方案,让用户能够通过星外主控平台代理恒爱网络的虚拟主机服务,并且可以使用后台的一键添加插件功能来增强其功能。...

Global site tag (gtag.js) - Google Analytics