Logotipo de Bitdoze

Cómo Actualizar un Contenedor con Docker Compose

Cómo actualizar un contenedor con Docker Compose es un tutorial que te muestra cómo usar Docker Compose para actualizar la imagen y la configuración de un contenedor sin perder tus datos.

Dragos

6 min de lectura

Cómo Actualizar un Contenedor con Docker Compose

Docker Compose es una herramienta que te permite definir y ejecutar varios contenedores como un solo servicio. Es ideal para desarrollar y probar aplicaciones que tienen múltiples componentes, como un servidor web, una base de datos y una caché. Te mostraré cómo actualizar un contenedor con Docker Compose en unos pocos pasos sencillos. Aprenderás a modificar el Dockerfile, reconstruir la imagen y reiniciar el contenedor con la nueva configuración.

Tengo una instalación de Plausible hecha con docker-compose que llevaba casi 1 año sin actualizar; se montó siguiendo el tutorial: Instalar Plausible Google Analytics y tiene el siguiente archivo docker compose:

yaml
version: "3.3"
services:
  mail:
    image: bytemark/smtp
    restart: always

  plausible_db:
    image: postgres:12
    restart: always
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres

  plausible_events_db:
    image: yandex/clickhouse-server:21.3.2.5
    restart: always
    volumes:
      - event-data:/var/lib/clickhouse
      - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
      - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
    ulimits:
      nofile:
        soft: 262144
        hard: 262144

  plausible:
    image: plausible/analytics:latest
    restart: always
    command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"
    depends_on:
      - plausible_db
      - plausible_events_db
      - mail
    ports:
      - 8000:8000
    env_file:
      - plausible-conf.env

volumes:
  db-data:
    driver: local
  event-data:
    driver: local
  geoip:
    driver: local

Explicación del Docker Compose de Plausible

Este es un archivo Docker Compose escrito en formato YAML, que describe una aplicación multi-contenedor compuesta por los servicios de Plausible: mail, plausible_db, plausible_events_db y plausible.

El servicio mail usa la imagen bytemark/smtp para proporcionar un servidor SMTP (Simple Mail Transfer Protocol) para el envío de correos electrónicos.

El servicio plausible_db usa la imagen postgres:12 para proporcionar un servidor de base de datos PostgreSQL. Almacena sus datos en un volumen de Docker llamado db-data y establece la variable de entorno POSTGRES_PASSWORD en “postgres” para la autenticación.

El servicio plausible_events_db usa la imagen yandex/clickhouse-server:21.3.2.5 para proporcionar un servidor de base de datos ClickHouse destinado a almacenar los datos de eventos. Guarda sus datos en un volumen de Docker llamado event-data y monta dos archivos de configuración desde el sistema de archivos local. También establece el ulimit nofile para permitir un mayor número de archivos abiertos.

El servicio plausible usa la imagen plausible/analytics:latest para proporcionar una plataforma de analítica web. Depende de los servicios plausible_db, plausible_events_db y mail, y expone el puerto 8000 al host. También utiliza un archivo de entorno plausible-conf.env para establecer ciertas variables de configuración. Por último, ejecuta un comando para inicializar la base de datos, correr las migraciones, crear un usuario administrador e iniciar la aplicación.

El archivo define tres volúmenes de Docker con nombre, db-data, event-data y geoip, que se pueden usar para persistir datos entre reinicios de los contenedores.

Todos los servicios tienen la opción restart establecida en always, lo que garantiza que se reinicien automáticamente si fallan o si el demonio de Docker se reinicia.

Qué se Actualizará

Si dejo el archivo Docker Compose intacto, el único contenedor que recibirá una actualización es el servicio plausible, que ejecuta la última versión de la imagen plausible/analytics. Esto es precisamente lo que llevaba tiempo esperando: una oportunidad de aprovechar todo el potencial de las últimas funciones y mejoras.

Por supuesto, si quieres actualizar también los demás contenedores, ¡adelante! Solo asegúrate de descargar la imagen más reciente con el tag latest o de especificar la versión exacta de las imágenes postgres:12 y yandex/clickhouse-server:21.3.2.5. Por suerte, en mi caso estas imágenes ya están fijadas a una versión concreta, así que el comando de Docker descargará exactamente la imagen que necesito para que todo funcione sin problemas.

Qué Pasará con los Datos

Los datos de Plausible Analytics se guardan en volúmenes, así que si revisas el archivo yml verás:

yaml
volumes:
      - db-data:/var/lib/postgresql/data
volumes:
      - event-data:/var/lib/clickhouse
      - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
      - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro

Los datos reales no están en la imagen de Docker sino en la propia VM, así que simplemente se retomarán.

Ejecutar los Comandos de Actualización

Descargar las Últimas Imágenes de Docker

En función de lo que hayas modificado, necesitas ejecutar:

bash
 docker compose pull

Este comando descargará las imágenes que están en el docker compose según sus tags; en mi caso solo actualizará plausible/analytics:latest

A continuación está la salida real:

Salida de Docker Pull

Recrear las Imágenes de Docker

Ahora que tienes las últimas imágenes de Docker descargadas, solo es cuestión de recrear los contenedores para usar las novedades. Para ello, simplemente ejecuta:

bash
docker compose up -d

Cuando ejecutas docker-compose up -d, Docker Compose creará e iniciará los contenedores de todos los servicios definidos en el archivo docker-compose.yml. También creará las redes y los volúmenes necesarios si están definidos en el archivo.

El flag -d le indica a Docker Compose que ejecute los contenedores en modo detached, lo que significa que se ejecutarán en segundo plano y no estarán vinculados a la terminal. Esto te permite seguir usando la terminal para otras tareas mientras los contenedores están en marcha.

La salida será:

Salida de Docker Up

Verificar que los Contenedores Están en Ejecución

Una vez iniciados los contenedores, puedes usar el comando docker-compose ps para comprobar su estado y verificar que se ejecutan como esperabas. También puedes usar otros comandos de Docker, como docker logs y docker exec, para interactuar con los contenedores y solucionar cualquier problema que pueda surgir.

bash
docker-compose ps

Salida:

text
docker-compose ps
             Name                            Command               State                    Ports
-------------------------------------------------------------------------------------------------------------------
plausible-mail-1                  docker-entrypoint.sh exim  ...   Up      25/tcp
plausible-plausible-1             /entrypoint.sh sh -c sleep ...   Up      0.0.0.0:8000->8000/tcp,:::8000->8000/tcp
plausible-plausible_db-1          docker-entrypoint.sh postgres    Up      5432/tcp
plausible-plausible_events_db-1   /entrypoint.sh                   Up      8123/tcp, 9000/tcp, 9009/tcp

Conclusiones

Eso es todo lo que necesitas hacer para tener tus contenedores de docker-compose actualizados a la versión que necesites. Para ir sobre lo seguro, puedes hacer una copia de seguridad del servidor por si algo sale mal y así poder hacer un rollback.