¿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
| Aspecto | Contenedores | Máquinas Virtuales |
|---|---|---|
| Tamaño | Ligeros (MB) | Pesadas (GB) |
| Inicio | Segundos | Minutos |
| Recursos | Comparten kernel del host | Kernel independiente |
| Aislamiento | A nivel de procesos | Completo |
| Eficiencia | Alta | Media |
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ística | Docker | Podman |
|---|---|---|
| Daemon | Requiere daemon root | Sin daemon (daemonless) |
| Seguridad | Ejecuta como root | Rootless por defecto |
| Systemd | No nativo | Soporte nativo |
| Pods | No soporta | Soporte nativo de Kubernetes |
| Composición | docker-compose | podman-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=podmanpara 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:
- Crear el grupo docker (si no existe):
sudo groupadd docker
- Agregar tu usuario al grupo docker:
sudo usermod -aG docker $USER
- Activar los cambios:
# Opción 1: Cerrar sesión y volver a iniciar
# Opción 2: Activar el nuevo grupo inmediatamente
newgrp docker
- Verificar que funciona:
docker run hello-world
⚠️ Consideraciones de Seguridad
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:
- Aprende Docker Compose para aplicaciones multi-contenedor
- Explora Dockerfiles para crear tus propias imágenes
- Practica con proyectos reales usando contenedores
- Configura CI/CD con contenedores
- Explora Kubernetes para orquestación avanzada
Para empezar, instala Docker Desktop si necesitas una interfaz gráfica, o Podman si priorizas la seguridad y planeas usar Kubernetes en el futuro.