La pla­ta­fo­r­ma de co­n­te­ne­do­res Docker permite di­s­tri­buir apli­ca­cio­nes en la red a modo de tareas de forma rápida y cómoda y ahorrando recursos. Todo lo que se necesita para ello es Swarm, el ad­mi­ni­s­tra­dor de clústeres de Docker que con la de­no­mi­na­ción de “Swarm Mode” se incluye como función nativa de la Docker engine desde la versión 1.12.0 y con ello forma parte del software nuclear de la pla­ta­fo­r­ma. Docker Swarm permite escalar las apli­ca­cio­nes basadas en co­n­te­ne­do­res, ge­s­tio­ná­n­do­las en tantas in­s­ta­n­cias y en tantos nodos de red como se requiera. Si, por el contrario, quieres ejecutar en un clúster una apli­ca­ción mu­l­ti­co­n­te­ne­dor, conocida también como “stack” (lote), es mejor recurrir a la he­rra­mie­n­ta Docker Compose. A co­n­ti­nua­ción, te aclaramos los conceptos básicos de la or­que­s­ta­ción de Docker con Swarm y Compose así como los pasos para im­ple­me­n­tar­los según los códigos uti­li­za­dos de ejemplo.

Docker Swarm

Swarm es un software creado por los pro­gra­ma­do­res de Docker que permite agrupar una serie de hosts de Docker en un clúster y gestionar los clústeres de forma ce­n­tra­li­za­da así como orquestar los co­n­te­ne­do­res. Aunque hasta la versión 1.11 de Docker había que im­ple­me­n­tar Swarm como una he­rra­mie­n­ta aparte, las versiones po­s­te­rio­res de la pla­ta­fo­r­ma de co­n­te­ne­do­res soportan un modo nativo swarm (también conocido como modo enjambre), por lo que cuando los usuarios instalan el Docker engine, también tienen a su di­s­po­si­ción este gestor de clústeres.

Docker Swarm se basa en una ar­qui­te­c­tu­ra maestro-esclavo. Cada clúster de Docker está formado al menos por un nodo maestro (también llamado ad­mi­ni­s­tra­dor o manager) y tantos nodos esclavos (llamados de trabajo o workers) como sea necesario. Mientras que el maestro de Swarm es re­s­po­n­sa­ble de la gestión del clúster y la de­le­ga­ción de tareas, el esclavo se encarga de ejecutar las unidades de trabajo (tasks o tareas). Además, las apli­ca­cio­nes de co­n­te­ne­do­res se di­s­tri­bu­yen en servicios en las cuentas de Docker elegidas.

En la jerga de Docker, “service” o servicio designa una es­tru­c­tu­ra abstracta con la que se pueden definir aquellas tareas que deben eje­cu­tar­se en el clúster. Cada servicio está formado por un conjunto de tareas in­di­vi­dua­les que se procesan en co­n­te­ne­do­res in­de­pe­n­die­n­tes en uno de los nodos del clúster. Cuando se crea un servicio, el usuario determina la imagen de co­n­te­ne­dor en la que se basa y los comandos que se ejecutan en el co­n­te­ne­dor, ope­rá­n­do­se sobre la base de la imagen. Docker Swarm soporta dos modos de definir servicios swarm: servicios globales o re­pli­ca­dos.

  • Servicios re­pli­ca­dos: se trata de tareas que se ejecutan en un número de réplicas definido por el usuario. A su vez, cada réplica es una instancia del co­n­te­ne­dor definido en el servicio. Los servicios re­pli­ca­dos se pueden escalar, pe­r­mi­tie­n­do a los usuarios crear réplicas adi­cio­na­les. Si así se requiere, un servidor web como NGINX se puede escalar en 2, 4 o 100 in­s­ta­n­cias con una sola línea de comandos.
  • Servicios globales: si un servicio se ejecuta en modo global, cada nodo di­s­po­ni­ble en el clúster inicia una tarea para el servicio co­rre­s­po­n­die­n­te. Si al clúster se le añade un nodo nuevo, el maestro de Swarm le atribuye una tarea para el servicio global de forma inmediata. Este tipo de servicios se re­co­mie­n­da para las apli­ca­cio­nes de monitoreo o los programas antivirus.

Uno de los campos en los que se puede aplicar Docker Swarm es el reparto de cargas, pues con el modo enjambre Docker dispone de funciones in­te­gra­das de balanceo de carga. Si se ejecuta, por ejemplo, un servidor web NGINX con cuatro in­s­ta­n­cias, Docker di­s­tri­bu­ye las consultas entrantes de forma in­te­li­ge­n­te entre las in­s­ta­n­cias del servidor web di­s­po­ni­bles.

Docker Compose

Docker Compose permite definir las apli­ca­cio­nes mu­l­ti­co­n­te­ne­dor, conocidas como stacks, y eje­cu­tar­las en un nodo in­di­vi­dual o en un clúster. La he­rra­mie­n­ta recurre para ello a una consola de línea de comandos con el fin de gestionar el ciclo de vida completo de sus apli­ca­cio­nes.

En el universo Docker los stacks o lotes son grupos de servicios in­te­r­co­ne­c­ta­dos que comparten las de­pe­n­de­n­cias del software y que se escalan y orquestan de forma conjunta. Un stack de Docker permite definir las diversas fu­n­cio­na­li­da­des de una apli­ca­ción en un archivo central, este es, docker-compose.yml, iniciarlo, eje­cu­tar­lo co­n­ju­n­ta­me­n­te en un sistema de tiempo de ejecución y ge­s­tio­nar­lo de forma central.

De­pe­n­die­n­do del sistema operativo en el que se ejecute Docker es posible que haya que instalar Compose por separado. Aunque Docker Compose ya se incluye en la gama de funciones de la pla­ta­fo­r­ma de co­n­te­ne­do­res si se utiliza la apli­ca­ción como in­s­ta­la­ción de es­cri­to­rio Docker para Mac o Docker para Windows, habrá que proceder a la in­s­ta­la­ción manual de la he­rra­mie­n­ta si se utiliza Docker con Linux o con Windows Server 2016. Asimismo, la toolbox de Docker también está di­s­po­ni­ble para los sistemas de Mac y Windows.

In­s­ta­la­ción de Docker Compose con Linux

En primer lugar hay que abrir la terminal y ejecutar el comando que aparece a co­n­ti­nua­ción para poder descargar del re­po­si­to­rio de GitHub los archivos binarios de Compose:

sudo curl -L https://github.com/docker/compose/releases/download/1.18  
.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Concede a todos los usuarios el derecho de poder ejecutar archivos binarios:

sudo chmod +x /usr/local/bin/docker-compose

Para comprobar si la he­rra­mie­n­ta se ha instalado co­rre­c­ta­me­n­te se introduce el comando:

docker-compose -version

Si la in­s­ta­la­ción se ha ejecutado con éxito recibirás el número de versión de la he­rra­mie­n­ta en la terminal.

In­s­ta­la­ción de Compose con Windows Server 2016 (solo Docker EE for Windows)

Inicia Po­we­r­She­ll como ad­mi­ni­s­tra­dor y ejecuta el siguiente comando para descargar los archivos binarios de Compose desde el re­po­si­to­rio GitHub:

Invoke-WebRequest 
"https://github.com/docker/compose/releases/download/1.18.0/docker-compose-
Windows-x86_64.exe" -UseBasicParsing -OutFile
$Env:ProgramFiles\docker\docker-compose.exe

Inicia los archivos eje­cu­ta­bles para instalar Docker Compose.

Nota

El artículo sobre el eco­si­s­te­ma de Docker ofrece más in­fo­r­ma­ción sobre las he­rra­mie­n­tas de Docker como Swarm o Compose.

Tutorial: Docker Swarm y Compose en uso

Para poder operar una app mu­l­ti­co­n­te­ne­dor en un clúster con Docker es necesario utilizar un enjambre (tra­du­c­ción de swarm), esto es, un clúster de Docker engine en swarm mode, así como la he­rra­mie­n­ta de Docker Compose.

En este tutorial se describen en primer lugar los pasos a seguir para poder instalar Docker Swarm. Más adelante se procede a aclarar cómo se crean apli­ca­cio­nes mu­l­ti­co­n­te­ne­dor con Docker Compose y se de­s­plie­gan en el clúster.

Consejo

El tutorial de Docker de nuestra Guía Digital presenta los conceptos pri­n­ci­pa­les de la pla­ta­fo­r­ma de co­n­te­ne­do­res y describe paso a paso cómo instalar Docker engine en Linux.

Primera parte: Docker en swarm mode

Con el término enjambre se describe a una cantidad ar­bi­tra­ria de Docker engines en modo swarm. Cada Docker engine funciona en un nodo separado que se integra en un clúster.

 Para crear un clúster de Docker hay que seguir tres pasos:

  1. Preparar los hosts de Docker
  2. Ini­cia­li­zar Swarm
  3. Integrar los hosts de Docker en el enjambre
Nota

Como al­te­r­na­ti­va, puede cambiarse el modo de un motor Docker que se encuentre en un entorno local de de­sa­rro­llo al modo enjambre. Se habla entonces de un enjambre de nodo único.

Paso 1: preparar el Docker host

Para preparar los nodos de Docker se re­co­mie­n­da recurrir a la he­rra­mie­n­ta de apro­vi­sio­na­mie­n­to Docker machine. Esto facilita la im­ple­me­n­ta­ción de Docker host, también conocido como do­c­ke­ri­zed host, un host virtual incluido en el motor de Docker. Con Docker machine puedes preparar las cuentas para tu enjambre en cualquier in­frae­s­tru­c­tu­ra y ge­s­tio­nar­las de forma remota. Son varias las pla­ta­fo­r­mas en la nube, como Amazon Web Services (AWS) o Digital Ocean, que ofrecen plugins de co­n­tro­la­do­res para Docker machine con los que es posible reducir el trabajo ligado al apro­vi­sio­na­mie­n­to de los hosts de Docker a una simple línea de código. Para crear un Docker host (aquí: docker-sandbox) en la in­frae­s­tru­c­tu­ra de Digital Ocean, se puede usar el código que aparece a co­n­ti­nua­ción:

$ docker-machine create --driver digitalocean --digitalocean-access-token xxxxx docker-sandbox

En AWS puedes crear un Docker host con el siguiente comando (aquí: aws-sandbox):

$ docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T93C******* aws-sandbox
Nota

Los ca­ra­c­te­res xxxxx y ****** sirven a modo de marcador para un token de acceso o clave que se genera con una cuenta de usuario en el proveedor co­rre­s­po­n­die­n­te.

Paso 2: ini­cia­li­zar Swarm

Si ya se ha creado el número pe­r­ti­ne­n­te de hosts virtuales para el enjambre, es posible ge­s­tio­nar­los a través de Docker machine y agru­par­los en un clúster con Docker Swarm. Accede primero a los nodos que se pretenden usar como swarm maestro. Docker machine pro­po­r­cio­na el siguiente comando para construir una conexión en­cri­p­ta­da SSH con el Docker Host.

docker-machine ssh MACHINE-NAME
Nota

Sustituye el marcador MACHINE-NAME por el nombre del host al que se quiere acceder.

Una vez se establece la conexión con los nodos deseados se puede recurrir al siguiente comando para ini­cia­li­zar el enjambre.

docker swarm init [OPTIONS]

El comando docker swarm init, que puede aco­m­pa­ñar­se con opciones (véase la do­cu­me­n­ta­ción de Docker ), define como manager de swarm a los nodos se­le­c­cio­na­dos y crea dos tokens alea­to­rios: un token manager y un token de trabajo.

Swarm initialized: current node (1ia0jlt0ylmnfofyfj2n71w0z) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Además el comando docker swarm init genera una entrada de terminal que contiene toda la in­fo­r­ma­ción necesaria para añadir más cuentas a tu enjambre.

Nota

No­r­ma­l­me­n­te se usa docker swarm init con el indicador --advertise-addr. Este establece qué dirección IP se debe usar para el acceso API y la red su­pe­r­pue­s­ta. En caso de que la dirección IP no se haya definido de forma explícita, Docker comprueba au­to­má­ti­ca­me­n­te bajo qué dirección IP está di­s­po­ni­ble el sistema elegido y la se­le­c­cio­na. Si un nodo tiene más de una dirección IP, hay que emplear el indicador co­rre­s­po­n­die­n­te. A menos que se indique lo contrario, Docker usa el puerto 2377.

Paso 3: integrar los Docker hosts en el enjambre

Tras haber ini­cia­li­za­do el enjambre con el nodo se­le­c­cio­na­do como swarm manager, se procede a añadir todos los nodos que se requieran como manager o worker. Para ello, se escribe el comando docker swarm join combinado con el token co­rre­s­po­n­die­n­te.

3.1 Añadir nodos worker: para añadir a tu enjambre un nodo worker hay que acceder a través de docker machine al nodo co­rre­s­po­n­die­n­te y ejecutar el siguiente comando:

docker swarm join [OPTIONS] HOST:PORT

El indicador –token, que contiene el token de acceso al clúster, es un elemento obli­ga­to­rio del comando docker swarm join.

docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377

En el ejemplo aquí pre­se­n­ta­do el comando contiene el token worker generado an­te­rio­r­me­n­te así como la dirección IP bajo la que está di­s­po­ni­ble el manager swarm. Si no se dispone en ese momento del token co­rre­s­po­n­die­n­te, se puede conseguir mediante docker swarm join-token worker.

3.2 Añadir nodos master: si se quiere añadir al enjambre un nodo manager adicional, hay que es­ta­ble­cer primero el token manager. A co­n­ti­nua­ción se ejecuta el comando docker swarm join-token manager en la cuenta de ad­mi­ni­s­tra­dor en la que has ini­cia­li­za­do el enjambre y se siguen las in­s­tru­c­cio­nes.  

Docker genera un token manager que puede eje­cu­tar­se junto al comando docker swarm join y la dirección IP definida en un Docker host para poder in­te­grar­lo como manager en el enjambre.

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-ed2ct6pg5rc6vp8bj46t08d0i \
10.0.2.15:2377

3.3 Vista de todos los nodos del enjambre: eje­cu­ta­n­do el comando de ad­mi­ni­s­tra­ción docker node ls en uno de los nodos manager puedes tener una vista de todos los nodos in­te­gra­dos en el enjambre.

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER
jhy7ur9hvzvwd4o1pl8veqms3    worker2   Ready   Active
jukrzzii3azdnub9jia04onc5    worker1   Ready   Active
1ia0jlt0ylmnfofyfj2n71w0z *  osboxes   Ready   Active        Leader

Los nodos manager se marcan en la vista general como Leader.

Nota

Para eliminar un nodo de tu enjambre, se accede al host co­rre­s­po­n­die­n­te y se ejecuta el comando docker swarm leave. Si se trata de un nodo de un manager swarm hay que forzar la ejecución del comando con el indicador --force.

Segunda parte: ejecutar una app mu­l­ti­co­n­te­ne­dor en un clúster

En la primera parte de esta guía se ha explicado cómo preparar Docker hosts con Docker machine y co­m­pe­n­diar­los en swarm mode como clúster. Ahora pre­se­n­ta­mos cómo se pueden definir di­fe­re­n­tes servicios como apli­ca­cio­nes mu­l­ti­co­n­te­ne­dor compactas y eje­cu­tar­las en un clúster con ayuda de Docker Compose.

La pre­pa­ra­ción de apli­ca­cio­nes mu­l­ti­co­n­te­ne­dor en un clúster se consigue en cinco pasos:

  1. Crear un registro Docker local
  2. Definir una app mu­l­ti­co­n­te­ne­dor como stack
  3. Probar la app mu­l­ti­co­n­te­ne­dor con Docker Compose
  4. Cargar la imagen en el registro
  5. Ejecutar un stack en el clúster

Paso 1: iniciar el registro local de Docker como servicio

Dado que un enjambre de Docker lo componen un número de­te­r­mi­na­do de Docker engines, solo es posible operar las apli­ca­cio­nes en un clúster si todas las Docker engines im­pli­ca­das tienen acceso a la imagen de la apli­ca­ción. Para ello se requiere un servicio central que permita gestionar las imágenes y di­s­po­ne­r­las en el clúster, servicio que se conoce como registro.

Nota

Una imagen es una re­pre­se­n­ta­ción compacta y eje­cu­ta­ble de una apli­ca­ción y contiene, además del código de la apli­ca­ción, el conjunto de de­pe­n­de­n­cias (entorno de tiempo de ejecución, bi­blio­te­cas, variables de entorno y archivos de co­n­fi­gu­ra­ción) que Docker requiere para ejecutar la apli­ca­ción en un co­n­te­ne­dor, es decir, cada co­n­te­ne­dor se puede entender como la instancia en tiempo de ejecución de una imagen.

1.1 Iniciar registro como servicio en el clúster: para iniciar un registro servidor local en el clúster como servicio se requiere el comando docker service create con el siguiente esquema:

docker service create --name registry --publish 5000:5000 registry:2

El comando ordena a Docker arrancar un servicio de­no­mi­na­do registry que escucha en el puerto 5000. El primer valor tras el indicador --publish indica el puerto host, el segundo hace re­fe­re­n­cia al puerto del co­n­te­ne­dor. El servicio se basa en la imagen registry:2, que incluye la im­ple­me­n­ta­ción del registro HTTP API V2 de Docker y se puede descargar gra­tui­ta­me­n­te desde Docker Hub.

1.2. Probar el estado del servicio de registro: para ello se usa el comando docker service ls, que muestra una lista de todos los servicios que estén eje­cu­tá­n­do­se en el clúster de Docker.

$ sudo docker service ls
ID            NAME      MODE        REPLICAS  IMAGE          PORTS
K2hq2ivnwuq4  registry  replicated  1/1       registry:2     *:5000->5000/tcp

1.3. Probar la conexión al registro con cURL: comprueba que puedes acceder a tu registro a través de cURL con el comando:

$ curl http://localhost:5000/v2/

Si el registro funciona como se espera, cURL debería mostrar la siguiente salida en la terminal:

{}
Nota

cURL es un programa de línea de comandos con el que acceder a di­re­c­cio­nes web y poder descargar o subir archivos. En el proyecto web del software de código abierto curl.haxx.se en­cue­n­tras más in­fo­r­ma­ción.

Paso 2: crear una app mu­l­ti­co­n­te­ne­dor y definirla como stack

En el siguiente paso se crean todos los archivos que se requieren para la im­ple­me­n­ta­ción de un stack en un clúster de Docker y se archivan en un di­re­c­to­rio conjunto del proyecto.

2.1 Crear una carpeta de proyecto: a co­n­ti­nua­ción hay que crear una carpeta de proyecto y asignarle un nombre, que en este tutorial es stackdemo.

$ mkdir stackdemo

Navega por el di­re­c­to­rio del proyecto con:

$ cd stackdemo

El di­re­c­to­rio del proyecto sirve para guardar todos los archivos ne­ce­sa­rios para gestionar una app mu­l­ti­co­n­te­ne­dor. Esta incluye un archivo con el código fuente de la app, un archivo de texto en el que se define el software requerido para que funcione la apli­ca­cion, así como un Do­c­ke­r­fi­le y un Co­m­po­se­fi­le.

2.2 Crear una app: hay que crear una apli­ca­ción Python con el contenido que aparece a co­n­ti­nua­ción y guardarla en el di­re­c­to­rio del proyecto con el nombre app.py.

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

El ejemplo app.py muestra una apli­ca­ción web sencilla cuya página de inicio muestra el saludo "Hello World!" e incluye el número de veces que se tuvo acceso a la app. Se basa en el framework de código abierto Flask y la base de datos en memoria de código abierto Redis. 2.3 Definir los re­qui­si­tos: hay que crear un archivo de texto re­qui­re­me­nts.txt con el siguiente contenido y de­po­si­tar­lo en el di­re­c­to­rio del proyecto.

flask
redis

En re­qui­re­me­nts.txt se define es­pe­cí­fi­ca­me­n­te el software en el que se basa la apli­ca­ción.

2.4 Crear un Do­c­ke­r­fi­le: también se requiere la creación de otro archivo de texto llamado Do­c­ke­r­fi­le, al que hay que añadir el contenido que aparece a co­n­ti­nua­ción. Una vez creado se guarda en el di­re­c­to­rio del proyecto.

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

El Do­c­ke­r­fi­le contiene todas las in­s­tru­c­cio­nes ne­ce­sa­rias para crear la imagen de una apli­ca­ción. Por ejemplo, este archivo Docker remite a re­qui­re­me­nts.txt e indica el software que tiene que in­s­ta­lar­se para el fu­n­cio­na­mie­n­to de la apli­ca­ción. En el ejemplo, el Do­c­ke­r­fi­le permite crear una imagen de la apli­ca­ción web app.py in­clu­ye­n­do todos los re­qui­si­tos (Flask y Redis).

2. 5 Crear un archivo Compose: hay que crear un archivo de co­n­fi­gu­ra­ción con el siguiente contenido y guardarlo como docker-compose.yml.

version: '3'
services:
    web:
        image: 127.0.0.1:5000/stackdemo
        build: .
        ports:
            - "8000:8000"
    redis:
        image: redis:alpine

El fichero docker-compose.yml permite in­te­r­co­ne­c­tar diversos servicios, eje­cu­tar­los como unidad y ge­s­tio­nar­los de forma ce­n­tra­li­za­da.

Nota

El archivo Compose se escribe en YAML, un lenguaje de marcado sencillo, usado pri­n­ci­pa­l­me­n­te en los archivos de co­n­fi­gu­ra­ción, que sirve para ilustrar datos es­tru­c­tu­ra­dos. En Docker, docker-compose.yml se utiliza para co­n­fi­gu­rar ce­n­tra­l­me­n­te los servicios de una apli­ca­ción mu­l­ti­co­n­te­ne­dor.

En el ejemplo actual se definen dos servicios: un servicio web y un servicio redis.

  • Servicio web: la base de un servicio web es una imagen que se crea en la carpeta stackdemo según el archivo Docker que ha creado el usuario.
  • Servicio Redis: para el servicio Redis no se usa ninguna imagen. En lugar de ello se accede a una imagen de acceso público (redis:alpine)di­s­po­ni­ble en Docker hub.

Paso 3: probar la app mu­l­ti­co­n­te­ne­dor con Compose

Primero hay que probar la app mu­l­ti­co­n­te­ne­dor de forma local eje­cu­tá­n­do­la en los nodos manager.

3.1 Iniciar app: se puede iniciar un stack con el comando docker-compose up junto con el indicador --d. El indicador activa el “detached mode”, en cuyo caso todos los co­n­te­ne­do­res se ejecutan en segundo plano. De esta forma la terminal está preparada para la entrada de comandos adi­cio­na­les.

$ sudo docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use the bundle feature of the Docker experimental build.
More info:
https://docs.docker.com/compose/bundles
Creating network "stackdemo_default" with the default driver
Creating stackdemo_web_1
Creating stackdemo_redis_1

3.2 Probar estatus de Stack: es posible con el comando docker-compose. En la terminal se muestra:

$ sudo docker-compose ps
    Name         Command         State          Ports     
-------------------------------------------------------------------------
stackdemo_redis_   docker-        Up             6379/tcp       
1            entrypoint.sh                            
             redis ...                                
stackdemo_web_1    python app.py    Up             0.0.0.0:8000->80 
                                       00/tcp

El comando docker-compose ps ofrece una vista general de todos los co­n­te­ne­do­res que se iniciaron en el marco de la apli­ca­ción mu­l­ti­co­n­te­ne­dor. En el ejemplo actual la lista agrupa a dos co­n­te­ne­do­res, uno para servicios redis y otro para servicios web.

3.3. Probar un stack con cURL: prueba tu stack eje­cu­ta­n­do el programa de líneas de comandos cURL con la dirección de host local (localhost oder 127.0.0.1)

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

También es posible acceder a la apli­ca­ción web a través del navegador.

3.4 De­s­co­ne­c­tar la app: si se quiere de­s­co­ne­c­tar el stack, hay que ejecutar el comando docker-compose down con el indicador –volumes.

$ sudo docker-compose down --volumes
Stopping stackdemo_redis_1 ... done
Stopping stackdemo_web_1 ... done
Removing stackdemo_redis_1 ... done
Removing stackdemo_web_1 ... done
Removing network stackdemo_default

Paso 4: cargar la imagen en el registro

Antes de que una apli­ca­ción mu­l­ti­co­n­te­ne­dor se pueda ejecutar en el clúster, en el registro del servicio deben fa­ci­li­tar­se todas las imágenes ne­ce­sa­rias para ello. El ejemplo solo incluye la imagen creada por el propio servicio web (la imagen redis está di­s­po­ni­ble a través de un registro público de Docker Hub).

Con el término “push” se hace re­fe­re­n­cia en la jerga de Docker a la subida de una imagen creada lo­ca­l­me­n­te en un registro central. Para ello Docker Compose crea el comando docker-compose push que debe eje­cu­tar­se en el di­re­c­to­rio del proyecto.

Todas las imágenes pre­se­n­ta­das en docker-compose.yml, que han sido creadas de forma local, se cargan en el registro.

$ sudo docker-compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

En el ejemplo, docker-compose push carga la imagen del stack stackdemo con la etiqueta latest en el registro local bajo 127.0.0.1:5000.

Paso 5: ejecutar un stack en un clúster

La apli­ca­ción mu­l­ti­co­n­te­ne­dor se puede ejecutar en el clúster si la imagen del stack está di­s­po­ni­ble en el servicio de registro local.

5.1 Ejecutar un stack en el clúster: también es posible ejecutar un stack en un clúster con una simple línea de comando. La pla­ta­fo­r­ma de co­n­te­ne­do­res dispone para ello del comando siguiente:

docker stack deploy [OPTIONS] STACK
Nota

En el lugar del marcador STACK se inserta el nombre co­rre­s­po­n­die­n­te de la imagen del stack que se quiere ejecutar.

A co­n­ti­nua­ción se ejecuta el comando docker stack deploy en un nodo manager del enjambre.

$ sudo docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build
Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

El indicador --compose-file establece la ruta al archivo Compose.

5.2 Acceder al estado del stack: es posible con el siguiente comando.

docker stack services [OPTIONS] STACK

Docker muestra el ID, modos, réplicas, imágenes y puertos de todos los servicios que se están eje­cu­ta­n­do en el stack.

$ sudo docker stack services stackdemo
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
cxyp7srukffy        stackdemo_web       replicated          1/1                 127.0.0.1:5000/stackdemo:latest   *:8000->8000/tcp
z0i2rtjbrj9s        stackdemo_redis     replicated          1/1                 redis:alpine

5.3 Probar cURL con la apli­ca­ción: para probar la apli­ca­ción mu­l­ti­co­n­te­ne­dor, accede a esta a través de la dirección de host local en el puerto 8000.

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

Como al­te­r­na­ti­va a cURL, también es posible acceder a la apli­ca­ción a través del navegador. Para ello es necesario usar la dirección del host local o la dirección de uno de los nodos. Gracias a la red de ruta interna puedes acceder a cualquier nodo del enjambre en el puerto 8000 y dirigirlo a tu apli­ca­ción.

5.4 De­s­co­ne­c­tar el stack: es necesario utilizar docker stack rm con el nombre del stack.

$ docker stack rm stackdemo
Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

5.5 De­s­co­ne­c­tar el registro servicio: hay que recurrir al comando docker service rm con el nombre de servicio, en este caso, registry.

$ docker service rm registry
En resumen: ¿cuáles son las ventajas de Docker Compose y Swarm?

Swarm y Compose amplían la fu­n­cio­na­li­dad central de la pla­ta­fo­r­ma de co­n­te­ne­do­res con he­rra­mie­n­tas que ofrecen la opción de operar una apli­ca­ción compleja en sistemas di­fe­re­n­cia­dos con un trabajo de gestión reducido. La empresa líder de mercado en el ámbito de la vi­r­tua­li­za­ción de co­n­te­ne­do­res ofrece a los usuarios una solución completa para or­que­s­tar­los. Ambas he­rra­mie­n­tas se basan en una do­cu­me­n­ta­ción de calidad y se ac­tua­li­zan re­gu­la­r­me­n­te. Se puede afirmar, por tanto, que Docker Compose y Docker Swarm pueden co­n­si­de­rar­se una al­te­r­na­ti­va adecuada a las he­rra­mie­n­tas de pro­vee­do­res como Ku­be­r­ne­tes o Panamax.

Ir al menú principal