可以将元数据 (例如标签)附加到Docker守护程序。 标签是键/值对,并允许Docker主机成为容器的目标。 标签的语义完全由应用程序定义。 可以在针对特定主机上的任务的服务创建期间指定新约束 。
让我们看看如何在Docker实例中使用标签和约束。
使用多维缩放 (或MDS)的Couchbase允许在多个节点上拆分索引,数据,查询和全文搜索服务。 每种服务的需求是不同的。 例如,查询占用大量CPU,索引占用大量磁盘,数据既包含内存又包含快速读写功能(例如SSD)。
MDS允许根据应用程序需求的变化,在每个节点的基础上独立分配和优化硬件资源。
阅读有关多维缩放的更多信息。
让我们看看如何使用Docker swarm模式在三节点集群中轻松实现这一点。
启动Ubuntu实例
在Ubuntu Server 14.04 LTS(HVM)的EC2上启动三个实例(AMI ID: ami-06116566
)。 除安全组外,在所有情况下均采用默认值。 群集模式需要在主机之间打开以下三个端口 :
- 用于群集管理通信的TCP端口2377
- TCP和UDP端口7946,用于节点之间的通信
- TCP和UDP端口4789,用于覆盖网络流量
确保使用以下规则创建新的安全组:
等待几分钟以供应实例。
在Ubuntu上设置Docker
Swarm模式在Docker 1.12中引入。 在撰写本文时,1.12 RC4是最新的候选者。 使用以下脚本安装具有实验功能的RC4版本:
publicIp=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r .Reservations[].Instances[].PublicDnsName`
for node in $publicIp
do
ssh -o StrictHostKeyChecking=no -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'curl -fsSL https://experimental.docker.com/ | sh'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'sudo usermod -aG docker ubuntu'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'docker version'
done
该脚本假定已经设置了AWS CLI,并为配置的EC2帐户中的所有正在运行的实例执行以下配置:
- 获取每个实例的公共IP地址
- 对于每个实例
- 安装具有实验功能的最新Docker版本
这个简单的脚本将在所有三个实例上设置Docker主机。
将标签分配给Docker Daemon
可以使用DOCKER_OPTS
定义标签。 对于Ubuntu,这是在/etc/default/docker
文件中定义的。
需要为每个节点分配不同的标签。 例如,使用couchbase.mds
键和index
值。
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-1> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=index"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';
您还需要重新启动Docker守护程序。 最后, docker info
显示系统范围的信息:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.0-rc4
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-74-generic
Operating System: Ubuntu 14.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-14-15
ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
couchbase.mds=index
Experimental: true
Insecure Registries:
127.0.0.0/8
WARNING: No swap limit support
如您所见,标签在此信息中可见。
对于第二个节点,分配一个不同的标签:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-2> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=data"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';
确保使用第二个EC2实例的IP地址。 在这种情况下,有关Docker守护程序的更新信息将为:
Labels:
couchbase.mds=data
最后,最后一个节点:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-3> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=query"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';
有关此主机的Docker守护程序的更新信息将显示:
Labels:
couchbase.mds=query
在我们的情况下,将创建一个均质的集群,其中的机器完全相同,包括它们的操作系统,CPU,磁盘和内存容量。 在现实世界中,您通常具有相同的操作系统,但是实例容量(例如磁盘,CPU和内存)会根据要在其上运行的Couchbase服务而有所不同。 在这种情况下,这些标签会很有意义,但它们确实表明了这一点。
启用群模式并创建集群
让我们启用Swarm Mode并创建一个包含1个Manager节点和2个Worker节点的集群。 默认情况下,管理器也是工作程序节点。
在第一个节点上初始化Swarm:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker swarm init --secret mySecret --listen-addr <private-ip>:2377'
这将显示输出:
Swarm initialized: current node (ezrf5ap238kpmyq5h0lf55hxi) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --secret mySecret \
--ca-hash sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683 \
ip-172-31-14-15.us-west-1.compute.internal:2377
添加其他两个节点作为工作器:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-2> 'docker swarm join --secret mySecret <master-internal-ip>:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-3> 'docker swarm join --secret mySecret <master-internal-ip>:2377'
在这种情况下,确切的命令和输出是:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker swarm init --secret mySecret --listen-addr ip-172-31-14-15.us-west-1.compute.internal:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-223-255.us-west-1.compute.amazonaws.com 'docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-251-64.us-west-1.compute.amazonaws.com 'docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377'
现在可以获取有关集群的完整详细信息:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker info'
这显示了输出:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.0-rc4
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge null host overlay
Swarm: active
NodeID: ezrf5ap238kpmyq5h0lf55hxi
IsManager: Yes
Managers: 1
Nodes: 3
CACertHash: sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-74-generic
Operating System: Ubuntu 14.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-14-15
ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
couchbase.mds=index
Experimental: true
Insecure Registries:
127.0.0.0/8
WARNING: No swap limit support
这表明我们已经使用一个管理器创建了一个3节点集群。
带约束运行Docker服务
现在,我们将运行三个具有不同约束条件的Couchbase服务。 每个服务都使用--constraint engine.labels.<label>
格式指定约束,其中<label>
与先前为节点定义的标签匹配。
每个服务都有一个唯一的名称,因为它可以分别缩放它们。 所有命令都直接指向Swarm管理器:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase'
在我们的案例中,确切的命令是:
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase'
34lcko519mvr32hxw2m8dwp5c
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase'
0drcucii08tnx5sm9prug30m1
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase'
可以将服务列表验证为:
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service ls'
输出显示为:
ID NAME REPLICAS IMAGE COMMAND
0drcucii08tn cb-mds-data 1/1 couchbase
34lcko519mvr cb-mds-index 1/1 couchbase
bxjqjm6mashw cb-mds-query 1/1 couchbase
然后可以将每个服务的任务列表(基本上是该服务内的容器)验证为:
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service tasks <service-name>'
在本例中,输出为:
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service tasks cb-mds-index'
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
58jxojx32nf66jwqwt7nyg3cf cb-mds-index.1 cb-mds-index couchbase Running 6 minutes ago Running ip-172-31-14-15
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service tasks cb-mds-data'
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
af9zpuh6956fcih0sr70hfban cb-mds-data.1 cb-mds-data couchbase Running 6 minutes ago Running ip-172-31-14-14
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service tasks cb-mds-query'
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
ceqaza4xk02ha7t1un60jxtem cb-mds-query.1 cb-mds-query couchbase Running 6 minutes ago Running ip-172-31-14-13
这表明服务很好地分布在不同的节点上。 随意检查任务是否确实在带有正确标签的节点上调度。
可以在群集中配置所有Couchbase实例,以为您的Web,移动和IoT应用程序提供完整的数据库解决方案。
想了解更多?
翻译自: https://www.javacodegeeks.com/2016/07/labels-constraints-docker-daemon-service.html