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
rootosudo. - 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-composev1 al plugincomposev2 - 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.ioodocker-compose, vienen de los repositorios de Ubuntu (versiones antiguas). - Si
which docker-composedevuelve/usr/local/bin/docker-compose, se instaló a mano (binario o pip). - Si
docker compose versionfalla 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 obsoletenetworks.default: external.name is deprecated
Solución:
- Elimina la directiva
version: '3.x'de la primera línea. - 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
- Reconéctate a la sesión de Screen:
screen -r upgrade20,screen -r upgrade22oscreen -r upgrade24. - 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.ymly variables.envversionados y respaldados.