今天我们要来探讨一下注册器的用法,内容不多,主要是为了让大家能够快速上手。
简介
先来说说什么是注册器。注册器会对新创建的Docker容器进行监测并取得容器提供的服务信息。对于我们开发人员来说,所有监听某个端口的进程都可以视为服务,注册器一旦发现容器上运行的服务,就会将其加入到Service Registry中。
下面我会用Consul来做Registry,然后在容器上跑Redis,注册器会自动把这个服务加入到Consul中。
准备工作
第一步,首先要在宿主机上把Docker启起来,宿主机要求比较简单,可以是物理机,也可以是虚拟机,大家在本地机子上装一个boot2docker 虚拟机也是可以的。然后我们要在shell 里面运行docker
client来操作这个主机。当然了,Consul也要先跑起来,不过这次我们要把Consul放到容器里面运行。大家可以通过下面的命令行,用server bootstrap 模式来创建Consul实例:
$ docker run -d --name=consul --net=host gliderlabs/consul-server -bootstrap
在生产环境中运行Consul的方式跟上面还是有差别的,不过今天我们的重点不是这个,这里只是为了给大家打个基础。Consul实例创建好之后,大家可以输入下面的Docker machine的IP地址来访问Consul的HTTP API:
$ curl $(boot2docker ip):8500/v1/catalog/services
{"consul":[]}
接下来就可以启动注册器了。
启动注册器
在一个服务架构中,每个主机节点上都有一个注册器。这里我们只有一台主机,所以我们只需启动一次就可以了。首先大家可能需要做一点配置,指定注册器和Registry(这里我们用的Consul)的连接方式。
除了可选参数之外,注册器用到的参数只有Registry的URI,这个值包含了Registry的类型、连接方式和其他一些选项。
$ docker run -d \
--name=registrator \
--net=host \
--volume=/var/run/docker.sock:/tmp/docker.sock \
gliderlabs/registrator:latest \
consul://localhost:8500
上面的Docker run命令后面跟了几个参数,整个run命令的工作流程如下:首先系统会以detach的方式启动容器并赋给容器一个名称,--net参数表示容器是以主机的network模式运行的,这样注册器才能取到宿主机的主机名和IP,而且以这种模式运行的话容器就比较容易连上Consul。然后我们在--volume参数中加载了Docker socket,这个是必选项,大家一定要记得写。
最后一行命令指定了Registry的URI。因为本例中Consul的网络接口就是本机的8500端口,所以这里我们将consul监听的端口设为localhost:8500
。
$ docker logs registrator
运行上面的命令就可以启动Consul了,系统会显示“Docker事件监听中”,看到这个就表示Consul已经成功跑起来了。
运行Redis
容器启动之后,注册器会自动获取在容器中运行的服务信息,并将其添加到Consul。接下来我们要输入下面的命令,从标准的library镜像来启动Redis:
$ docker run -d -P --name=redis redis
注意这里我们用了-P
参数来发布所有端口。这个参数一般情况下很少用到,主要还是和注册器配合使用。该参数的作用是发布容器锁暴露的所有端口,并随机地为容器分配一个主机端口。因为Consul注册器可以提供服务发现功能,所以用哪个端口都可以。当然大家也可以根据具体情况手动设置端口号。
运行下面的命令可以查看Consul的服务端点信息:
$ curl $(boot2docker ip):8500/v1/catalog/services
{"consul":[],"redis":[]}
可以看到Consul下面已经有redis服务的信息了。大家可以运行下面的命令查看redis的服务端点信息,关于服务的详细信息都在里面。比方说我们可以查看容器的哪些端口被转发了:
$ curl $(boot2docker ip):8500/v1/catalog/service/redis
[{"Node":"boot2docker","Address":"10.0.2.15","ServiceID":"boot2docker:redis:6379","ServiceName":"redis","ServiceTags":null,"ServiceAddress":"","ServicePort":32768}]
如果我们删除了redis容器,在Consul里面也可以看到容器被删除的信息:
$ docker rm -f redis
redis
$ curl $(boot2docker ip):8500/v1/catalog/service/redis
[]
本文只讲了如何通在Consul中注册容器服务,可能会有点枯燥,但还是建议大家好好看一看。在Consul中注册服务之后,我们就可以对服务进行大量操作,不过这些不在本文探讨范围之内,以后我们会逐渐讲到这些内容。当然,注册器的设置和容器的运行都存在很多种方式,我们也可以通过其他的办法来创建自定义服务,大家如果感兴趣的话可以自己去网上找相关教程来学习,这里就不再赘述了。
如果我们删除了redis容器,在Consul里面也可以看到容器被删除的信息:
$ docker rm -f redis
redis
$ curl $(boot2docker ip):8500/v1/catalog/service/redis
[]
本文只讲了如何通在Consul中注册容器服务,可能会有点枯燥,但还是建议大家好好看一看。在Consul中注册服务之后,我们就可以对服务进行大量操作,不过这些不在本文探讨范围之内,以后我们会逐渐讲到这些内容。当然,注册器的设置和容器的运行都存在很多种方式,我们也可以通过其他的办法来创建自定义服务,大家如果感兴趣的话可以自己去网上找相关教程来学习,这里就不再赘述了。