Metadatoscomo etiquetaspuede adjuntarse a un demonio Docker. Una etiqueta es un par clave/valor y permite al host Docker ser un objetivo de contenedores. La semántica de las etiquetas está completamente definida por la aplicación. Un nuevo Docker restricción se pueden especificar durante la creación del servicio apuntando a las tareas en un host en particular. Veamos cómo podemos utilizar etiquetas y restricciones en Docker para una aplicación del mundo real.
Couchbase con escalado multidimensional (o MDS) nos permite dividir el servicio de índices, datos, consultas y búsqueda de texto completo
en varios nodos. Las necesidades de cada servicio son diferentes. Por ejemplo, la consulta requiere mucha CPU, el índice requiere mucho disco y los datos son una mezcla de memoria y lectura/escritura rápida, como SSD. MDS permite que los recursos de hardware se asignen y optimicen de forma independiente por nodo, a medida que cambian los requisitos de la aplicación.
Más información Escala multidimensional.
Veamos cómo hacerlo fácilmente en un cluster de tres nodos utilizando Modo enjambre Docker.
Iniciar instancias de Ubuntu
Inicie tres instancias en EC2 de Ubuntu Server 14.04 LTS (HVM) (AMI ID: ami-06116566). Tome los valores por defecto en todos los casos excepto para el grupo de seguridad. El modo enjambre requiere los tres elementos siguientes puertos abiertos entre hosts:
- Puerto TCP 2377 para las comunicaciones de gestión de clusters
- TCP y Puerto UDP 7946 para la comunicación entre nodos
- TCP y Puerto UDP 4789 para el tráfico de red superpuesta
Asegúrese de crear un nuevo grupo de seguridad con estas reglas:

Espere unos minutos a que se aprovisionen las instancias.
Configurar Docker en Ubuntu
El modo enjambre se introduce en Docker 1.12. En el momento de escribir esto, 1.12 RC4 es la última versión candidata. Utilice el siguiente script para instalar la versión RC4 con características experimentales:
|
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 $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 |
Este script asume que AWS CLI ya está configurado y realiza la siguiente configuración para todos instancias en ejecución en su EC2 configurado
cuenta:
- Obtener la dirección IP pública de cada instancia
- Para cada instancia
- Instalar la última versión de Docker con características experimentales
- Añade
ubuntuusuario aldockergrupo. Esto permite utilizar Docker como usuario no root. - Imprime la versión de Docker
Este sencillo script configurará el host Docker en las tres instancias.
Asignar etiquetas al demonio Docker
Las etiquetas pueden definirse mediante DOCKER_OPTS. En el caso de Ubuntu, se define en el archivo /etc/default/docker archivo. Es necesario asignar etiquetas distintas a cada nodo. Por ejemplo, utilice couchbase.mds clave
y
índice valor.
|
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=index"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker info'; |
También es necesario reiniciar el demonio Docker. Finalmente, información de docker muestra información de todo el sistema:
|
1 2 3 4 5 6 7 8 9 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: 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 |
Como puede ver, las etiquetas son visibles en esta información. Para el segundo nodo, asigne una etiqueta diferente:
|
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=data"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker info'; |
Asegúrese de utilizar la dirección IP de la segunda instancia EC2. La información actualizada sobre el demonio Docker en este caso será:
|
1 2 |
Labels: couchbase.mds=data |
Y finalmente, el último nodo:
|
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=query"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker info'; |
Se mostrará la información actualizada sobre el demonio Docker para este host:
|
1 2 |
Labels: couchbase.mds=query |
En nuestro caso, se crea un cluster homogéneo donde las máquinas son exactamente iguales, incluyendo su sistema operativo, CPU, disco y capacidad de memoria. En el mundo real, normalmente tendrás el mismo sistema operativo pero la capacidad de las instancias, como disco, CPU y memoria, diferirá en función de los servicios de Couchbase que quieras ejecutar en ellas. Estas etiquetas tendrían perfecto sentido en ese caso, pero muestran el punto aquí.
Activar modo enjambre y crear clúster
Activemos el Modo Enjambre y creemos un cluster de 1 Manager y 2 nodos Worker. Por defecto, los managers también son nodos worker. Inicializa Swarm en el primer nodo:
|
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker swarm init --secret mySecret --listen-addr :2377' |
Esto mostrará la salida:
|
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 |
Añade otros dos nodos como trabajador:
|
1 2 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker swarm join --secret mySecret :2377' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker swarm join --secret mySecret :2377' |
Los comandos exactos, y la salida, en este caso son:
|
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' |
Ahora se pueden obtener detalles completos sobre el clúster:
|
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker info' |
Y esto muestra la salida:
|
1 2 3 4 5 6 7 8 9 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: 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 |
Esto muestra que hemos creado un cluster de 3 nodos con un gestor.
Ejecutar un servicio Docker con restricciones
Ahora, vamos a ejecutar tres servicios Couchbase con diferentes restricciones. Cada servicio Docker especifica las restricciones usando--restricción motor.etiquetas. donde coinciden las etiquetas definidas anteriormente para los nodos. Cada servicio recibe un nombre único, ya que permite escalarlos individualmente. Todos los comandos se dirigen al gestor del Enjambre:
|
1 2 3 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase' |
Los comandos exactos en nuestro caso son:
|
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' |
La lista de servicios puede verificarse como:
|
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service ls' |
Esto muestra la salida como:
|
1 2 3 4 |
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 |
Y la lista de tareas (esencialmente contenedores dentro de ese servicio) para cada servicio puede entonces verificarse como:
|
1 |
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service tasks ' |
Y la salida en nuestro caso:
|
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 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 |
Esto muestra que los servicios están bien distribuidos en diferentes nodos. No dudes en comprobar si la tarea está programada en el nodo con la etiqueta correcta. Todas las instancias de Couchbase pueden configurarse en un clúster para proporcionar una solución de base de datos completa para tus aplicaciones web, móviles e IoT. ¿Quieres saber más?
- Modo enjambre Docker
- Couchbase en contenedores
- Síguenos en @couchbasedev o @couchbase
- Haga preguntas sobre Foros de Couchbase
[...] el blog de Couchbase está lleno de contenido, la película Interstellar está disponible en Cocuhbase ? Multidimensional [...]