Cloud

Docker para Sysadmin: Primer Contenedor en Producción

Docker para Sysadmin: Primer Contenedor en Producción

Docker es una plataforma de containerización que aísla aplicaciones y dependencias en entornos portables, permitiendo despliegues rápidos y rollbacks inmediatos en producción. Un container encapsula todo lo necesario para ejecutar un software, eliminando los conflictos en el host.

| Concepto | Descripción | Comando base |

|—|—|—|

| Imagen | Blueprint de solo lectura del software | docker pull nginx |

| Container | Instancia en ejecución de la imagen | docker run -d nginx |

| Volumen | Persistencia de datos externa al container | docker volume create mis-datos |

| Compose | Orquestación multi-container | docker compose up -d |

Aplicación desplegada directamente en el servidor host. Actualización de dependencia entra en conflicto. Producción caída 2 horas. El container habría aislado el problema en 10 segundos. Viví este escenario múltiples veces antes de adoptar Docker sistemáticamente. Cuando consolidé un entorno con 300+ VM para una organización sanitaria pública, el problema recurrente era el conflicto de librerías entre servicios legacy y aplicaciones modernas en la misma máquina. La separación física vía VM era costosa en recursos. La separación lógica vía container redujo el footprint un 60% y eliminó los conflictos de runtime. El 73% de las organizaciones usa containers en producción hoy (CNCF Annual Survey 2025). Los containers reducen los tiempos de despliegue un 70% frente a métodos tradicionales (Sysdig 2025). Esta es una guía operativa para sysadmin, no un manifiesto teórico.

Requisitos Previos para Docker y Entorno de Prueba

La instalación sobre Ubuntu 24.04 o Debian 12 requiere un único comando oficial. Evita los repositorios por defecto de la distro, suelen contener versiones antiguas.

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Cierra sesión y vuelve a entrar para aplicar los permisos. Verifica la instalación ejecutando docker --version y docker run hello-world. Si el container hello-world arranca, el engine es operativo.

Conceptos Core: Imágenes, Containers y Aislamiento

Docker resuelve el problema del aislamiento de software sin el overhead de una VM completa. Un container comparte el kernel del host pero mantiene procesos, filesystem y red aislados. Cuando actualizas una librería dentro de un container, el host y los demás containers no se enteran.

Usa Docker cuando:

  1. Necesitas ejecutar servicios con dependencias en conflicto (Python 3.11 vs Python 2.7).
  2. Requieres despliegues rápidos y rollback en segundos.
  3. Quieres estandarizar el entorno de desarrollo y producción.

No uses Docker para:

  1. Aplicaciones monolíticas fuertemente ligadas al kernel host (ciertos drivers de hardware específicos).
  2. Bases de datos de alto rendimiento que necesitan acceso directo al I/O físico (si no tienes storage optimizado para containers).

El error más común para un sysadmin que empieza es confundir imágenes y containers. La imagen es la plantilla. El container es el proceso en vivo. Piensa en la imagen como la clase en programación y en el container como el objeto instanciado. Una imagen se compone de capas de solo lectura. Cuando arrancas un container, Docker añade una capa de escritura encima. Si detienes y eliminas el container, esa capa desaparece. Los datos modificados se pierden.

# Descarga la imagen Nginx latest
docker pull nginx
# Arranca un container desde la imagen
docker run -d -p 80:80 nginx

El flag -d lanza el container en segundo plano. El flag -p 80:80 mapea el puerto 80 del host al puerto 80 del container. Sin este mapeo, Nginx responde solo dentro de la red aislada del container.

Dockerfile y Docker Compose en Producción

Descargar imágenes preconfeccionadas funciona para pruebas. En producción construyes imágenes custom con un Dockerfile. Un Dockerfile es una secuencia de instrucciones para ensamblar una imagen capa por capa.

FROM ubuntu:24.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Cada instrucción crea una capa. FROM define la base. RUN ejecuta comandos. COPY inserta archivos del host. EXPOSE documenta el puerto. CMD define el proceso principal. Construye la imagen con docker build -t mi-nginx:1.0 .. El flag -t asigna un tag nombre:versión. El . indica que el Dockerfile está en el directorio actual. Docker ejecuta las instrucciones en orden y cachea las capas. Si modificas solo index.html, Docker re-ejecuta solo la capa COPY y las posteriores.

Cuando una aplicación requiere múltiples servicios (web server, base de datos, caché), Docker Compose orquesta todo con un archivo YAML. Compose elimina la necesidad de lanzar y conectar containers manualmente con comandos largos.

version: '3.8'
services:
  web:
    image: mi-nginx:1.0
    ports:
      - "80:80"
  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secreto
volumes:
  db-data:

Arranca el stack completo con docker compose up -d. Compose crea una red aislada para el stack. Los containers se resuelven por nombre de servicio. El container web contacta la base de datos usando el hostname db, no una IP hardcodeada.

Persistencia, Networking y Comandos Esenciales

Los containers son efímeros por diseño. Si un container falla o se recrea, los datos en el filesystem interno desaparecen. Para una base de datos o una aplicación stateful, esto es un problema crítico. Docker lo resuelve con volúmenes. Un volumen es un directorio en el host montado dentro del container.

# Crea un volumen nombrado
docker volume create mis-datos
# Monta el volumen en un container
docker run -d -v mis-datos:/var/lib/postgresql/data postgres:16

El flag -v mapea el volumen mis-datos al directorio interno de PostgreSQL. Los datos escritos persisten en el host incluso si destruyes el container. Para configuraciones estáticas, monta un archivo del host: docker run -d -v /etc/localtime:/etc/localtime:ro nginx. El flag :ro establece el montaje como solo lectura.

Docker gestiona la red de forma transparente. Por defecto crea una red bridge para cada stack Compose. Los containers en la misma red se comunican usando los nombres de servicio como hostname. Para exponer un servicio al exterior, mapea los puertos con -p 8080:80. Si necesitas aislamiento total, crea una red custom con docker network create red-aislada.

La jornada de un sysadmin con Docker se reduce a un puñado de comandos repetidos. Apréndetelos de memoria.

# Lista containers activos
docker ps
# Lee los logs de un container
docker logs container_id
# Entra dentro de un container en ejecución
docker exec -it container_id bash
# Detén y elimina un container
docker stop container_id
docker rm container_id

El comando docker exec -it container_id bash es tu SSH dentro del container. Úsalo para debug rápido. Si la imagen no tiene bash instalada (como Alpine), usa sh. El comando docker logs container_id muestra la stdout del proceso principal. Añade -f para seguir los logs en tiempo real, similar a tail -f.

Errores Comunes y Resolución de Problemas

El enfoque ingenuo para actualizar un container es detener el viejo y arrancar el nuevo. En producción esto causa downtime. El método correcto para un sysadmin es el despliegue blue-green usando un reverse proxy.

  1. Arranca el container actualizado en un puerto diferente.
  2. Actualiza la configuración del reverse proxy (Nginx, HAProxy) para apuntar al nuevo puerto.
  3. Detén el container viejo.
# Arranca nueva versión en el puerto 8081
docker run -d -p 8081:80 --name web-v2 mi-nginx:2.0
# Cambia el tráfico del reverse proxy a 8081
# ... modifica config proxy ...
# Detén y elimina el container viejo
docker stop web-v1
docker rm web-v1

Si la nueva versión tiene un bug, haz rollback en 10 segundos. Reactiva web-v1 y mueve el tráfico de vuelta. Limpia las imágenes viejas para liberar espacio en disco con docker system prune -a. Este comando elimina containers detenidos, imágenes sin uso y caché de capas. Cuidado, borra todo lo que no esté en uso por un container activo.

El container se detiene justo después de docker run

Revisa los logs. El proceso principal falla. Ejecuta docker logs container_id. Si el Dockerfile tiene una CMD incorrecta o una dependencia falta, los logs muestran el error exacto.

Puerto ya en uso en el host

Si docker run -d -p 80:80 nginx falla, un proceso en el host ocupa el puerto 80. Cambia el puerto del host (-p 8080:80) o detén el proceso conflictivo.

Permission denied en los volúmenes

El proceso en el container se ejecuta como root o un usuario específico. Si montas un directorio del host, el usuario del container debe tener permisos de escritura. Solución: ajusta los permisos en el host o especifica el usuario en el Dockerfile con USER.

Espacio en disco agotado

Docker acumula capas e imágenes muertas. Monitoriza el espacio con docker system df. Si el uso supera el 90%, ejecuta docker system prune -a.

Lee también: Hardening SSH en Linux: Guía Completa 2026

Conclusiones con Puntos Clave Operativos

Docker resuelve el problema del aislamiento de software con un overhead mínimo. Para un sysadmin, la ventaja principal es la previsibilidad. Si un container funciona en tu laptop, funciona en producción con el mismo comportamiento. Tres puntos clave operativos:

  1. Instala Docker con el script oficial, no desde los repos de la distro.
  2. Usa siempre volúmenes para los datos stateful. Los containers son efímeros por diseño.
  3. Actualiza en producción con despliegue blue-green, nunca stop and pray.

El siguiente paso es Docker Compose. Si gestionas más de 3 containers manualmente, Compose reduce la complejidad a un solo archivo YAML. Para más detalles, consulta la documentación oficial en docs.docker.com.

Comparte este artículo:

Escrito por

Rosario Giordano

Rosario Giordano es administrador de sistemas y consultor de TI especializado en c iberseguridad y cloud, con más de 20 años de experiencia en la gestión de infraestructuras Linux empresariales. Sus áreas de especialización incluyen el hardening de SSH, plataformas Kubernetes , bases de datos PostgreSQL, virtualización con VMware/Proxmox y el cumplimiento de los marcos de seguridad NIS2 e ISO 27001.