Cómo usar el comando docker compose restart para gestionar servicios

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a gestionar eficazmente el ciclo de vida de tus servicios Docker utilizando el comando docker compose restart. Comenzaremos configurando una aplicación multi-servicio simple usando Docker Compose, que constará de un servicio web y un servicio de base de datos.

Después de la configuración, explorarás diversas formas de utilizar el comando docker compose restart. Esto incluye reiniciar todos los servicios dentro de tu aplicación, dirigir y reiniciar un servicio específico, reiniciar un servicio sin afectar sus dependencias y, finalmente, reiniciar un servicio con un período de tiempo de espera definido. A través de estos ejercicios prácticos, obtendrás experiencia práctica en el control y mantenimiento de tus aplicaciones Dockerizadas.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555089{{"Cómo usar el comando docker compose restart para gestionar servicios"}} docker/ps -.-> lab-555089{{"Cómo usar el comando docker compose restart para gestionar servicios"}} docker/restart -.-> lab-555089{{"Cómo usar el comando docker compose restart para gestionar servicios"}} docker/pull -.-> lab-555089{{"Cómo usar el comando docker compose restart para gestionar servicios"}} end

Preparar una aplicación multi-servicio simple

En este paso, prepararemos una aplicación multi-servicio simple que utilizaremos a lo largo de este laboratorio para practicar el reinicio de servicios Docker. Esta aplicación consta de dos servicios: un servicio web y un servicio de base de datos. Definiremos estos servicios usando un archivo Docker Compose.

Primero, necesitamos instalar Docker Compose. Como no viene preinstalado en el entorno VM de LabEx, lo descargaremos e instalaremos.

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

El primer comando descarga el binario de Docker Compose desde el repositorio oficial de GitHub y lo guarda en /usr/local/bin/docker-compose. Las partes $(uname -s) y $(uname -m) detectan automáticamente tu sistema operativo y arquitectura para descargar el binario correcto. El segundo comando hace que el archivo descargado sea ejecutable.

Ahora, verifiquemos la instalación comprobando la versión de Docker Compose.

docker-compose --version

Deberías ver una salida similar a Docker Compose version v2.20.2.

A continuación, navega al directorio ~/project, que es tu directorio de trabajo para este laboratorio.

cd ~/project

Ahora, crearemos un archivo docker-compose.yml para definir nuestra aplicación multi-servicio. Este archivo especificará los servicios, sus imágenes y cualquier configuración necesaria.

nano docker-compose.yml

Pega el siguiente contenido en el archivo docker-compose.yml:

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

En este archivo docker-compose.yml:

  • version: '3.8' especifica la versión del formato del archivo Docker Compose.
  • services: define los diferentes servicios en nuestra aplicación.
  • El servicio web usa la imagen nginx:latest, mapea el puerto 80 del host al puerto 80 del contenedor y depende del servicio db. Esto significa que el servicio db se iniciará antes que el servicio web.
  • El servicio db usa la imagen postgres:latest y establece la variable de entorno POSTGRES_PASSWORD, que es requerida por la imagen PostgreSQL.

Guarda el archivo y sal del editor nano (Presiona Ctrl + X, luego Y, luego Enter).

Antes de iniciar los servicios, necesitamos descargar las imágenes Docker necesarias.

docker pull nginx:latest
docker pull postgres:latest

Estos comandos descargan las imágenes nginx:latest y postgres:latest desde Docker Hub.

Finalmente, iniciemos los servicios definidos en nuestro archivo docker-compose.yml.

docker-compose up -d

El comando docker-compose up -d construye, crea e inicia los servicios en segundo plano (modo detached).

Puedes verificar el estado de los servicios en ejecución con el siguiente comando:

docker-compose ps

Deberías ver una salida que indique que ambos servicios, web y db, están en ejecución.

Reiniciar todos los servicios

En este paso, aprenderemos cómo reiniciar todos los servicios definidos en nuestro archivo docker-compose.yml. Reiniciar servicios es una operación común cuando realizas cambios en el código de tu aplicación, configuración o en el propio archivo Docker Compose.

Para reiniciar todos los servicios, usamos el comando docker-compose restart. Este comando detendrá todos los contenedores en ejecución definidos en el archivo docker-compose.yml y luego los volverá a iniciar.

Asegúrate de estar en el directorio ~/project donde se encuentra tu archivo docker-compose.yml.

cd ~/project

Ahora, ejecuta el siguiente comando para reiniciar todos los servicios:

docker-compose restart

Verás una salida que indica que los servicios están siendo detenidos y luego iniciados.

Una vez que finalice el comando, puedes verificar que los servicios se hayan reiniciado y estén en ejecución nuevamente usando el comando docker-compose ps.

docker-compose ps

La salida debería mostrar que tanto el servicio web como db están en estado Up, lo que indica que se han reiniciado correctamente.

Reiniciar todos los servicios es útil cuando necesitas aplicar cambios que afectan múltiples partes de tu aplicación o cuando deseas asegurar un reinicio limpio de toda la pila de la aplicación.

Reiniciar un servicio específico

En este paso, aprenderemos cómo reiniciar únicamente un servicio específico dentro de nuestra aplicación multi-servicio. Esto es útil cuando has realizado cambios en un solo servicio y no necesitas reiniciar toda la pila de la aplicación.

Para reiniciar un servicio específico, utilizas el comando docker-compose restart seguido del nombre del servicio que deseas reiniciar. Los nombres de los servicios están definidos en tu archivo docker-compose.yml (en nuestro caso, web y db).

Asegúrate de estar en el directorio ~/project.

cd ~/project

Reiniciamos el servicio web:

docker-compose restart web

Verás una salida que indica que el servicio web está siendo detenido y luego iniciado. El servicio db permanecerá en ejecución.

Una vez finalizado el comando, verifica el estado de los servicios usando docker-compose ps.

docker-compose ps

La salida debería mostrar que ambos servicios web y db siguen en estado Up. Sin embargo, el servicio web habrá sido detenido e iniciado nuevamente.

Ahora, reiniciemos el servicio db:

docker-compose restart db

Verás una salida que indica que el servicio db está siendo detenido y luego iniciado. Ten en cuenta que, como el servicio web depende del servicio db, Docker Compose podría detener y reiniciar brevemente el servicio web para garantizar que se cumpla la dependencia durante el reinicio de db.

Verifica nuevamente el estado de los servicios:

docker-compose ps

Ambos servicios deberían estar Up. Reiniciar servicios individualmente permite un control más granular sobre el ciclo de vida de tu aplicación.

Reiniciar un servicio sin sus dependencias

En el paso anterior, vimos que reiniciar el servicio db también causaba que el servicio web se reiniciara brevemente debido a la relación depends_on definida en docker-compose.yml. En algunos casos, es posible que desees reiniciar un servicio sin afectar sus dependencias.

Para reiniciar un servicio sin reiniciar sus dependencias, puedes usar el comando docker-compose restart con la bandera --no-deps.

Asegúrate de estar en el directorio ~/project.

cd ~/project

Intentemos reiniciar el servicio db nuevamente, esta vez usando la bandera --no-deps.

docker-compose restart --no-deps db

Observa la salida. Deberías ver que solo el servicio db se detiene y reinicia. El servicio web, que depende de db, no se ve afectado.

Verifica el estado de los servicios usando docker-compose ps.

docker-compose ps

Ambos servicios deberían seguir en estado Up. Esto demuestra cómo reiniciar un servicio de forma aislada, lo que puede ser útil para depuración o aplicar cambios a un solo servicio sin interrumpir otros que dependen de él.

Reiniciar un servicio con un tiempo de espera específico

En este paso final, aprenderemos cómo especificar un tiempo de espera para la operación de reinicio. Cuando reinicias un servicio, Docker Compose envía una señal de parada al contenedor y espera que se cierre correctamente. Si el contenedor no se detiene dentro de un período determinado, Docker fuerza el cierre. Puedes controlar este tiempo de espera usando la bandera --timeout.

El tiempo de espera predeterminado para detener contenedores es de 10 segundos. Probemos reiniciar el servicio web con un tiempo de espera más corto de 3 segundos.

Asegúrate de estar en el directorio ~/project.

cd ~/project

Ahora, ejecuta el siguiente comando para reiniciar el servicio web con un tiempo de espera de 3 segundos:

docker-compose restart --timeout 3 web

Verás una salida que indica que el servicio web está siendo detenido y luego iniciado. Docker Compose esperará un máximo de 3 segundos para que el contenedor se detenga correctamente antes de forzar el cierre.

Una vez finalizado el comando, verifica el estado del servicio usando docker-compose ps.

docker-compose ps

Ambos servicios deberían seguir en estado Up.

Usar la bandera --timeout te permite controlar cuánto tiempo espera Docker Compose para que un servicio se detenga durante un reinicio. Esto puede ser útil para servicios que requieren más o menos tiempo para cerrarse adecuadamente.

Finalmente, limpiemos los servicios en ejecución deteniéndolos y eliminándolos.

docker-compose down

El comando docker-compose down detiene y elimina los contenedores, redes y volúmenes creados por docker-compose up.

Resumen

En este laboratorio, aprendimos cómo preparar una aplicación multi-servicio simple utilizando Docker Compose. Esto incluyó la instalación de Docker Compose, verificar la instalación y crear un archivo docker-compose.yml para definir dos servicios: un servicio web (nginx) y un servicio de base de datos (postgres), donde el servicio web depende del servicio de base de datos.

Luego exploramos varias formas de gestionar estos servicios usando el comando docker compose restart. Aprendimos cómo:

  • Reiniciar todos los servicios definidos en el archivo docker-compose.yml
  • Reiniciar un servicio específico
  • Reiniciar un servicio sin afectar sus dependencias
  • Reiniciar un servicio con un tiempo de espera específico

Estos pasos demostraron la flexibilidad y control que ofrece Docker Compose para administrar el ciclo de vida de aplicaciones multi-contenedor.