Comenzando con Dockers
¿Que es Docker?
Docker es una plataforma de virtualización a nivel de sistema operativo que permite crear, distribuir y ejecutar aplicaciones en contenedores. Un contenedor es una unidad estándar de software que empaqueta código y todas sus dependencias para que la aplicación se ejecute de manera rápida y confiable en diferentes entornos computacionales.
¿Por qué usar Docker?
Docker resuelve el problema clásico de “funciona en mi máquina” proporcionando:
- Consistencia: Tu aplicación funciona igual en desarrollo, testing y producción
- Portabilidad: Los contenedores corren en cualquier sistema que soporte Docker
- Eficiencia: Los contenedores comparten el kernel del sistema operativo, usando menos recursos que las máquinas virtuales
- Escalabilidad: Fácil replicación y distribución de aplicaciones
- Aislamiento: Cada contenedor funciona de forma independient
Conceptos Fundamentales.
Imagen vs Contenedor
- Imagen: Es una plantilla de solo lectura que contiene el código de la aplicación, bibliotecas, dependencias y otros archivos necesarios
- Contenedor: Es una instancia ejecutable de una imagen. Puedes crear múltiples contenedores desde una misma imagen
Dockerfile
Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para construir una imagen de Docker automáticamente.
Docker Hub
Es un registro en la nube donde puedes encontrar y compartir imágenes de Docker. Es como el “GitHub” de las imágenes Docker.
Instalación de Docker
En Windows
- Descarga Docker Desktop desde docker.com
- Ejecuta el instalador y sigue las instrucciones
- Reinicia tu computadora
- Ejecuta Docker Desktop
En macOS
- Descarga Docker Desktop para Mac
- Arrastra Docker.app a tu carpeta Applications
- Ejecuta Docker desde Applications
En Linux (Ubuntu/Debian)
# Actualizar paquetes existentes
sudo apt update
# Instalar paquetes necesarios
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# Agregar clave GPG de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Agregar repositorio de Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# Instalar Docker
sudo apt update
sudo apt install docker-ce
# Verificar instalación
sudo systemctl status docker
Verificar la Instalación
docker --version
docker run hello-world
Primeros Pasos con Docker
Comando Básicos
Ver imágenes disponibles localmente
docker images
Descargar una imagen
docker pull ubuntu
docker pull nginx
Ejecutar un contenedor
# Ejecutar contenedor interactivo
docker run -it ubuntu bash
# Ejecutar contenedor en segundo plano
docker run -d nginx
# Ejecutar con puerto expuesto
docker run -d -p 8080:80 nginx
Ver contenedores en ejecución
# Parar contenedor
docker stop <container_id>
# Eliminar contenedor
docker rm <container_id>
# Eliminar imagen
docker rmi <image_name>
Para tener en cuenta
Cuando se ejecuta un contenedor y la imagen no se encuentra descargada o almacenada de manera local, Docker usara Internet para descargarla imagen primero y después crear el contenedor, una vez hecho esto Docker nos permitirá almacenar la imagen en nuestra computadora para futuros contenedores, es decir una vez descargada la imagen ya no será necesario volver a Internet para descargarla, estará disponible en nuestro repositorio local.
Cuando se crea un contenedor y esta detenido, no es necesario dar RUN al Docker ya que esto nos creara otro contenedor a partir de la imagen, es mejor utilizar el comando docker start para inicializar el contenedor.
Les dejo esta guía básica de comandos Docker, ojo, no son todos pero puede ayudarlos en el camino para alguien que apenas se adentra en este mundo.
Guía de Comandos Básicos de Docker
📋 Información del Sistema
Verificar instalación y versión
docker --version # Versión de Docker
docker version # Información detallada
docker info # Información del sistema Docker
Estado del sistema
docker system df # Uso de espacio en disco
docker system prune # Limpiar recursos no utilizados
docker system prune -a # Limpiar TODO (imágenes, contenedores, redes, etc.)
🖼️ Gestión de Imágenes
Ver imágenes
docker images # Listar todas las imágenes locales
docker images -a # Incluir imágenes intermedias
docker images --filter dangling=true # Solo imágenes huérfanas
Descargar imágenes
docker pull ubuntu # Descargar imagen (última versión)
docker pull ubuntu:20.04 # Descargar versión específica
docker pull nginx:alpine # Descargar variante específica
Construir imágenes
docker build . # Construir desde Dockerfile en directorio actual
docker build -t mi-app . # Construir con nombre/tag
docker build -t mi-app:v1.0 . # Construir con tag específico
docker build -f Dockerfile.prod . # Usar Dockerfile específico
Eliminar imágenes
docker rmi imagen_id # Eliminar imagen por ID
docker rmi mi-app:v1.0 # Eliminar imagen por nombre:tag
docker rmi $(docker images -q) # Eliminar todas las imágenes
docker image prune # Eliminar imágenes no utilizadas
docker image prune -a # Eliminar TODAS las imágenes sin usar
Inspeccionar imágenes
docker inspect imagen_id # Ver detalles de una imagen
docker history imagen_id # Ver historial de capas
📦 Gestión de Contenedores
Crear y ejecutar contenedores
# Ejecutar contenedor básico
docker run ubuntu # Ejecutar y salir inmediatamente
docker run -it ubuntu bash # Ejecutar interactivo con terminal
# Ejecutar en segundo plano
docker run -d nginx # Ejecutar en background (detached)
docker run -d --name mi-nginx nginx # Ejecutar con nombre personalizado
# Mapeo de puertos
docker run -d -p 8080:80 nginx # Puerto local 8080 -> puerto contenedor 80
docker run -d -p 127.0.0.1:8080:80 nginx # Bind a IP específica
# Variables de entorno
docker run -e ENV_VAR=valor ubuntu
docker run --env-file .env ubuntu # Cargar desde archivo
# Volúmenes y montajes
docker run -v /host/path:/container/path ubuntu # Bind mount
docker run -v mi-volumen:/container/path ubuntu # Named volume
docker run --mount type=bind,source=/host,target=/container ubuntu
Ver contenedores
docker ps # Contenedores en ejecución
docker ps -a # Todos los contenedores
docker ps -l # Último contenedor creado
docker ps -q # Solo IDs de contenedores activos
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # Formato personalizado
Controlar contenedores
docker start contenedor_id # Iniciar contenedor parado
docker stop contenedor_id # Parar contenedor (SIGTERM)
docker kill contenedor_id # Matar contenedor (SIGKILL)
docker restart contenedor_id # Reiniciar contenedor
docker pause contenedor_id # Pausar contenedor
docker unpause contenedor_id # Reanudar contenedor pausado
Interactuar con contenedores
docker exec -it contenedor_id bash # Ejecutar comando en contenedor activo
docker exec contenedor_id ls -la # Ejecutar comando sin interacción
docker attach contenedor_id # Conectar a contenedor (Ctrl+P+Q para salir)
docker cp archivo.txt contenedor_id:/path/ # Copiar archivo al contenedor
docker cp contenedor_id:/path/archivo.txt . # Copiar archivo del contenedor
Logs y monitoreo
docker logs contenedor_id # Ver logs del contenedor
docker logs -f contenedor_id # Seguir logs en tiempo real
docker logs --tail 50 contenedor_id # Últimas 50 líneas
docker logs --since 2h contenedor_id # Logs de las últimas 2 horas
docker stats # Estadísticas de uso en tiempo real
docker stats contenedor_id # Stats de contenedor específico
docker top contenedor_id # Procesos ejecutándose en el contenedor
Eliminar contenedores
docker rm contenedor_id # Eliminar contenedor parado
docker rm -f contenedor_id # Forzar eliminación (contenedor activo)
docker rm $(docker ps -aq) # Eliminar todos los contenedores parados
docker container prune # Eliminar todos los contenedores parados
Inspeccionar contenedores
docker inspect contenedor_id # Información detallada
docker port contenedor_id # Ver mapeo de puertos
docker diff contenedor_id # Ver cambios en el filesystem
🗄️ Gestión de Volúmenes
Crear y listar volúmenes
docker volume create mi-volumen # Crear volumen
docker volume ls # Listar volúmenes
docker volume inspect mi-volumen # Inspeccionar volumen
Usar volúmenes
docker run -v mi-volumen:/data ubuntu # Montar volumen nombrado
docker run -v $(pwd):/app ubuntu # Montar directorio actual
docker run --mount source=mi-volumen,target=/data ubuntu # Sintaxis mount
Eliminar volúmenes
docker volume rm mi-volumen # Eliminar volumen específico
docker volume prune # Eliminar volúmenes no utilizados
🌐 Gestión de Redes
Listar y crear redes
docker network ls # Listar redes
docker network create mi-red # Crear red personalizada
docker network create --driver bridge mi-red-bridge # Red con driver específico
Conectar contenedores a redes
docker run --network mi-red ubuntu # Ejecutar en red específica
docker network connect mi-red contenedor_id # Conectar contenedor a red
docker network disconnect mi-red contenedor_id # Desconectar de red
Inspeccionar y eliminar redes
docker network inspect mi-red # Ver detalles de la red
docker network rm mi-red # Eliminar red
docker network prune # Eliminar redes no utilizadas
🐙 Docker Hub y Registries
Autenticación
docker login # Login en Docker Hub
docker login registry.example.com # Login en registry privado
docker logout # Logout
Push y Pull
docker tag mi-app usuario/mi-app:v1.0 # Etiquetar para push
docker push usuario/mi-app:v1.0 # Subir imagen
docker pull usuario/mi-app:v1.0 # Descargar imagen
docker search nginx # Buscar imágenes en Docker Hub
🔧 Docker Compose (Comandos Básicos)
Gestión de servicios
docker-compose up # Levantar servicios
docker-compose up -d # Levantar en background
docker-compose down # Parar y eliminar servicios
docker-compose start # Iniciar servicios existentes
docker-compose stop # Parar servicios
docker-compose restart # Reiniciar servicios
Información y logs
docker-compose ps # Ver estado de servicios
docker-compose logs # Ver logs de todos los servicios
docker-compose logs servicio # Logs de servicio específico
docker-compose logs -f # Seguir logs en tiempo real
Construcción y actualización
docker-compose build # Construir servicios
docker-compose up --build # Reconstruir y levantar
docker-compose pull # Actualizar imágenes
🧹 Comandos de Limpieza
Limpieza general
docker system prune # Limpiar contenedores parados, redes y imágenes huérfanas
docker system prune -a # Limpiar TODO (¡CUIDADO!)
docker system prune --volumes # Incluir volúmenes en la limpieza
Limpieza específica
docker container prune # Solo contenedores parados
docker image prune # Solo imágenes huérfanas
docker image prune -a # Todas las imágenes sin usar
docker volume prune # Solo volúmenes no utilizados
docker network prune # Solo redes no utilizadas
💡 Tips y Atajos Útiles
Comandos combinados útiles
# Parar todos los contenedores
docker stop $(docker ps -q)
# Eliminar todos los contenedores
docker rm $(docker ps -aq)
# Eliminar todas las imágenes
docker rmi $(docker images -q)
# Ver solo nombres de contenedores activos
docker ps --format "table {{.Names}}"
# Ejecutar y eliminar contenedor automáticamente
docker run --rm -it ubuntu bash
# Ver IPs de contenedores activos
docker ps -q | xargs docker inspect --format '{{ .Name }} - {{ .NetworkSettings.IPAddress }}'
Variables de entorno útiles
export DOCKER_BUILDKIT=1 # Habilitar BuildKit
export COMPOSE_PROJECT_NAME=mi-proyecto # Nombre por defecto para compose
🔍 Comandos de Diagnóstico
docker version # Verificar cliente y servidor
docker info # Información completa del sistema
docker events # Ver eventos en tiempo real
docker system df # Uso de espacio
docker stats --no-stream # Estadísticas actuales (sin stream)
Suerte en su camino con Dockers y ojala esto les ayude. Seguiré publicando mas información en un pequeño espacio que tenga. Saludos.