Метаданные , такие как метки , могут быть присоединены к демону Docker. Метка является парой ключ / значение и позволяет хосту Docker быть целью контейнеров. Семантика меток полностью определяется приложением. Новое ограничение может быть указано при создании службы, ориентированной на задачи на конкретном хосте.
Давайте посмотрим, как мы можем использовать метки и ограничения в Docker для реального приложения.
Couchbase, использующий многомерное масштабирование (или MDS), позволяет разделить службы индекса, данных, запросов и полнотекстового поиска на несколько узлов. Потребности в каждой услуге разные. Например, Query нагружает процессор, Index интенсивно использует диск, а Data представляет собой сочетание памяти и быстрого чтения / записи, такого как SSD.
MDS позволяет независимо назначать и оптимизировать аппаратные ресурсы для каждого узла в зависимости от требований приложения.
Узнайте больше о многомерном масштабировании .
Давайте посмотрим, как это можно легко сделать в трехузловом кластере, используя режим роя Docker .
Запустите инстансы Ubuntu
Запустите три экземпляра на EC2 Ubuntu Server 14.04 LTS (HVM) (идентификатор AMI: ami-06116566 ). Принимайте значения по умолчанию во всех случаях, кроме группы безопасности. Для режима Swarm требуются следующие три порта, открытые между хостами :
- TCP-порт 2377 для управления кластером
- TCP и UDP порт 7946 для связи между узлами
- TCP и UDP порт 4789 для наложения сетевого трафика
Убедитесь, что создали новую группу безопасности с этими правилами:
Подождите несколько минут, пока экземпляры будут подготовлены.
Настройте Docker на Ubuntu
Рой режим введен в Docker 1.12. На момент написания этой статьи 1.12 RC4 является последним кандидатом. Используйте следующий скрипт для установки релиза RC4 с экспериментальными функциями:
|
1
2
3
4
5
6
7
|
publicIp=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r .Reservations[].Instances[].PublicDnsName`for node in $publicIpdo 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 уже настроен и выполняет следующую настройку для всех запущенных экземпляров в настроенной учетной записи EC2:
- Получить публичный IP-адрес каждого экземпляра
- Для каждого экземпляра
- Установите последнюю версию Docker с экспериментальными функциями
- Добавляет пользователя
ubuntuв группуdocker. Это позволяет использовать Docker как пользователь без полномочий root. - Печатает версию Docker
Этот простой скрипт настроит хост Docker на всех трех экземплярах.
Назначить ярлыки Docker Daemon
Метки могут быть определены с помощью DOCKER_OPTS . Для Ubuntu это определяется в /etc/default/docker .
Отдельные метки должны быть назначены каждому узлу. Например, используйте ключ couchbase.mds и значение index .
|
1
2
3
4
|
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 отображает общесистемную информацию:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
Containers: 0 Running: 0 Paused: 0 Stopped: 0Images: 0Server Version: 1.12.0-rc4Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 0 Dirperm1 Supported: falseLogging Driver: json-fileCgroup Driver: cgroupfsPlugins: Volume: local Network: null host bridge overlaySwarm: inactiveRuntimes: runcDefault Runtime: runcSecurity Options: apparmorKernel Version: 3.13.0-74-genericOperating System: Ubuntu 14.04.3 LTSOSType: linuxArchitecture: x86_64CPUs: 1Total Memory: 992.5 MiBName: ip-172-31-14-15ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFHDocker Root Dir: /var/lib/dockerDebug Mode (client): falseDebug Mode (server): falseRegistry: https://index.docker.io/v1/Labels: couchbase.mds=indexExperimental: trueInsecure Registries: 127.0.0.0/8WARNING: No swap limit support |
Как видите, метки видны в этой информации.
Для второго узла назначьте другую метку:
|
1
2
3
4
|
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'; |
Обязательно используйте IP-адрес второго экземпляра EC2. Обновленная информация о демоне Docker в этом случае будет:
|
1
2
|
Labels: couchbase.mds=data |
И, наконец, последний узел:
|
1
2
3
4
|
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 для этого хоста покажет:
|
1
2
|
Labels: couchbase.mds=query |
В нашем случае создается однородный кластер, в котором машины абсолютно одинаковы, включая их операционную систему, процессор, диск и объем памяти. В реальности у вас обычно будет одна и та же операционная система, но емкость экземпляра, такого как диск, процессор и память, будет отличаться в зависимости от того, какие службы Couchbase вы хотите запустить на них. Эти метки имеют смысл в этом случае, но они показывают смысл здесь.
Включить режим роя и создать кластер
Давайте включим Swarm Mode и создадим кластер из 1 узла Manager и 2 рабочих. По умолчанию менеджер также является рабочим узлом.
Инициализируйте Swarm на первом узле:
|
1
|
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker swarm init --secret mySecret --listen-addr <private-ip>:2377' |
Это покажет вывод:
|
1
2
3
4
5
6
|
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 |
Добавьте два других узла как рабочий:
|
1
2
|
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' |
Точные команды и выходные данные в этом случае:
|
1
2
3
|
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' |
Теперь можно получить полную информацию о кластере:
|
1
|
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker info' |
И это показывает результат:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
Containers: 0 Running: 0 Paused: 0 Stopped: 0Images: 0Server Version: 1.12.0-rc4Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 0 Dirperm1 Supported: falseLogging Driver: json-fileCgroup Driver: cgroupfsPlugins: Volume: local Network: bridge null host overlaySwarm: active NodeID: ezrf5ap238kpmyq5h0lf55hxi IsManager: Yes Managers: 1 Nodes: 3 CACertHash: sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683Runtimes: runcDefault Runtime: runcSecurity Options: apparmorKernel Version: 3.13.0-74-genericOperating System: Ubuntu 14.04.3 LTSOSType: linuxArchitecture: x86_64CPUs: 1Total Memory: 992.5 MiBName: ip-172-31-14-15ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFHDocker Root Dir: /var/lib/dockerDebug Mode (client): falseDebug Mode (server): falseRegistry: https://index.docker.io/v1/Labels: couchbase.mds=indexExperimental: trueInsecure Registries: 127.0.0.0/8WARNING: No swap limit support |
Это показывает, что мы создали кластер из 3 узлов с одним менеджером.
Запустите Docker Service с ограничениями
Теперь мы собираемся запустить три сервиса Couchbase с различными ограничениями. Каждый сервис определяет ограничение, используя --constraint engine.labels.<label> , где <label> соответствует меткам, определенным ранее для узлов.
Каждому сервису присваивается уникальное имя, поскольку оно позволяет масштабировать их индивидуально. Все команды направлены на менеджера Swarm:
|
1
2
3
|
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' |
Точные команды в нашем случае:
|
1
2
3
4
5
|
> 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' |
Список услуг можно проверить как:
|
1
|
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service ls' |
Это показывает вывод как:
|
1
2
3
4
|
ID NAME REPLICAS IMAGE COMMAND0drcucii08tn cb-mds-data 1/1 couchbase 34lcko519mvr cb-mds-index 1/1 couchbase bxjqjm6mashw cb-mds-query 1/1 couchbase |
И список задач (по существу, контейнеров внутри этой службы) для каждой службы затем можно проверить как:
|
1
|
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service tasks <service-name>' |
И вывод в нашем случае:
|
1
2
3
4
5
6
7
8
9
|
> 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 NODE58jxojx32nf66jwqwt7nyg3cf 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 NODEaf9zpuh6956fcih0sr70hfban 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 NODEceqaza4xk02ha7t1un60jxtem cb-mds-query.1 cb-mds-query couchbase Running 6 minutes ago Running ip-172-31-14-13 |
Это показывает, что сервисы хорошо распределены по разным узлам. Не стесняйтесь проверить, действительно ли задача запланирована на узле с правильной меткой.
Все экземпляры Couchbase могут быть сконфигурированы в кластере, чтобы обеспечить полное решение для базы данных для ваших веб, мобильных и IoT-приложений.
Хотите узнать больше?
- Docker Swarm Mode
- Couchbase на контейнерах
- Следуйте за нами на @couchbasedev или @couchbase
- Задавайте вопросы на форумах Couchbase
| Ссылка: | Обозначения и ограничения с помощью Docker Daemon and Service от нашего партнера JCG Аруна Гупты в блоге Miles to go 3.0… . |

