Saltar al contenido
smartsoft.pe

Actualización de Ubuntu Server y Docker

Este manual describe cómo actualizar un servidor Ubuntu Server hasta la versión 24.04 LTS (Noble Numbat) de forma segura y gradual, y cómo dejar al día Docker Engine y Docker Compose en servidores que corren contenedores. Es genérico: sirve para cualquier servidor, sin datos específicos de clientes ni proyectos.

IMPORTANTE

La actualización debe hacerse de forma SECUENCIAL, una versión LTS a la vez. No es posible saltar directamente de 18.04 o 20.04 a 24.04. Asegúrese de tener backups verificados y snapshots antes de comenzar.


🗺️ Ruta de actualización

Versión actual Siguiente salto Nombre en clave Sesión Screen
Ubuntu 18.04 20.04 focal upgrade20
Ubuntu 20.04 22.04 jammy upgrade22
Ubuntu 22.04 24.04 noble upgrade24
  • Si partes de 18.04: realiza los tres saltos (Pasos 3, 4 y 5).
  • Si partes de 20.04: comienza en el Paso 4.
  • Si partes de 22.04: solo necesitas el Paso 5.

📋 Pre-requisitos

  • Acceso SSH al servidor con permisos de root o sudo.
  • Conexión estable a internet.
  • 2 a 3 horas de ventana de mantenimiento por cada salto de versión.
  • Backups actualizados y, de ser posible, un snapshot del servidor desde el panel de tu proveedor de VPS/Cloud.
  • Al menos 5 a 10 GB libres en disco.

🎯 Qué cubre este manual

  • Paso 1: Respaldo completo antes de empezar
  • Paso 2: Preparación del sistema
  • Pasos 3 al 5: Saltos de versión de Ubuntu hasta 24.04 LTS
  • Paso 6: Verificación del sistema operativo
  • Paso 7: Actualización de Docker Engine y migración de docker-compose v1 al plugin compose v2
  • Pasos 8 y 9: Solución de problemas y mantenimiento post-actualización

Paso 1: Respaldo Completo del Sistema

Antes de cualquier actualización mayor es CRÍTICO realizar backups completos. Ajusta los nombres de contenedores y rutas a tu servidor.

1.1 Crear Directorio de Backup

mkdir -p ~/backup_upgrade

1.2 Backup de la Configuración de Docker

docker inspect $(docker ps -aq) > ~/backup_upgrade/docker_containers_config.json
docker ps -a > ~/backup_upgrade/docker_ps_antes.txt
docker volume ls -q > ~/backup_upgrade/volumes_list.txt
docker images > ~/backup_upgrade/docker_images.txt

1.3 Backup de Bases de Datos

MariaDB / MySQL:

docker exec nombre_contenedor_db mysqldump -u root -p --all-databases > \
  ~/backup_upgrade/mariadb_backup_$(date +%F).sql

PostgreSQL:

docker exec -t nombre_contenedor_pg pg_dumpall -U postgres > \
  ~/backup_upgrade/postgres_backup_$(date +%F).sql

1.4 Backup de los Proyectos

Incluye los archivos docker-compose.yml, los .env y los datos montados desde el host:

tar -czf ~/backup_upgrade/proyecto_backup_$(date +%F).tar.gz ~/mi-proyecto

1.5 Backup de Configuraciones del Sistema

dpkg --get-selections > ~/backup_upgrade/packages.list
apt-mark showauto > ~/backup_upgrade/packages-auto.list
sudo tar -czf ~/backup_upgrade/etc_backup_$(date +%F).tar.gz /etc

1.6 Copiar el Backup Fuera del Servidor

scp -r ~/backup_upgrade usuario@servidor-respaldo:/ruta/de/respaldos/

Recomendación

Un backup que vive en el mismo servidor no protege contra un fallo del servidor. Copia siempre el respaldo a otra máquina externa y, si tu proveedor lo permite, crea un snapshot antes de cada salto de versión.


Paso 2: Preparación del Sistema

Deja el sistema actual completamente al día antes de proceder con el upgrade mayor.

2.1 Actualizar Repositorios y Paquetes

sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y

2.2 Reparar Paquetes Rotos (si los hay)

sudo apt --fix-broken install
sudo dpkg --configure -a

2.3 Instalar Herramientas de Actualización

sudo apt install update-manager-core -y
sudo apt install screen -y

Nota sobre Screen

screen es fundamental para proteger la sesión SSH. Si la conexión se cae durante la actualización, podrás reconectarte y continuar desde donde quedó.

2.4 Verificar Espacio en Disco y Estado Actual

df -h /
lsb_release -a
systemctl list-units --failed
docker ps -a

Anota el estado de los contenedores (cuáles están en Up y cuáles no) para compararlo después de cada salto.


Paso 3: Actualización a Ubuntu 20.04 LTS

Nota: Este paso aplica SOLO si el servidor está en Ubuntu 18.04. Si ya estás en 20.04 o superior, salta al Paso 4.

3.1 Actualizar los paquetes de 18.04

sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y

Si el sistema indica que hay un reinicio pendiente, reinícialo antes de continuar:

[ -f /var/run/reboot-required ] && echo "REINICIO PENDIENTE"
sudo reboot

3.2 Verificar la política de actualización

sudo nano /etc/update-manager/release-upgrades

Asegúrate de que contenga: Prompt=lts

3.3 Iniciar una sesión de Screen

screen -S upgrade20

3.4 Ejecutar la actualización a 20.04

sudo do-release-upgrade

El proceso toma aproximadamente 45-60 minutos. Al terminar, el sistema se reiniciará (nombre en clave: focal).

3.5 Durante el proceso

  • Cuando pregunte sobre SSH: responde y (yes).
  • Para archivos de configuración modificados: selecciona "keep the local version currently installed".
  • Especialmente importante para: /etc/default/grub, archivos de Docker y Nginx.
  • El sistema abrirá un puerto SSH adicional (1022) como respaldo.
  • Si pregunta si debe reiniciar servicios automáticamente, puedes aceptar; implica un breve reinicio de servicios (incluido Docker).

Si se cae la conexión SSH: Reconéctate al servidor normalmente y ejecuta:

screen -r upgrade20

3.6 Verificación post-actualización

Espera 2-3 minutos tras el reinicio automático y reconéctate:

lsb_release -a
docker ps -a

Debes ver Ubuntu 20.04.x LTS y todos los contenedores en estado Up.


Paso 4: Actualización a Ubuntu 22.04 LTS

Nota: Aplica si el servidor está en Ubuntu 20.04 (o tras completar el Paso 3).

4.1 Actualizar los paquetes de 20.04

sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y

Verificar reinicio:

[ -f /var/run/reboot-required ] && echo "REINICIO PENDIENTE"
sudo reboot

4.2 Verificar la política de actualización

sudo nano /etc/update-manager/release-upgrades

Asegúrate de que diga: Prompt=lts

4.3 Iniciar una sesión de Screen

screen -S upgrade22

4.4 Ejecutar la actualización a 22.04

sudo do-release-upgrade

Nombre en clave: jammy.

4.5 Durante el proceso

  • Respuesta para SSH: y.
  • Archivos modificados: conservar versión local instalada.
  • Si la conexión se cae: screen -r upgrade22.

4.6 Verificación post-actualización

lsb_release -a
docker ps -a

Repositorios de terceros desactivados

El upgrade desactiva automáticamente los repositorios de terceros (por ejemplo, el de Docker). Los volverás a activar en el Paso 7. Esto es normal y no afecta a los contenedores que ya están corriendo.


Paso 5: Actualización a Ubuntu 24.04 LTS

Una vez confirmado que 22.04 funciona correctamente, procedemos con la actualización final a 24.04.

5.1 Actualizar los paquetes de 22.04

sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y

Reinicio previo si es requerido:

[ -f /var/run/reboot-required ] && echo "REINICIO PENDIENTE"
sudo reboot

5.2 Verificar la política de actualización

sudo nano /etc/update-manager/release-upgrades

Asegúrate de que indique: Prompt=lts

5.3 Iniciar una sesión de Screen

screen -S upgrade24

5.4 Ejecutar la actualización a 24.04

sudo do-release-upgrade

Nombre en clave: noble.

5.5 Durante el proceso

  • Si se cae la conexión: screen -r upgrade24.
  • Conservar versiones locales de configuración existente.

5.6 Verificación post-actualización

lsb_release -a
docker ps -a

5.7 Verificar el Kernel

uname -r

Debe mostrar un kernel de la serie 6.8 (por ejemplo, 6.8.0-xx-generic).


Paso 6: Verificación del Sistema Operativo

Antes de tocar Docker, confirma que el sistema operativo quedó sano.

6.1 Verificar Versión del Sistema

lsb_release -a

Resultado esperado:

Distributor ID: Ubuntu
Description:    Ubuntu 24.04.x LTS
Release:        24.04
Codename:       noble

6.2 Verificar Servicios y Errores

systemctl list-units --failed
sudo journalctl -p err -b

6.3 Verificar Contenedores

docker ps -a

Compara con el estado que anotaste en el Paso 2.4. Todos los contenedores que estaban en Up deben seguir así.

6.4 Verificar Uso de Recursos

free -h
df -h
top

Paso 7: Actualizar Docker Engine y Docker Compose

Los servidores con Ubuntu 18.04 y 20.04 suelen tener un Docker antiguo (paquete docker.io de Ubuntu) y el binario independiente docker-compose v1 (por ejemplo, la 1.25), que es una versión obsoleta y descontinuada. Este paso lo reemplaza por Docker Engine oficial y el plugin Docker Compose v2 (docker compose, con espacio).

7.1 Orden Recomendado

Actualiza Docker DESPUÉS del sistema operativo

La documentación oficial de Docker Engine para Ubuntu ya no lista 18.04 ni 20.04 como versiones soportadas (solo versiones LTS recientes como 22.04 y 24.04). Por eso lo recomendado es completar primero el upgrade de Ubuntu (Pasos 3 al 5) y luego instalar Docker desde su repositorio oficial. Si el servidor aún no puede actualizarse, usa la alternativa de la sección 7.11.

7.2 Diagnóstico: Qué Hay Instalado

docker --version
docker compose version
docker-compose --version
which docker-compose
dpkg -l | grep -E 'docker|containerd|runc'

Interpretación rápida:

  • Si aparece docker.io o docker-compose, vienen de los repositorios de Ubuntu (versiones antiguas).
  • Si which docker-compose devuelve /usr/local/bin/docker-compose, se instaló a mano (binario o pip).
  • Si docker compose version falla con "compose is not a docker command", falta el plugin v2.

7.3 Respaldo Previo

Los datos de Docker viven en /var/lib/docker y no se borran al cambiar de paquetes, pero conviene respaldar la configuración:

mkdir -p ~/backup_upgrade
cd ~/mi-proyecto
cp docker-compose.yml ~/backup_upgrade/docker-compose.yml.bak
docker ps -a > ~/backup_upgrade/docker_ps_antes_docker.txt

7.4 Quitar Paquetes en Conflicto

Este comando elimina los paquetes no oficiales que chocan con el Docker oficial. No borra imágenes, contenedores, volúmenes ni redes de /var/lib/docker:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 \
  docker-doc docker-buildx podman-docker containerd runc | cut -f1)

7.5 Activar el Repositorio Oficial de Docker

Eliminar repositorios previos si existían:

ls /etc/apt/sources.list.d/ | grep -i docker
sudo rm -f /etc/apt/sources.list.d/docker.list*

Agregar la llave GPG oficial y el repositorio:

sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

7.6 Instalar Docker Engine y Plugin Compose v2

sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

Breve interrupción

Al reemplazar o actualizar el motor de Docker, el servicio se reinicia. Los contenedores con política restart: always o unless-stopped volverán a levantar solos, pero habrá unos segundos de caída. Hazlo en ventana de mantenimiento.

7.7 Verificar la Instalación

sudo systemctl status docker
docker --version
docker compose version
docker ps -a

Si algún contenedor quedó detenido, inícialo con docker start nombre_contenedor o con docker compose up -d desde su carpeta.

7.8 Migrar de docker-compose (v1) a docker compose (v2)

Retirar el binario antiguo según corresponda:

# Si se instaló como binario manual:
sudo rm -f /usr/local/bin/docker-compose

# Si se instaló con pip:
sudo pip3 uninstall docker-compose

A partir de ahora usa docker compose (con espacio):

cd ~/mi-proyecto
docker compose config
docker compose ps
docker compose up -d

Acceso directo de compatibilidad (opcional):

Si tienes scripts automatizados que aún invocan docker-compose (con guion), crea este wrapper temporal:

sudo tee /usr/local/bin/docker-compose >/dev/null <<'EOF'
#!/bin/sh
exec docker compose "$@"
EOF

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

7.9 Diferencias Importantes entre v1 y v2

Aspecto docker-compose v1 docker compose v2
Comando docker-compose (guion) docker compose (espacio)
Nombres de contenedores proyecto_servicio_1 (guion bajo) proyecto-servicio-1 (guion medio)
Línea version: en YAML Obligatoria Obsoleta (se ignora con aviso)
Networks externas networks.default.external.name name + external: true
Instalación Binario / pip / apt Plugin oficial CLI (docker-compose-plugin)

Compatibilidad de nombres

Compose v2 usa guiones medios en los nombres de contenedores. Si tus proxies o scripts dependen de nombres con guion bajo, ejecuta con: docker compose --compatibility up -d o exporta la variable COMPOSE_COMPATIBILITY=true.

7.10 Corregir Advertencias en docker-compose.yml

Compose v2 puede mostrar advertencias como:

  • the attribute 'version' is obsolete
  • networks.default: external.name is deprecated

Solución:

  1. Elimina la directiva version: '3.x' de la primera línea.
  2. Actualiza la sintaxis de redes:
# Sintaxis anterior (v1):
networks:
  default:
    external:
      name: red_externa

# Sintaxis moderna (v2):
networks:
  default:
    name: red_externa
    external: true

Valida el archivo sin levantar servicios:

docker compose config

7.11 Alternativa: Plugin Compose en servidores que no pueden actualizar Ubuntu aún

Si el servidor sigue temporalmente en 18.04 o 20.04 y necesitas Compose v2:

sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m) \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version

7.12 Actualizaciones Futuras y Congelamiento de Paquetes

Para actualizar Docker en el futuro:

sudo apt update
sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

Para evitar que actualizaciones desatendidas modifiquen Docker:

# Congelar paquetes:
sudo apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Liberar cuando vayas a actualizar:
sudo apt-mark unhold docker-ce docker-ce-cli containerd.io docker-compose-plugin

Paso 8: Solución de Problemas Comunes

8.1 La Actualización de Ubuntu se Detiene

  1. Reconéctate a la sesión de Screen: screen -r upgrade20, screen -r upgrade22 o screen -r upgrade24.
  2. Si el proceso parece detenido por un trigger de base de datos o disco, espera 10-15 minutos antes de forzar reinicios.

8.2 Paquetes Rotos Después de Actualizar

sudo apt --fix-broken install
sudo dpkg --configure -a

8.3 Servicio No Responde

sudo systemctl status nombre_servicio
sudo systemctl restart nombre_servicio

8.4 Contenedores Docker No Inician

docker logs nombre_contenedor
docker start nombre_contenedor

8.5 Error: client version 1.25 is too old

Ocurre al invocar el binario viejo docker-compose contra un Docker Engine moderno. Usa docker compose (con espacio) e instala el plugin oficial.

8.6 Error: compose is not a docker command

Falta instalar el plugin:

sudo apt install -y docker-compose-plugin

8.7 Error: Package docker-ce has no installation candidate

Revisa /etc/apt/sources.list.d/docker.sources y confirma que la suite (jammy o noble) corresponda a tu versión de Ubuntu. Luego corre sudo apt update.

8.8 Error: permission denied en /var/run/docker.sock

Agrega tu usuario al grupo docker:

sudo usermod -aG docker $USER
newgrp docker

8.9 Aviso de Repositorio Duplicado en apt update

sudo rm -f /etc/apt/sources.list.d/docker.list
sudo apt update

Paso 9: Mantenimiento Post-Actualización

9.1 Limpiar Paquetes Obsoletos

sudo apt autoremove -y
sudo apt autoclean

9.2 Actualizar Todo el Sistema

sudo apt update
sudo apt upgrade -y

9.3 Revisar Logs del Arranque

sudo journalctl -p err -b

9.4 Limpieza de Recursos Docker (Opcional)

docker system df
docker image prune

✅ Checklist Final de Verificación

Componente Comando de verificación Resultado esperado
Versión Ubuntu lsb_release -a Ubuntu 24.04.x LTS (noble)
Kernel Linux uname -r Serie 6.8 o superior
Docker Engine docker --version Versión reciente (docker-ce)
Docker Compose docker compose version Docker Compose version v2.x
Compose v1 obsoleto which docker-compose Sin resultado (o wrapper al v2)
Contenedores docker ps -a Todos en estado Up
Servicios del SO systemctl list-units --failed 0 loaded units listed

💡 Consejos y Mejores Prácticas

  • Un salto por ventana: Haz un salto de versión por ventana de mantenimiento y valida la operatividad antes del siguiente.
  • Backups externos regulares: Mantén respaldos semanales fuera del VPS y prueba su restauración periódicamente.
  • Seguridad: Usa autenticación por llaves SSH y herramientas como fail2ban.
  • Control de versiones: Mantén tus archivos docker-compose.yml y variables .env versionados y respaldados.