670 - Docker, ¿actualización automática o manual? Descubre la mejor opción

670 - Docker, ¿actualización automática o manual? Descubre la mejor opción

Hay que tener los contenedores actualizados para evitar bugs y vulnerabilidades. ¿Como? #watchtower, #ouroboros o #wud ¿Cual es la mejor opción?

1:25
-3:15

Una de las mejores tecnologías que han llegado a mis manos ha sido, sin lugar a dudas, Docker. Sinceramente, no sé cómo he podido vivir sin él. Me ha permitido desplegar servicios de forma rápida y sin tener que preocuparme de las malditas dependencias. Dependencias que, sin lugar a dudas, en mas de una ocasión te habrán dado un buen dolor de cabeza. Esto es precisamente de lo que nos exime Docker, de tener que lidiar con las dependencias. Y por otro lado, nos da una gran ventaja que es la posibilidad de actualizar tus servicios de forma segura sin afectar a otros servicios. Así, las actualizaciones que anteriormente eran un auténtico dolor, ahora, con Docker es algo relativamente sencillo. Tan sencillo que si quieres puedes hacerlo de forma completamente automatizada. Pero, hacerlo de forma automatizada, ¿es la mejor opción?. Precisamente esto es de lo que va este episodio, de dilucidar cual es la mejor opción para actualizar tus contenedores.

Docker, ¿actualización automática o manual? Descubre la mejor opción

Sobre la actualización

Llegados a este punto, estoy seguro que no tienes ninguna duda de que es fundamental actualizar tu software. Y esto de actualizar es con independencia de que tus servicios residan en la máquina o estén en Docker. Algunas razones para actualizar tu software es,

  • Seguridad: evitar vulnerabilidades.
  • Estabilidad: corrección de errores.
  • Nuevas funcionalidades y mejoras de rendimiento.

Métodos para actualizar contenedores Docker

Básicamente todo se reduce a dos opciones, manual o automática. Aunque también puedes hacer una tercera que sería mixta, medio manual y medio automática.

Opción manual

En la opción manual tienes que realizar las siguientes operaciones,

  • Revisar periódicamente en Docker Hub.
  • Parar el contenedor.
  • Eliminar el contenedor.
  • Levantar la nueva versión.

Esto tiene la clara ventaja que tu tienes todo el control, pero como contrapartida es el tiempo que tienes que invertir para realizar todo esto. Si tienes pocos servicios tampoco es tan complejo, pero si tienes un centenar de servicios, la cosa se complica.

Y no solo es cuestión de tiempo, el otro problema, es que tarde o temprano se te olvidará que tienes que actualizar un contenedor o todos los contenedores.

Opción automática

En este caso puedes utilizar diferentes servicios para realizar las mismas operaciones que hacías de forma manual. Es decir, tanto la revisión como los procesos de gestión de contenedores. Tienes básicamente dos servicios como son Watchtower y Ouroboros.

Estos dos servicios se encargarán de monitorizar y actualizar automáticamente los contenedores. La ventaja es que todo se mantiene actualizado sin intervención manual. Pero, como contrapartida, puede generar downtime inesperado, incompatibilidades o fallos en servicios críticos y problemas con versiones latest sin control sobre cambios.

Opción mixta

Pero también tienes una opción mixta, que sería la de What’s up Docker (WUD). Este servicio te permite monitorizar las versiones y avisarte cuando hay una nueva disponible. De esta forma puedes decidir cuándo actualizar para evitar interrupciones. Además soporta notificaciones por email, Slack, MQTT, webhook, etc.

Esto no solo lo puedes hacer con WUD, también lo puedes hacer con Watchtower, con la ventaja adicional que para aquello servicios que quieras se realizará la opción completamente automática, mientras que los otros puedes realizar la monitorización automática y la actualización manual.

Esta operativa consiste en utilizar un sistema automático para determinar que contenedores tienen que auto-actualizarse y cuales no. De esta forma, puedes tener un control total sobre el proceso de actualización.

Aunque todavía mejor, es la opción de que el proceso de automatización sea automático para aquellos contenedores menos críticos, dejando únicamente para realizar la actualización manual a los realmente críticos. Esta es en realidad la opción que utilizo yo con WatchTower, donde los no críticos los actualizo de forma automatizada, mientras que los críticos los realizo a mano.

El archivo docker-compose.yml que utilizo para WatchTower es el siguiente,

services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    init: true
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
      - ./config.json:/config.json
    env_file:
      - .env
    networks:
      - hookbridge

Y las variables de entorno son las siguientes,

WATCHTOWER_NOTIFICATIONS=shoutrrr
WATCHTOWER_NOTIFICATION_URL=generic://hookbridge:6969/matrix_watchtower?template=json&disabletls=yes
TZ=Europe/Madrid
WATCHTOWER_CLEANUP=true
WATCHTOWER_SCHEDULE="0 0 3 * * 2

Y el archivo config.json es el siguiente,

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        }
    }
}

En aquellos servicios que no quiero que se actualicen automáticamente, simplemente les añado la siguiente configuración en el, docker-compose.yml,

labels:
    - com.centurylinklabs.watchtower.monitor-only="true"

Y de esta forma me aseguro que solo se monitoriza, y que en caso de que haya una nueva actualización lo único que hará es notificarme.

Además en el caso particular de Traefik, que el servicio mas crítico para mi, tengo fijada la versión con un tag concreto. Por ejemplo,

services:
    traefik:
        image: traefik:v3.3.0

Sobre WUD

What’s up Docker (WUD) es una herramienta diseñada para monitorear las actualizaciones de imágenes de contenedores Docker y notificar cuando hay una nueva versión disponible. A diferencia de soluciones como Watchtower u Ouroboros, WUD no actualiza automáticamente los contenedores, sino que te avisa, permitiendo un control total sobre el proceso de actualización.

Las actualizaciones automáticas causan inconvenientes debido a tiempos de inactividad no planificados. La estrategia de versionado de las imágenes no es consistente entre diferentes imágenes (no siguen semver), lo que provoca falsas actualizaciones. Usar versiones latest es aún peor, ya que se pierde completamente el control sobre la estrategia de actualización (los servicios se pueden romper debido a actualizaciones mayores). Básicamente, estas son las razones que esgrime el desarrollador de What’s up Docker, para el desarrollo de esta aplicación.

Sobre todo, a mi lo que me gusta de esta herramienta es tener una visión global de que contenedores se pueden actualizar. Por que, está muy bien que te notifiquen, pero las notificaciones se quedan en eso en notificaciones.

Instalación y configuración

Como te comentaba, la instalación es muy sencilla, simplemente tienes que utilizar un docker-compose.yml como el que indico a continuación,

services:
  whatsupdocker:
    image: getwud/wud
    container_name: wud
    init: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - proxy
    environment:
      WUD_AUTH_BASIC_USUARIO_USER: tu-usuario
      WUD_AUTH_BASIC_USUARIO_HASH: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      WUD_TRIGGER_DOCKER_TEST_PRUNE: true
      WUD_TRIGGER_DOCKER_TEST_DRYRUN: true
    labels:
      - traefik.enable=true
      - traefik.http.services.wud.loadbalancer.server.port=3000
      - traefik.http.routers.wud.rule=Host(`wud.tu-servidor.es`)
      - traefik.http.routers.wud.entrypoints=https

networks:
  proxy:
    external: true

En mi caso no he puesto ningún disparador (trigger), relativo a notificación porque simplemente quiero utilizarlo para visualizar, que es precisamente lo que mas me gusta de esta herramienta, la posibilidad de tener una visión general del estado de los contenedores.

Te dejo a continuación una captura para que te hagas una idea del aspecto de esta herramienta,

Conclusión

Para mi la mejor opción es la mixta, es decir, utilizar una herramienta como WatchTower para los servicios no críticos y What’s up Docker para tener una visión global de los contenedores que se pueden actualizar. Y para los servicios críticos, realizar la actualización de forma manual.

Aunque no lo tengo del todo conmigo, porque en mas de una ocasión veo que me he dejado un contenedor por actualizar. Sin lugar a dudas las mejor opción es siempre la automática y atender a las versiones menores para realizar las actualizaciones.

Sin embargo, ¿quien se atreve a dejarlo todo automatizado?


Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *