Cómo instalar Docker en tu VPS: guía paso a paso para Debian/Ubuntu

Aprende a instalar Docker y Docker Compose en tu VPS Debian/Ubuntu paso a paso. Desde el repositorio oficial hasta el primer contenedor y tips de seguridad.

Cómo instalar Docker en tu VPS: guía paso a paso para Debian/Ubuntu
Photo by Rubaitul Azad / Unsplash

Cómo instalar Docker en tu VPS: guía paso a paso para Debian/Ubuntu

¿Qué es Docker y por qué usarlo en un VPS?

Docker es una plataforma de contenedores que te permite empaquetar aplicaciones con todas sus dependencias en unidades ligeras, portátiles y reproducibles. A diferencia de una máquina virtual, Docker comparte el kernel del sistema operativo anfitrión, lo que lo hace mucho más rápido y eficiente en recursos.

En un VPS, Docker te da superpoderes: puedes levantar una base de datos, un servidor web, una app en Node.js o un CMS como WordPress en segundos, cada uno en su propio contenedor aislado, sin que los procesos se estorben entre sí. Olvídate del clásico "en mi máquina funciona" — con Docker, el entorno es idéntico en desarrollo, staging y producción.

Requisitos previos

Antes de empezar, necesitas:

  • Un VPS con **Debian 11+** o **Ubuntu 20.04+**
  • Acceso SSH al servidor con un usuario con permisos `sudo`
  • Conexión a internet en el VPS
  • Conocimientos básicos de línea de comandos

Si todavía no configuraste tu VPS, te recomiendo leer primero la guía anterior: Tu VPS está listo, ¿y ahora qué? Guía de configuración inicial y seguridad.

Paso 1: Actualizar el sistema e instalar dependencias

Conectado por SSH, actualizamos los paquetes del sistema:

sudo apt update && sudo apt upgrade -y

Luego instalamos los paquetes necesarios para que APT pueda descargar paquetes por HTTPS:

sudo apt install -y ca-certificates curl

Paso 2: Agregar la llave GPG oficial de Docker

Docker firma sus paquetes con una llave GPG. Así nos aseguramos de que lo que instalamos viene de ellos y no de un origen malicioso:

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

> Nota para Debian: si tu sistema es Debian, el URL cambia ligeramente: usa https://download.docker.com/linux/debian/gpg.

Paso 3: Agregar el repositorio oficial de Docker

Con la llave en su lugar, agregamos el repositorio de Docker a la lista de fuentes de APT:

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Si estás en Debian, reemplaza linux/ubuntu por linux/debian.

Actualizamos el índice de paquetes:

sudo apt update

Paso 4: Instalar Docker Engine, containerd y Docker Compose

Ahora sí, instalamos todo lo necesario de un solo tirón:

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

Esto instala:

  • **docker-ce**: el motor de Docker
  • **docker-ce-cli**: la interfaz de línea de comandos
  • **containerd.io**: el runtime de contenedores que Docker usa internamente
  • **docker-buildx-plugin**: para construir imágenes multi-arquitectura
  • **docker-compose-plugin**: Docker Compose como plugin de Docker (ya no hace falta instalarlo aparte)

Paso 5: Verificar la instalación

Confirma que Docker se instaló correctamente:

sudo docker --version

Deberías ver algo como:

Docker version 27.5.1, build 9f9e3c7

Ahora corre tu primer contenedor:

sudo docker run hello-world

Si ves un mensaje de bienvenida de Docker, ¡todo está funcionando!

Paso 6: Ejecutar Docker sin sudo

Por defecto, Docker requiere sudo para cada comando. Para evitar escribirlo a cada rato, agrega tu usuario al grupo docker:

sudo usermod -aG docker $USER

Cierra sesión y vuelve a conectarte (o ejecuta newgrp docker) para que los cambios surtan efecto. Después prueba:

docker run hello-world

Sin sudo. Si funciona, ya estás listo.

> Advertencia: agregar un usuario al grupo docker es equivalente a darle acceso root sin contraseña. Solo hazlo en entornos donde confíes plenamente en los usuarios del sistema.

Docker Compose: el compañero inseparable

Docker Compose te permite definir y ejecutar aplicaciones multi-contenedor con un solo archivo YAML. Con el plugin que instalamos en el paso 4, ya lo tienes disponible como docker compose.

Crea un archivo compose.yml en un directorio nuevo:

mkdir ~/mi-app && cd ~/mi-app
nano compose.yml

Y pega este ejemplo que levanta un sitio web estático con Nginx:

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    restart: unless-stopped

Crea la carpeta html con un archivo de prueba:

mkdir html
echo "<h1>Hola, Docker desde mi VPS 🇨🇴</h1>" > html/index.html

Levanta la aplicación:

docker compose up -d

Ahora visita la IP de tu VPS en el navegador. ¡Deberías ver tu mensaje!

Tips de seguridad

Docker es poderoso, pero mal configurado puede abrir brechas de seguridad:

  • **No expongas el socket de Docker.** El archivo `/var/run/docker.sock` es el punto de control de Docker. Nunca lo montes dentro de un contenedor a menos que sea estrictamente necesario.
  • **Usa resource limits.** Siempre limita CPU y memoria en tus contenedores para evitar que uno solo se coma todos los recursos del VPS:
docker run -d --memory="256m" --cpus="0.5" nginx:alpine
  • **No corras contenedores como root.** Si el contenedor lo permite, ejecútalo con un usuario no privilegiado usando la directiva `user` en el Dockerfile o en el `compose.yml`.
  • **Mantén Docker actualizado.** Docker saca parches de seguridad seguido. Un simple `sudo apt update && sudo apt upgrade` periódico te mantiene al día.
  • **Usa imágenes oficiales y con etiqueta fija.** Prefiere `nginx:1.27-alpine` en lugar de `nginx:latest`. Las versiones fijas son reproducibles y evitas sorpresas cuando actualizan la imagen.
  • **Habilita el firewall.** Si usas UFW, Docker puede saltarse las reglas. Configúralo correctamente editando `/etc/default/ufw` o usando `iptables` directo.

Checklist final

Usa esta lista para asegurarte de que todo quedó bien:

  • [ ] `sudo docker --version` muestra una versión reciente
  • [ ] `sudo docker run hello-world` imprime el mensaje de bienvenida
  • [ ] Mi usuario está en el grupo `docker` y puedo ejecutar comandos sin `sudo`
  • [ ] `docker compose version` muestra la versión del plugin
  • [ ] Creé y levanté un contenedor de prueba exitosamente
  • [ ] Configuré resource limits en los contenedores que lo requieren
  • [ ] No monté el socket de Docker en ningún contenedor sin entender los riesgos
  • [ ] Docker está configurado para iniciar con el sistema (`sudo systemctl enable docker`)

Y eso es todo. Con Docker instalado en tu VPS tienes las puertas abiertas para desplegar lo que se te ocurra: APIs, bases de datos, sitios web, bots de Telegram, pipelines de datos y mucho más. En los próximos artículos vamos a explorar cómo orquestar varios servicios con Docker Compose y cómo asegurar tus contenedores en producción. ¡Nos leemos!