Introducción
Docker ha transformado la forma de desplegar aplicaciones en Linux al empaquetar código y dependencias en contenedores ligeros y portátiles. Esta tecnología permite ejecutar servicios de manera consistente en cualquier entorno, desde un portátil de desarrollo hasta clústeres de producción. En este artículo aprenderás a instalar Docker en las principales distribuciones de Linux, comprender sus componentes esenciales y aplicar buenas prácticas que mejoren la eficiencia, la seguridad y la escalabilidad de tus proyectos.
¿Qué es Docker?
Docker es una plataforma de código abierto que utiliza contenedores para empaquetar una aplicación y todas sus dependencias en una imagen estándar. Cada contenedor se ejecuta aislado pero comparte el kernel de Linux, lo que lo hace mucho más ligero que una máquina virtual. Las imágenes se construyen en capas, pueden reutilizarse y almacenarse en registros como Docker Hub. Además, Docker ofrece una CLI potente y una API REST para automatizar la construcción, distribución y ejecución de contenedores en cualquier flujo de trabajo.
Instalación de Docker en Linux
Aunque los pasos varían según la distribución, el proceso general consiste en agregar el repositorio oficial de Docker, instalar el motor y habilitar el servicio para que se inicie al arranque. A continuación se muestra cómo hacerlo en las distribuciones más usadas.
- Ubuntu y Debian: actualizar el índice, instalar paquetes prerequisitos (apt-transport-https ca-certificates curl gnupg lsb-release), añadir la clave GPG de Docker, agregar el repositorio estable y instalar docker-ce docker-ce-cli containerd.io.
- CentOS y RHEL: instalar yum-utils, configurar el repositorio de Docker con yum-config-manager y luego instalar docker-ce docker-ce-cli containerd.io.
- Fedora: usar dnf para instalar dnf-plugins-core, agregar el repositorio de Docker y instalar el mismo conjunto de paquetes.
- Arch Linux: instalar el paquete docker desde los repositorios oficiales y habilitar el servicio docker.service.
Después de la instalación, verifica que Docker funciona ejecutando docker run hello-world, lo que descargará una imagen de prueba y mostrará un mensaje de éxito.
Conceptos básicos: imágenes, contenedores y Dockerfile
En Docker, la imagen es una plantilla de solo lectura que contiene el sistema de archivos necesario para ejecutar una aplicación. Un contenedor es una instancia en tiempo de ejecución de esa imagen, aislado y ligero. El Dockerfile es un script de texto que define, paso a paso, cómo se construye una imagen, desde la selección de una base hasta la copia de código y la instalación de dependencias. Entender cómo interactúan estos elementos permite crear pipelines de construcción reproducibles y desplegar aplicaciones de forma consistente en cualquier entorno Linux.
- Imagen: capa de solo lectura, reutilizable y versionable.
- Contenedor: proceso aislado que ejecuta la imagen.
- Dockerfile: instrucciones para construir la imagen.
Buenas prácticas al usar Docker
Para obtener el máximo beneficio de Docker en Linux, sigue ciertas directrices que mejoran la mantenibilidad, la seguridad y el rendimiento. Mantén las imágenes lo más pequeñas posible, usa etiquetas específicas en lugar de latest, aprovecha el caché de capas ordenando las instrucciones del Dockerfile de lo menos a lo más cambiante, ejecuta los contenedores como usuario no privilegiado y establece límites de CPU y memoria para evitar que un contenedor afecte al resto del sistema.
- Minimizar el tamaño de la imagen: emplea bases ligeras como Alpine y elimina archivos innecesarios después de la instalación.
- Etiquetar versiones: evita latest y usa versiones semánticas (ej. 1.2.3) para garantizar reproducibilidad.
- Aprovechar el caché de capas: ordena las instrucciones del Dockerfile de lo menos a lo más cambiante.
- Ejecutar como usuario no privilegiado: crea un usuario dedicado dentro del contenedor y cambia a él con la instrucción USER.
- Establecer límites de recursos: usa –memory y –cpu-quota al lanzar contenedores o define límites en docker-compose.yml.
Seguridad en contenedores Docker
Aunque los contenedores ofrecen aislamiento, no están exentos de riesgos. Es esencial mantener las imágenes actualizadas, escanearlas en busca de vulnerabilidades y aplicar el principio de menor privilegio. Además, se recomienda usar namespaces y cgroups para limitar el acceso al kernel y al hardware, montar el sistema de archivos como solo lectura cuando no se necesite escritura y registrar las actividades para detectar comportamientos anómalos.
- Mantener imágenes actualizadas: usa versiones base con parches de seguridad recientes.
- Escaneo de vulnerabilidades: emplea herramientas como Trivy o Clair para identificar CVE en las imágenes.
- Ejecutar con privilegios reducidos: evita el modo privileged y usa capacidades específicas solo cuando sea necesario.
- Sistema de archivos de solo lectura: monta el sistema de archivos del contenedor como read-only cuando la aplicación no requiera escribir.
- Registro y auditoría: configura los logs de Docker y envíalos a un sistema centralizado como ELK o Splunk.
Orquestación sencilla con Docker Compose
Docker Compose permite definir y ejecutar aplicaciones multi-contenedor mediante un archivo YAML llamado docker-compose.yml. Con Compose puedes especificar servicios, redes y volúmenes de forma declarativa, lo que facilita reproducir entornos complejos en desarrollo, pruebas y producción. Un archivo típico incluye la imagen, puertos expuestos, variables de entorno y dependencias de cada servicio. Al ejecutar docker-compose up, Compose crea los contenedores, los conecta según la red definida y inicia los servicios en el orden correcto. Los comandos docker-compose down y docker-compose logs simplifican la limpieza y la depuración.
- Definir servicios: cada bloque indica la imagen, puertos y variables de entorno.
- Compartir datos: usar volúmenes para persistir información entre reinicios.
- Escalar servicios: utilizar docker-compose up –scale para aumentar réplicas de un servicio.
Conclusión
Docker se ha convertido en una pieza fundamental del ecosistema Linux moderno, ofreciendo una forma eficiente, portátil y segura de empaquetar y ejecutar aplicaciones. Al dominar su instalación, comprender sus conceptos básicos y aplicar buenas prácticas de seguridad y orquestación, los equipos pueden acelerar la entrega, reducir inconsistencias entre entornos y mejorar la utilización de recursos. Ya sea que estés empezando o busques optimizar flujos existentes, Docker brinda las herramientas necesarias para construir infraestructuras resilientes y escalables en cualquier distribución Linux.


