DNS Round Robin的概念是,你可以有两个不同的主机,其DNS别名响应同一个DNS名称。你在哪里可以找到这样的东西?考虑一下像Instagram这样的服务。他们需要一个以上的服务器来提供他们的服务,但用户总是去同一个Instagram.com域名来使用该服务。一个名字,许多服务器提供服务。除了负载平衡和服务器扩展,DNS Round Robin是大公司可以用来确保24/7/365正常运行时间的另一种技术。换句话说,有几个IP地址和DNS记录支持终端用户使用的一个公共名称(在这种情况下是Instagram.com)。这个概念同样适用于容器,在本教程中,我们将看看Docker中的DNS Round Robin。
创建一个自定义的虚拟网络
这个练习的第一步是在Docker中创建一个新的虚拟网络。在这个例子中,自定义虚拟网络的名称是dns_test。
> docker network create dns_test
0d64fe86c328dbcffe93cc631f720349c9fc840474dd63461b13ad4c75acefee
添加两个容器
在这一步中,我们添加两个容器,同时将它们附加到我们新的dns_test网络上。你会注意到[-network-alias]选项的使用,它为你正在启动的容器添加了一个网络范围的别名。这个例子使用的别名是 "search"。
> docker container run -d --network dns_test --network-alias search elasticsearch:2
398ed3ce1c72128e08c97cce30a05aa2da5d85d3690bf997b25a04a13d880a13
现在我们将第二个容器添加到同一个dns_test网络中。这个容器当然会有它自己独特的ID,但是它使用的是相同的网络别名 "search"。所以我们的目标是,对 "search "域名的请求将由这两个容器中的任何一个提供服务。
> docker container run -d --network dns_test --network-alias search elasticsearch:2
6886d224dc68fb2eaa43cc284d2a49a24ec605fbb61f2cfc199a1021c0798c33
列出来的容器显示它们已经成功启动。尽管我们没有手动发布任何端口,我们可以看到这些容器有一些暴露的端口。这些是[Docker文件]的一部分,它允许在同一虚拟网络的这些端口上进行通信。我们只需要使用-p,如果我们想向外部世界暴露,而不仅仅是虚拟网络本身。
> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6886d224dc68 elasticsearch:2 "/docker-entrypoint.…" 12 seconds ago Up 12 seconds 9200/tcp, 9300/tcp charming_keldysh
398ed3ce1c72 elasticsearch:2 "/docker-entrypoint.…" 22 seconds ago Up 21 seconds 9200/tcp, 9300/tcp flamboyant_hodgkin
测试DNS Round Robin
在这个阶段,我们有两个容器使用相同的别名,那么我们如何测试每个容器对 "搜索 "名称的请求都有响应呢?为此,我们可以临时启动一个alpine容器,并简单地从容器中对 "搜索 "名称运行nslookup命令。注意,我们在这里使用了-rm选项,这意味着一旦它完成了工作,就可以简单地移除容器。在这种情况下,这意味着一旦nslookup运行并完成其工作,该容器就会消失。看起来DNS Round Robin实际上也在工作,因为从nslookup的输出中我们可以看到172.19.0.2和172.19.0.3都与同一个DNS名称 "search "有关。很好!
> docker container run --rm --network dns_test alpine nslookup search
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
df20fa9351a1: Pull complete
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest
Address: 127.0.0.11:53
Non-authoritative answer:
Name: search
Address: 172.19.0.2
Name: search
Address: 172.19.0.3
Non-authoritative answer:
作为DNS Round Robin的最后测试,我们可以临时运行一个已经安装了curl的centos容器。容器启动后,它通过curl -s search:9200 向 "search "域名发出一个 curl 请求。通过运行这个命令几次,你可以看到一个响应使用的是 "Asteroth "这个名字,另一个使用的是 "Blindspot"。所以,再一次,round robin正在工作。
> docker container run --rm --network dns_test centos curl -s search:9200
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Status: Downloaded newer image for centos:latest
{
"name" : "Asteroth",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.4.6",
"build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
"build_timestamp" : "2017-07-18T12:17:44Z",
"build_snapshot" : false,
"lucene_version" : "5.5.4"
},
"tagline" : "You Know, for Search"
}
> docker container run --rm --network dns_test centos curl -s search:9200
{
"name" : "Blindspot",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "S0DJCGPnS32txAEO8t9-Qw",
"version" : {
"number" : "2.4.6",
"build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
"build_timestamp" : "2017-07-18T12:17:44Z",
"build_snapshot" : false,
"lucene_version" : "5.5.4"
},
"tagline" : "You Know, for Search"
}
再一次,列出正在运行的容器,这样我们就可以看到它们的名字,以便删除它们。
> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6886d224dc68 elasticsearch:2 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 9200/tcp, 9300/tcp charming_keldysh
398ed3ce1c72 elasticsearch:2 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 9200/tcp, 9300/tcp flamboyant_hodgkin
最后,删除我们用于测试的两个容器,以清理Docker环境。
> docker container rm -f charming_keldysh flamboyant_hodgkin
charming_keldysh
flamboyant_hodgkin