Docker: Comandos Básicos y Gestión de Contenedores - Guía Completa

Dominar los comandos de Docker es esencial para la gestión efectiva de contenedores en flujos de trabajo DevOps modernos. Esta guía completa cubre comandos esenciales de Docker, gestión del ciclo de vida de contenedores, ejemplos prácticos y mejores prácticas para gestionar aplicaciones contenedorizadas en entornos de producción.

Tabla de Contenidos

Introducción

Los contenedores Docker proporcionan entornos ligeros y portátiles para ejecutar aplicaciones. Comprender la interfaz de línea de comandos (CLI) de Docker es fundamental para desarrolladores y administradores de sistemas que trabajan con aplicaciones contenedorizadas. Esta guía proporciona una referencia completa de comandos Docker, desde operaciones básicas hasta técnicas avanzadas de gestión de contenedores.

Lo Que Aprenderás

  • Comandos esenciales de la CLI de Docker y su sintaxis
  • Gestión del ciclo de vida de contenedores (crear, iniciar, detener, eliminar)
  • Gestión de imágenes y operaciones con registros
  • Técnicas de inspección y depuración de contenedores
  • Limitación y monitoreo de recursos
  • Mejores prácticas para entornos de producción

Requisitos Previos

Antes de proceder, asegúrate de tener:

  • Docker Engine instalado (consulta la guía de Instalación de Docker)
  • Conocimiento básico de línea de comandos de Linux
  • Cuenta de usuario con permisos de Docker (miembro del grupo docker)
  • Acceso a terminal en tu sistema Linux

Verifica la instalación de Docker:

docker --version
docker info

Resumen de la Arquitectura de Docker

Comprender la arquitectura de Docker te ayuda a usar los comandos de manera efectiva:

Componentes Clave

  • Docker Daemon: Servicio en segundo plano que gestiona contenedores
  • Docker Client: Herramienta CLI para enviar comandos al daemon
  • Docker Images: Plantillas de solo lectura para crear contenedores
  • Docker Containers: Instancias en ejecución de imágenes
  • Docker Registry: Repositorio para almacenar y distribuir imágenes

Flujo de Trabajo Básico

Image (pulled from registry) → Container (running instance) → Modified Container → New Image (committed)

Comandos Esenciales de Docker

Obtener Ayuda

# Display Docker version
docker --version

# Show detailed version information
docker version

# Display system-wide information
docker info

# Get help for Docker commands
docker --help

# Get help for specific command
docker run --help
docker ps --help

Trabajar con Contenedores

Ejecutar Contenedores

# Run container from image
docker run nginx

# Run container in detached mode (background)
docker run -d nginx

# Run container with custom name
docker run --name my-nginx nginx

# Run interactive container with terminal
docker run -it ubuntu bash

# Run container with port mapping
docker run -d -p 8080:80 nginx

# Run container with multiple ports
docker run -d -p 8080:80 -p 8443:443 nginx

# Run container with environment variables
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql

# Run container with volume mount
docker run -d -v /host/path:/container/path nginx

# Run container and remove after exit
docker run --rm ubuntu echo "Hello Docker"

Listar Contenedores

# List running containers
docker ps

# List all containers (including stopped)
docker ps -a

# List container IDs only
docker ps -q

# List containers with custom format
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

# List containers with size
docker ps -s

# Filter containers
docker ps --filter "status=running"
docker ps --filter "name=nginx"

Gestionar el Estado del Contenedor

# Start stopped container
docker start container_name

# Stop running container (sends SIGTERM)
docker stop container_name

# Stop container with timeout
docker stop -t 30 container_name

# Force stop container (sends SIGKILL)
docker kill container_name

# Restart container
docker restart container_name

# Pause container processes
docker pause container_name

# Unpause container
docker unpause container_name

Eliminar Contenedores

# Remove stopped container
docker rm container_name

# Force remove running container
docker rm -f container_name

# Remove multiple containers
docker rm container1 container2 container3

# Remove all stopped containers
docker container prune

# Remove all stopped containers (older syntax)
docker rm $(docker ps -aq -f status=exited)

Gestión del Ciclo de Vida de Contenedores

Ejemplo de Ciclo de Vida Completo

# 1. Pull image
docker pull nginx:latest

# 2. Create container without starting
docker create --name web-server -p 8080:80 nginx

# 3. Start the container
docker start web-server

# 4. View running containers
docker ps

# 5. Stop the container
docker stop web-server

# 6. Start it again
docker start web-server

# 7. Restart the container
docker restart web-server

# 8. Stop and remove
docker stop web-server
docker rm web-server

Crear Contenedores con Opciones Avanzadas

# Create container with resource limits
docker create \
  --name app-server \
  --memory="512m" \
  --cpus="1.5" \
  -p 3000:3000 \
  -e NODE_ENV=production \
  -v app-data:/app/data \
  --restart unless-stopped \
  node:16-alpine \
  node server.js

# Start the created container
docker start app-server

Políticas de Reinicio de Contenedores

# No automatic restart (default)
docker run --restart no nginx

# Always restart
docker run --restart always nginx

# Restart on failure
docker run --restart on-failure nginx

# Restart on failure with max attempts
docker run --restart on-failure:5 nginx

# Restart unless stopped manually
docker run --restart unless-stopped nginx

Actualizar política de reinicio en contenedor existente:

docker update --restart unless-stopped container_name

Trabajar con Imágenes Docker

Listar Imágenes

# List all images
docker images

# List image IDs only
docker images -q

# Show image digests
docker images --digests

# Filter images
docker images --filter "dangling=true"
docker images --filter "reference=nginx:*"

Descargar Imágenes

# Pull latest version
docker pull ubuntu

# Pull specific version
docker pull ubuntu:20.04

# Pull from specific registry
docker pull ghcr.io/username/image:tag

# Pull all tags of an image
docker pull --all-tags ubuntu

Eliminar Imágenes

# Remove image
docker rmi nginx

# Remove image by ID
docker rmi abc123def456

# Force remove image
docker rmi -f nginx

# Remove all unused images
docker image prune

# Remove all images
docker rmi $(docker images -q)

# Remove dangling images
docker image prune -a

Etiquetar Imágenes

# Tag image with new name
docker tag nginx:latest my-nginx:v1.0

# Tag for registry
docker tag my-app:latest registry.example.com/my-app:latest

Buscar Imágenes

# Search Docker Hub
docker search nginx

# Limit search results
docker search --limit 5 nginx

# Filter by stars
docker search --filter stars=100 nginx

Inspección y Depuración de Contenedores

Ver Logs de Contenedores

# View container logs
docker logs container_name

# Follow logs in real-time
docker logs -f container_name

# Show last N lines
docker logs --tail 100 container_name

# Show logs with timestamps
docker logs -t container_name

# Show logs since specific time
docker logs --since 2024-01-01T00:00:00 container_name
docker logs --since 1h container_name

Inspeccionar Contenedores

# Show container details
docker inspect container_name

# Format output with Go template
docker inspect --format '{{.State.Status}}' container_name

# Get container IP address
docker inspect --format '{{.NetworkSettings.IPAddress}}' container_name

# Get container ports
docker inspect --format '{{.NetworkSettings.Ports}}' container_name

# Show multiple containers
docker inspect container1 container2

Ejecutar Comandos en Contenedores

# Execute command in running container
docker exec container_name ls -la

# Interactive shell access
docker exec -it container_name bash
docker exec -it container_name sh

# Execute as specific user
docker exec -u root container_name whoami

# Set working directory
docker exec -w /app container_name pwd

Acceder al Shell del Contenedor

# Start bash in running container
docker exec -it my-container bash

# Start sh if bash not available
docker exec -it my-container sh

# Attach to container's main process
docker attach container_name

Copiar Archivos

# Copy from container to host
docker cp container_name:/path/to/file.txt /host/path/

# Copy from host to container
docker cp /host/path/file.txt container_name:/path/to/

# Copy directory
docker cp container_name:/app/logs/ ./logs/

Monitorear Contenedores

# Display container resource usage
docker stats

# Stats for specific container
docker stats container_name

# Stats without streaming (one-time)
docker stats --no-stream

# Show all containers including stopped
docker stats --all

Ver Procesos del Contenedor

# Show running processes in container
docker top container_name

# Show processes with custom format
docker top container_name aux

Información de Mapeo de Puertos

# Show port mappings
docker port container_name

# Show specific port mapping
docker port container_name 80

Gestión de Recursos

Límites de CPU

# Limit to 1 CPU
docker run -d --cpus="1.0" nginx

# Limit to 1.5 CPUs
docker run -d --cpus="1.5" nginx

# CPU shares (relative weight)
docker run -d --cpu-shares=512 nginx

# Pin to specific CPUs
docker run -d --cpuset-cpus="0,1" nginx

Límites de Memoria

# Set memory limit
docker run -d --memory="512m" nginx

# Set memory with swap limit
docker run -d --memory="512m" --memory-swap="1g" nginx

# Disable swap
docker run -d --memory="512m" --memory-swap="512m" nginx

# Set memory reservation
docker run -d --memory-reservation="256m" nginx

Límites de Almacenamiento

# Set storage limit
docker run -d --storage-opt size=10G nginx

Actualizar Recursos del Contenedor

# Update running container memory
docker update --memory="1g" container_name

# Update CPU limits
docker update --cpus="2" container_name

# Update multiple containers
docker update --memory="512m" container1 container2

Conceptos Básicos de Redes

Listar Redes

# List all networks
docker network ls

# Inspect network
docker network inspect bridge

Crear Redes

# Create bridge network
docker network create my-network

# Create network with subnet
docker network create --subnet=172.18.0.0/16 my-network

Conectar Contenedores a Redes

# Run container on specific network
docker run -d --network my-network --name web nginx

# Connect running container to network
docker network connect my-network container_name

# Disconnect from network
docker network disconnect my-network container_name

DNS de Contenedores

# Containers on same network can communicate by name
docker network create app-net
docker run -d --network app-net --name db mysql
docker run -d --network app-net --name web nginx

# From web container:
docker exec web ping db

Conceptos Básicos de Gestión de Volúmenes

Crear Volúmenes

# Create named volume
docker volume create my-data

# List volumes
docker volume ls

# Inspect volume
docker volume inspect my-data

Usar Volúmenes con Contenedores

# Mount named volume
docker run -d -v my-data:/app/data nginx

# Mount host directory (bind mount)
docker run -d -v /host/path:/container/path nginx

# Read-only volume
docker run -d -v my-data:/app/data:ro nginx

# Mount with volume driver options
docker run -d -v my-data:/app/data:nocopy nginx

Eliminar Volúmenes

# Remove specific volume
docker volume rm my-data

# Remove unused volumes
docker volume prune

Mejores Prácticas de Producción

Convención de Nomenclatura de Contenedores

# Use meaningful names
docker run -d --name prod-web-01 nginx
docker run -d --name prod-db-primary mysql

# Include environment and function
docker run -d --name staging-api-gateway nginx

Verificaciones de Salud

# Run with health check
docker run -d \
  --name web \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=3s \
  --health-retries=3 \
  nginx

# Check health status
docker inspect --format='{{.State.Health.Status}}' web

Mejores Prácticas de Logging

# Use json-file with limits
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

# Use syslog
docker run -d \
  --log-driver syslog \
  --log-opt syslog-address=tcp://192.168.1.100:514 \
  nginx

Prácticas de Seguridad

# Run as non-root user
docker run -d --user 1000:1000 nginx

# Read-only root filesystem
docker run -d --read-only --tmpfs /tmp nginx

# Drop capabilities
docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

# Set security options
docker run -d --security-opt="no-new-privileges:true" nginx

Límites de Recursos en Producción

# Production container with limits
docker run -d \
  --name prod-app \
  --memory="2g" \
  --memory-reservation="1g" \
  --cpus="2" \
  --restart unless-stopped \
  --log-opt max-size=10m \
  --log-opt max-file=5 \
  -p 80:8080 \
  my-app:latest

Limpieza de Contenedores

# Remove stopped containers
docker container prune

# Remove unused images
docker image prune -a

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Remove everything unused
docker system prune -a --volumes

Etiquetar Contenedores para Organización

# Run with labels
docker run -d \
  --label environment=production \
  --label team=backend \
  --label version=1.0 \
  nginx

# Filter by label
docker ps --filter "label=environment=production"

Solución de Problemas

El Contenedor No Inicia

# Check logs for errors
docker logs container_name

# Inspect container configuration
docker inspect container_name

# Check if port is already in use
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080

# Try running in foreground to see errors
docker run nginx

El Contenedor Sale Inmediatamente

# Check exit code
docker inspect --format='{{.State.ExitCode}}' container_name

# View logs
docker logs container_name

# Common exit codes:
# 0 - Successful exit
# 1 - Application error
# 137 - Container received SIGKILL (OOM or forced kill)
# 139 - Segmentation fault
# 143 - Container received SIGTERM

Alto Uso de Recursos

# Monitor resources
docker stats

# Check container processes
docker top container_name

# Inspect resource limits
docker inspect --format='{{.HostConfig.Memory}}' container_name

Problemas de Conectividad de Red

# Check container network
docker inspect --format='{{.NetworkSettings.Networks}}' container_name

# Get container IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name

# Test from another container
docker run --rm busybox ping container_name

# Check port mappings
docker port container_name

Problemas de Permisos

# Check container user
docker exec container_name whoami

# Check file permissions in container
docker exec container_name ls -la /path

# Run command as root
docker exec -u root container_name chown -R appuser:appuser /app

Depurar Contenedor Detenido

# Create container without starting
docker create --name debug nginx

# Start in debug mode
docker start -ai debug

# Or commit and inspect
docker commit container_name debug-image
docker run -it debug-image bash

Conclusión

Dominar los comandos de Docker es esencial para una gestión eficiente de contenedores. Esta guía cubrió operaciones fundamentales desde la gestión básica del ciclo de vida de contenedores hasta prácticas avanzadas de producción.

Conclusiones Clave

  • Ciclo de Vida del Contenedor: Comprender operaciones de crear, iniciar, detener, reiniciar y eliminar
  • Gestión de Imágenes: Descargar, listar, etiquetar y eliminar imágenes de manera eficiente
  • Habilidades de Depuración: Usar logs, exec, inspect y stats para solución de problemas
  • Control de Recursos: Establecer límites de CPU, memoria y almacenamiento para estabilidad
  • Mejores Prácticas: Implementar convenciones de seguridad, logging y nomenclatura
  • Listo para Producción: Usar verificaciones de salud, políticas de reinicio y limpieza adecuada

Tarjeta de Referencia Rápida

# Essential Commands
docker run -d --name app nginx          # Run container
docker ps -a                             # List all containers
docker logs -f app                       # Follow logs
docker exec -it app bash                 # Access shell
docker stop app                          # Stop container
docker rm app                            # Remove container
docker images                            # List images
docker rmi image_name                    # Remove image
docker system prune -a                   # Clean up everything

# Container Management
docker start/stop/restart container      # State management
docker pause/unpause container           # Pause processes
docker update --memory 1g container      # Update resources
docker inspect container                 # Detailed info

# Debugging
docker logs --tail 100 -f container      # Recent logs
docker stats container                   # Resource usage
docker top container                     # Running processes
docker exec -it container sh             # Interactive shell

Próximos Pasos

  1. Aprende Dockerfiles: Crea imágenes de contenedores personalizadas
  2. Explora Docker Compose: Gestiona aplicaciones multi-contenedor
  3. Estudia Redes: Profundiza en los modos de red de Docker
  4. Domina Volúmenes: Implementa estrategias de datos persistentes
  5. Endurecimiento de Seguridad: Aplica prácticas de seguridad avanzadas
  6. Orquestación: Avanza a Kubernetes para orquestación en producción
  7. Integración CI/CD: Automatiza construcción y despliegue de contenedores

Recursos Adicionales

Con estos comandos de Docker y mejores prácticas, estás bien equipado para gestionar contenedores de manera efectiva en entornos de desarrollo y producción. Practica estos comandos regularmente para desarrollar memoria muscular y confianza en las operaciones de contenedores.