Introducción
En este laboratorio, aprenderá cómo utilizar de manera efectiva el comando docker stack services para gestionar e inspeccionar los servicios dentro de una pila (stack) de Docker. Comenzaremos configurando una pila de Docker simple utilizando Docker Compose, lo cual implica instalar Docker Compose y desplegar una aplicación básica definida en un archivo docker-compose.yml.
Una vez que la pila esté en funcionamiento, explorará la funcionalidad central del comando docker stack services para enumerar todos los servicios en una pila. A partir de esto, aprenderá cómo refinar la lista de servicios filtrando por nombre e ID de servicio. Finalmente, descubrirá cómo personalizar el formato de salida de la lista de servicios para mostrar la información que necesita de manera clara y organizada.
Listar todos los servicios en una pila
En este paso, aprenderá cómo listar todos los servicios que se ejecutan dentro de una pila (stack) de Docker. Antes de poder listar los servicios, necesitamos tener una pila en funcionamiento. Dado que Docker Compose no está preinstalado, primero lo instalaremos y luego desplegaremos una pila simple.
Primero, instalemos Docker Compose. Descargaremos el binario y lo haremos ejecutable.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Ahora que Docker Compose está instalado, creemos un archivo docker-compose.yml simple para definir nuestra pila. Crearemos un archivo llamado docker-compose.yml en el directorio ~/project.
nano ~/project/docker-compose.yml
Agregue el siguiente contenido al archivo:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: alpine:latest
command: sleep 3600
Este archivo define una pila con dos servicios: web que utiliza la imagen nginx y app que utiliza la imagen alpine. El servicio web mapea el puerto 80 del host al puerto 80 del contenedor. El servicio app simplemente ejecuta el comando sleep 3600 para mantener el contenedor en ejecución.
Guarde el archivo y salga del editor (Ctrl+X, Y, Enter en nano).
Ahora, despleguemos la pila utilizando docker stack deploy. Nombraremos nuestra pila mystack.
docker stack deploy -c ~/project/docker-compose.yml mystack
Este comando lee el archivo docker-compose.yml y crea los servicios definidos en él como una pila de Docker llamada mystack. Debería ver una salida que indique que se están creando los servicios.
Una vez que la pila está desplegada, puede listar todos los servicios en la pila utilizando el comando docker stack services seguido del nombre de la pila.
docker stack services mystack
Este comando mostrará una tabla con información sobre los servicios en la pila mystack, incluyendo su ID, nombre, modo, réplicas, imagen y puertos.
Debería ver una salida similar a esta:
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
xxxxxxxxxxxx mystack_web replicated 1/1 nginx:latest *:80->80/tcp
La salida enumera los servicios mystack_app y mystack_web, lo que confirma que se están ejecutando como parte de la pila mystack.
Filtrar servicios por nombre
En este paso, aprenderá cómo filtrar la lista de servicios en una pila (stack) de Docker según su nombre. Esto es útil cuando tiene muchos servicios en una pila y solo desea ver información sobre servicios específicos.
El comando docker stack services admite la opción --filter, que le permite especificar criterios para filtrar la salida. Para filtrar por nombre de servicio, puede utilizar el filtro name.
La sintaxis para filtrar por nombre es --filter name=<service_name>. Recuerde que los nombres de los servicios en una pila suelen tener como prefijo el nombre de la pila, seguido de un guión bajo y el nombre del servicio definido en el archivo docker-compose.yml (por ejemplo, mystack_web).
Filtrémos los servicios en nuestra pila mystack para mostrar solo el servicio web.
docker stack services mystack --filter name=mystack_web
Este comando solo mostrará la fila correspondiente al servicio mystack_web.
Debería ver una salida similar a esta:
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_web replicated 1/1 nginx:latest *:80->80/tcp
Note que solo se muestra la información del servicio mystack_web.
Del mismo modo, puede filtrar para ver solo el servicio app:
docker stack services mystack --filter name=mystack_app
Esto mostrará la información del servicio mystack_app:
ID NAME MODE REPLICAS IMAGE
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
Utilizar el filtro name le permite encontrar y ver rápidamente los detalles de servicios específicos dentro de una pila grande.
Filtrar servicios por ID
En este paso, aprenderá cómo filtrar la lista de servicios en una pila (stack) de Docker según su ID único. Si bien filtrar por nombre suele ser más intuitivo, filtrar por ID es útil cuando necesita ser absolutamente preciso o cuando se trata de servicios que pueden tener nombres similares.
Cada servicio en una pila de Docker se le asigna un ID único. Puede ver estos IDs en la primera columna de la salida del comando docker stack services.
Para filtrar por ID de servicio, se utiliza la opción --filter con el filtro id. La sintaxis es --filter id=<service_id>. Solo necesita proporcionar un prefijo suficiente del ID para identificar de manera única el servicio.
Primero, listemos todos los servicios nuevamente para obtener sus IDs.
docker stack services mystack
Mire la salida e identifique los IDs de los servicios mystack_web y mystack_app. Los IDs serán una cadena de caracteres hexadecimales. Por ejemplo, la salida podría verse así (sus IDs serán diferentes):
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
yyyyyyyyyyyy mystack_web replicated 1/1 nginx:latest *:80->80/tcp
Digamos que el ID de mystack_web comienza con yyyyyyyyyyyy. Puede filtrar por este ID (o un prefijo único más corto) de la siguiente manera:
docker stack services mystack --filter id=yyyyyyyyyyyy
Reemplace yyyyyyyyyyyy con el comienzo real del ID de su servicio mystack_web.
Este comando mostrará solo la fila del servicio con el ID coincidente.
Debería ver una salida similar a esta, mostrando solo el servicio mystack_web:
ID NAME MODE REPLICAS IMAGE PORTS
yyyyyyyyyyyy mystack_web replicated 1/1 nginx:latest *:80->80/tcp
Del mismo modo, puede filtrar por el ID del servicio mystack_app. Encuentre su ID en la salida de docker stack services mystack y úselo en el filtro. Por ejemplo, si el ID comienza con xxxxxxxxxxxx:
docker stack services mystack --filter id=xxxxxxxxxxxx
Reemplace xxxxxxxxxxxx con el comienzo real del ID de su servicio mystack_app.
Esto mostrará la información del servicio mystack_app:
ID NAME MODE REPLICAS IMAGE
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
Filtrar por ID proporciona una forma precisa de apuntar a servicios específicos, especialmente en scripts automatizados o cuando se trata de servicios que pueden tener nombres similares.
Formatear la salida de la lista de servicios
En este paso, aprenderá cómo formatear la salida del comando docker stack services. Por defecto, la salida se muestra en un formato de tabla legible por humanos. Sin embargo, puede utilizar la opción --format para personalizar la salida, lo cual es especialmente útil para scripting o cuando necesita información específica en un formato diferente.
La opción --format acepta una cadena de plantilla de Go. Esto le permite especificar exactamente qué campos mostrar y cómo formatearlos. Algunos campos comunes que quizás desee mostrar son .ID, .Name, .Image, .Mode, .Replicas y .Ports.
Intentemos formatear la salida para mostrar solo el ID del servicio, el nombre y la imagen, separados por tabulaciones.
docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"
En este comando:
{{.ID}},{{.Name}}y{{.Image}}son marcadores de posición de plantilla de Go que serán reemplazados por los valores respectivos de cada servicio.\trepresenta un carácter de tabulación, utilizado aquí como separador.
La salida ahora será una lista de servicios, donde cada línea contendrá el ID, el nombre y la imagen, separados por tabulaciones:
xxxxxxxxxxxx mystack_app alpine:latest
yyyyyyyyyyyy mystack_web nginx:latest
(Recuerde que los IDs serán diferentes en su entorno).
También puede formatear la salida como una lista, lo cual puede ser más fácil de analizar en algunos casos. Por ejemplo, para listar el nombre del servicio y el número de réplicas:
docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"
Esto generará la siguiente salida:
- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)
La opción --format proporciona una forma poderosa de adaptar la salida de docker stack services a sus necesidades específicas, lo que facilita la integración con otras herramientas o scripts.
Finalmente, eliminemos la pila (stack) desplegada.
docker stack rm mystack
Este comando eliminará todos los servicios y redes asociados a la pila mystack. Debería ver una salida que indique que la pila se está eliminando.
Resumen
En este laboratorio, aprendiste cómo listar los servicios dentro de una pila (stack) de Docker utilizando el comando docker stack services. Esto implicó primero instalar Docker Compose y desplegar una pila simple definida en un archivo docker-compose.yml. Luego, utilizaste docker stack services <stack_name> para mostrar una tabla con todos los servicios de la pila desplegada.
El laboratorio también cubrió cómo filtrar servicios por nombre e ID, lo que te permitió reducir la lista a servicios específicos. Finalmente, exploraste cómo formatear la salida del comando docker stack services para personalizar la información mostrada.



