Saltar al contenido principal

¿Qué es Docker?

Docker es una plataforma de código abierto que permite desarrollar, enviar y ejecutar aplicaciones utilizando tecnología de contenedores. Te permite separar tus aplicaciones de tu infraestructura para que puedas entregar software rápidamente.

¿Qué son los Contenedores?

Los contenedores son entornos aislados y ligeros que contienen todo lo necesario para ejecutar una aplicación:

  • Código de la aplicación
  • Dependencias y librerías
  • Variables de entorno
  • Configuración del sistema
  • Herramientas del sistema

🏗️ Contenedores vs Máquinas Virtuales

AspectoContenedoresMáquinas Virtuales
TamañoLigeros (MB)Pesadas (GB)
InicioSegundosMinutos
RecursosComparten kernel del hostKernel independiente
AislamientoA nivel de procesosCompleto
EficienciaAltaMedia

Arquitectura de Docker

🔧 Componentes Principales

Docker Daemon (dockerd)

  • Servicio que escucha las peticiones de la API de Docker
  • Gestiona objetos Docker: imágenes, contenedores, redes y volúmenes
  • Se ejecuta en segundo plano

Docker Client (docker)

  • Interfaz de línea de comandos principal
  • Envía comandos al Docker Daemon
  • Puede comunicarse con múltiples daemons

Docker Images (Imágenes)

  • Plantillas de solo lectura para crear contenedores
  • Contienen instrucciones paso a paso
  • Se construyen usando Dockerfile
  • Utilizan capas para optimizar almacenamiento

Docker Containers (Contenedores)

  • Instancias ejecutables de una imagen
  • Pueden ser creados, iniciados, detenidos y eliminados
  • Relativamente aislados del host y otros contenedores

Docker Registry

  • Repositorio donde se almacenan las imágenes
  • Docker Hub es el registry público por defecto
  • Puedes tener registries privados

¿Para qué usar Docker?

🚀 Desarrollo

  • Entornos consistentes: Misma configuración en desarrollo, testing y producción
  • Onboarding rápido: Nuevos desarrolladores pueden empezar en minutos
  • Aislamiento: Diferentes versiones de dependencias sin conflictos

📦 Despliegue

  • Portabilidad: "Funciona en mi máquina" → "Funciona en cualquier lugar"
  • Escalabilidad: Fácil escalado horizontal
  • Microservicios: Ideal para arquitecturas distribuidas

🔄 CI/CD

  • Build una vez, ejecuta en cualquier lugar
  • Testing consistente en diferentes entornos
  • Despliegues rápidos y rollbacks sencillos

Casos de Uso Comunes

  • Aplicaciones web: Frontend, backend, APIs
  • Bases de datos: MySQL, PostgreSQL, MongoDB, Redis
  • Herramientas de desarrollo: Nginx, Apache, Jenkins
  • Microservicios: Arquitecturas distribuidas
  • Machine Learning: Jupyter notebooks, modelos de ML

Ventajas de Docker

Beneficios Técnicos

  • Rápido inicio: Contenedores inician en segundos
  • Eficiencia de recursos: Menos overhead que VMs
  • Versionado: Control de versiones para infraestructura
  • Rollback fácil: Volver a versiones anteriores rápidamente

Beneficios de Desarrollo

  • DevOps: Reduce la brecha entre desarrollo y operaciones
  • Colaboración: Equipos trabajan con los mismos entornos
  • Productividad: Menos tiempo configurando, más tiempo desarrollando

Comandos Docker Básicos

# Ver información del sistema Docker
docker info

# Listar imágenes locales
docker images

# Descargar una imagen
docker pull nginx

# Ejecutar un contenedor
docker run -d -p 8080:80 nginx

# Listar contenedores en ejecución
docker ps

# Listar todos los contenedores
docker ps -a

# Detener un contenedor
docker stop <container_id>

# Eliminar un contenedor
docker rm <container_id>

# Eliminar una imagen
docker rmi <image_name>

Podman: Alternativa a Docker

¿Qué es Podman?

Podman es una alternativa libre y de código abierto a Docker que ofrece varias ventajas importantes:

🔒 Principales Diferencias

CaracterísticaDockerPodman
DaemonRequiere daemon rootSin daemon (daemonless)
SeguridadEjecuta como rootRootless por defecto
SystemdNo nativoSoporte nativo
PodsNo soportaSoporte nativo de Kubernetes
Composicióndocker-composepodman-compose

Ventajas de Podman

Seguridad Superior

  • Rootless containers: No requiere privilegios de root
  • Sin daemon privilegiado: Reduce superficie de ataque
  • Trusted by government: Usado por agencias gubernamentales de EE.UU.

Compatibilidad

  • Compatible con Docker: Ejecuta contenedores Docker existentes
  • Soporte docker-compose: Funciona con archivos docker-compose
  • Alias fácil: alias docker=podman para transición suave

Integración con Kubernetes

  • Pods nativos: Crea y gestiona pods directamente
  • YAML Kubernetes: Ejecuta archivos YAML de Kubernetes
  • Generación de YAML: Convierte pods a manifiestos de Kubernetes

🚀 Cuándo usar cada uno

Usar Docker cuando:

  • Equipos grandes con experiencia en Docker
  • Necesitas Docker Desktop (GUI)
  • Proyectos legacy con dependencias específicas
  • Ecosistema Docker establecido

Usar Podman cuando:

  • Seguridad es prioridad
  • Entornos rootless
  • Integración con systemd
  • Transición hacia Kubernetes
  • Infraestructura HPC

📦 Comandos Podman

# Los comandos son prácticamente idénticos a Docker
podman pull nginx
podman run -d -p 8080:80 nginx
podman ps
podman stop <container_id>

# Comandos específicos de Podman
podman pod create --name mypod
podman run -dt --pod mypod nginx
podman generate kube mypod > mypod.yaml

Instalación

🍎 macOS

# Docker Desktop
brew install --cask docker

# Podman
brew install podman
podman machine init
podman machine start

🐧 Linux

Docker

# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Agregar usuario al grupo docker (sin sudo)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

# Verificar instalación
docker run hello-world

Podman

# Ubuntu/Debian
sudo apt update
sudo apt install podman

# Red Hat/Fedora
sudo dnf install podman

🪟 Windows

# Docker Desktop
winget install Docker.DockerDesktop

# Podman
winget install RedHat.Podman-Desktop

Configuración Sin Sudo (Linux)

Para usar Docker sin sudo cada vez, necesitas agregar tu usuario al grupo docker:

Pasos para configuración sin sudo:

  1. Crear el grupo docker (si no existe):
sudo groupadd docker
  1. Agregar tu usuario al grupo docker:
sudo usermod -aG docker $USER
  1. Activar los cambios:
# Opción 1: Cerrar sesión y volver a iniciar
# Opción 2: Activar el nuevo grupo inmediatamente
newgrp docker
  1. Verificar que funciona:
docker run hello-world

⚠️ Consideraciones de Seguridad

Importante

El grupo docker otorga privilegios equivalentes a root. Los usuarios en este grupo pueden:

  • Acceder al sistema de archivos del host
  • Escalar privilegios fácilmente
  • Comprometer la seguridad del sistema

Alternativas más seguras:

  • Usar Podman (rootless por defecto)
  • Usar Docker rootless mode
  • Limitar acceso solo a usuarios de confianza

🔧 Solución de problemas comunes

Error de permisos en .docker/

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

Verificar grupos del usuario

groups $USER

Reiniciar servicio Docker

sudo systemctl restart docker

Próximos Pasos

Una vez que tengas Docker o Podman instalado:

  1. Aprende Docker Compose para aplicaciones multi-contenedor
  2. Explora Dockerfiles para crear tus propias imágenes
  3. Practica con proyectos reales usando contenedores
  4. Configura CI/CD con contenedores
  5. Explora Kubernetes para orquestación avanzada

Recomendación

Para empezar, instala Docker Desktop si necesitas una interfaz gráfica, o Podman si priorizas la seguridad y planeas usar Kubernetes en el futuro.