Docker Daemon和服务的标签和约束

可以将元数据 (例如标签)附加到Docker守护程序。 标签是键/值对,并允许Docker主机成为容器的目标。 标签的语义完全由应用程序定义。 可以在针对特定主机上的任务的服务创建期间指定新约束

让我们看看如何在Docker实例中使用标签和约束。

使用多维缩放 (或MDS)的Couchbase允许在多个节点上拆分索引,数据,查询和全文搜索服务。 每种服务的需求是不同的。 例如,查询占用大量CPU,索引占用大量磁盘,数据既包含内存又包含快速读写功能(例如SSD)。

MDS允许根据应用程序需求的变化,在每个节点的基础上独立分配和优化硬件资源。

沙发底座

阅读有关多维缩放的更多信息。

让我们看看如何使用Docker swarm模式在三节点集群中轻松实现这一点。

启动Ubuntu实例

在Ubuntu Server 14.04 LTS(HVM)的EC2上启动三个实例(AMI ID: ami-06116566 )。 除安全组外,在所有情况下均采用默认值。 群集模式需要在主机之间打开以下三个端口

  • 用于群集管理通信的TCP端口2377
  • TCPUDP端口7946,用于节点之间的通信
  • TCPUDP端口4789,用于覆盖网络流量

确保使用以下规则创建新的安全组:

ec2-swarmmode-security-group

等待几分钟以供应实例。

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值