Hoja de Trucos de Docker

Aprende Docker con Laboratorios Prácticos

Aprende la contenerización con Docker a través de laboratorios prácticos y escenarios del mundo real. LabEx proporciona cursos completos de Docker que cubren la gestión esencial de contenedores, la construcción de imágenes, Docker Compose, redes, volúmenes y despliegue. Domina la orquestación de contenedores y las técnicas modernas de despliegue de aplicaciones.

Instalación y Configuración

Instalación en Linux

Instalar Docker en sistemas Ubuntu/Debian.

# Actualizar gestor de paquetes
sudo apt update
# Instalar prerrequisitos
sudo apt install apt-transport-https ca-certificates curl
software-properties-common
# Añadir la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg
| sudo apt-key add -
# Añadir repositorio de Docker
sudo add-apt-repository "deb [arch=amd64]
https://download.docker.com/linux/ubuntu bionic stable"
# Instalar Docker
sudo apt update && sudo apt install docker-ce
# Iniciar servicio Docker
sudo systemctl start docker
sudo systemctl enable docker

Windows y macOS

Instalar Docker Desktop para gestión basada en GUI.

# Windows: Descargar Docker Desktop desde docker.com
# macOS: Usar Homebrew o descargar desde docker.com
brew install --cask docker
# O descargar directamente desde:
# https://www.docker.com/products/docker-desktop

Configuración Post-Instalación

Configurar Docker para uso sin root y verificar la instalación.

# Añadir usuario al grupo docker (Linux)
sudo usermod -aG docker $USER
# Cerrar sesión y volver a iniciar para cambios de grupo
# Verificar instalación de Docker
docker --version
docker run hello-world

Instalación de Docker Compose

Instalar Docker Compose para aplicaciones multi-contenedor.

# Linux: Instalar vía curl
sudo curl -L
"https://github.com/docker/compose/releases/download
/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o
/usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Verificar instalación
docker-compose --version
# Nota: Docker Desktop incluye Compose

Comandos Básicos de Docker

Información del Sistema: docker version / docker system info

Comprobar los detalles de la instalación y el entorno de Docker.

# Mostrar información de la versión de Docker
docker version
# Mostrar información del sistema Docker
information
docker system info
# Mostrar ayuda para comandos Docker
docker help
docker <comando> --help

Ejecutar Contenedores: docker run

Crear e iniciar un contenedor a partir de una imagen.

# Ejecutar un contenedor interactivamente
docker run -it ubuntu:latest bash
# Ejecutar contenedor en segundo plano
(detached)
docker run -d --name mi-contenedor
nginx
# Ejecutar con mapeo de puertos
docker run -p 8080:80 nginx
# Ejecutar con auto-eliminación después de salir
docker run --rm hello-world
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué hace docker run -d?
Ejecuta el contenedor en modo depuración
Elimina el contenedor después de que se detiene
Ejecuta el contenedor en modo separado (background)
Ejecuta el contenedor con la configuración predeterminada

Listar Contenedores: docker ps

Ver contenedores en ejecución y detenidos.

# Listar contenedores en ejecución
docker ps
# Listar todos los contenedores (incluidos los detenidos)
docker ps -a
# Listar solo IDs de contenedores
docker ps -q
# Mostrar el último contenedor creado
docker ps -l

Gestión de Contenedores

Ciclo de Vida del Contenedor: start / stop / restart

Controlar el estado de ejecución del contenedor.

# Detener un contenedor en ejecución
docker stop nombre_contenedor
# Iniciar un contenedor detenido
docker start nombre_contenedor
# Reiniciar un contenedor
docker restart nombre_contenedor
# Pausar/reanudar procesos del contenedor
docker pause nombre_contenedor
docker unpause nombre_contenedor

Ejecutar Comandos: docker exec

Ejecutar comandos dentro de contenedores en ejecución.

# Ejecutar shell bash interactiva
docker exec -it nombre_contenedor bash
# Ejecutar un solo comando
docker exec nombre_contenedor ls -la
# Ejecutar como usuario diferente
docker exec -u root nombre_contenedor whoami
# Ejecutar en directorio específico
docker exec -w /app nombre_contenedor pwd

Eliminación de Contenedores: docker rm

Eliminar contenedores del sistema.

# Eliminar un contenedor detenido
docker rm nombre_contenedor
# Eliminar forzosamente un contenedor en ejecución
docker rm -f nombre_contenedor
# Eliminar múltiples contenedores
docker rm contenedor1 contenedor2
# Eliminar todos los contenedores detenidos
docker container prune

Registros de Contenedores: docker logs

Ver la salida del contenedor y depurar problemas.

# Ver registros del contenedor
docker logs nombre_contenedor
# Seguir registros en tiempo real
docker logs -f nombre_contenedor
# Mostrar solo registros recientes
docker logs --tail 50 nombre_contenedor
# Mostrar registros con marcas de tiempo
docker logs -t nombre_contenedor

Gestión de Imágenes

Construcción de Imágenes: docker build

Crear imágenes Docker a partir de Dockerfiles.

# Construir imagen desde el directorio actual
docker build .
# Construir y etiquetar una imagen
docker build -t mi_app:latest .
# Construir con argumentos de construcción
docker build --build-arg VERSION=1.0 -t mi_app .
# Construir sin usar caché
docker build --no-cache -t mi_app .
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué hace docker build -t mi_app:latest .?
Construye una imagen Docker con la etiqueta "mi_app:latest" desde el directorio actual
Ejecuta un contenedor llamado "mi_app"
Descarga la imagen "mi_app:latest" de Docker Hub
Elimina la imagen "mi_app:latest"

Inspección de Imágenes: docker images / docker inspect

Listar y examinar imágenes Docker.

# Listar todas las imágenes locales
docker images
# Listar imágenes con filtros específicos
docker images nginx
# Mostrar detalles de la imagen
docker inspect nombre_imagen
# Ver historial de construcción de la imagen
docker history nombre_imagen

Operaciones de Registro: docker pull / docker push

Descargar y subir imágenes a registros.

# Descargar imagen de Docker Hub
docker pull nginx:latest
# Descargar versión específica
docker pull ubuntu:20.04
# Subir imagen al registro
docker push miusuario/mi_app:latest
# Etiquetar imagen antes de subir
docker tag mi_app:latest miusuario/mi_app:v1.0

Limpieza de Imágenes: docker rmi / docker image prune

Eliminar imágenes no utilizadas para liberar espacio en disco.

# Eliminar una imagen específica
docker rmi nombre_imagen
# Eliminar imágenes no utilizadas
docker image prune
# Eliminar todas las imágenes no utilizadas (no solo las colgantes)
docker image prune -a
# Eliminar forzosamente la imagen
docker rmi -f nombre_imagen

Conceptos Básicos de Dockerfile

Instrucciones Esenciales

Comandos principales de Dockerfile para construir imágenes.

# Imagen base
FROM ubuntu:20.04
# Establecer información del mantenedor
LABEL maintainer="usuario@ejemplo.com"
# Instalar paquetes
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*
# Copiar archivos del host al contenedor
COPY app.py /app/
# Establecer directorio de trabajo
WORKDIR /app
# Exponer puerto
EXPOSE 8000
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Cuál es el propósito de la instrucción FROM en un Dockerfile?
Copia archivos del host al contenedor
Especifica la imagen base sobre la cual construir
Establece variables de entorno
Define el comando a ejecutar cuando el contenedor arranca

Configuración de Ejecución

Configurar cómo se ejecuta el contenedor.

# Establecer variables de entorno
ENV PYTHON_ENV=production
ENV PORT=8000
# Crear usuario para seguridad
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
# Definir comando de inicio
CMD ["python3", "app.py"]
# O usar ENTRYPOINT para comandos fijos
ENTRYPOINT ["python3"]
CMD ["app.py"]
# Establecer comprobación de salud
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/ || exit 1

Docker Compose

Comandos Básicos de Compose: docker-compose up / docker-compose down

Iniciar y detener aplicaciones multi-contenedor.

# Iniciar servicios en primer plano
docker-compose up
# Iniciar servicios en segundo plano
docker-compose up -d
# Construir e iniciar servicios
docker-compose up --build
# Detener y eliminar servicios
docker-compose down
# Detener y eliminar con volúmenes
docker-compose down -v
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué hace docker-compose up -d?
Detiene todos los contenedores en ejecución
Construye imágenes sin iniciar contenedores
Muestra los registros de todos los servicios
Inicia todos los servicios definidos en docker-compose.yml en modo separado

Gestión de Servicios

Controlar servicios individuales dentro de aplicaciones Compose.

# Listar servicios en ejecución
docker-compose ps
# Ver registros de un servicio
docker-compose logs nombre_servicio
# Seguir registros para todos los servicios
docker-compose logs -f
# Reiniciar un servicio específico
docker-compose restart nombre_servicio

Ejemplo de docker-compose.yml

Configuración de ejemplo para una aplicación multi-servicio.

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      -
DATABASE_URL=postgresql://user:pass@db:5432/myapp
    depends_on:
      - db
    volumes:
      - .:/app

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - db_data:/var/lib/postgresql/data
volumes:
  db_data:

Redes y Volúmenes

Redes de Contenedores

Conectar contenedores y exponer servicios.

# Listar redes
docker network ls
# Crear una red personalizada
docker network create mi_red
# Ejecutar contenedor en red específica
docker run --network mi_red nginx
# Conectar contenedor en ejecución a la red
docker network connect mi_red nombre_contenedor
# Inspeccionar detalles de la red
docker network inspect mi_red

Mapeo de Puertos

Exponer puertos de contenedores al sistema host.

# Mapear un solo puerto
docker run -p 8080:80 nginx
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

En docker run -p 8080:80 nginx, ¿qué significan los números de puerto?
8080 es el puerto del host, 80 es el puerto del contenedor
80 es el puerto del host, 8080 es el puerto del contenedor
Ambos puertos son puertos de contenedor
Ambos puertos son puertos de host
# Mapear múltiples puertos
docker run -p 8080:80 -p 8443:443 nginx
# Mapear a una interfaz de host específica
docker run -p 127.0.0.1:8080:80 nginx
# Exponer todos los puertos definidos en la imagen
docker run -P nginx

Volúmenes de Datos: docker volume

Persistir y compartir datos entre contenedores.

# Crear un volumen con nombre
docker volume create mi_volumen
# Listar todos los volúmenes
docker volume ls
# Inspeccionar detalles del volumen
docker volume inspect mi_volumen
# Eliminar volumen
docker volume rm mi_volumen
# Eliminar volúmenes no utilizados
docker volume prune

Montaje de Volúmenes

Montar volúmenes con nombre y directorios del host en contenedores.

# Montar volumen con nombre
docker run -v mi_volumen:/data nginx
# Montar directorio del host (bind mount)
docker run -v /ruta/en/host:/ruta/en/contenedor nginx
# Montar directorio actual
docker run -v $(pwd):/app nginx
# Montaje de solo lectura
docker run -v /ruta/en/host:/ruta/en/contenedor:ro nginx

Inspección y Depuración de Contenedores

Detalles del Contenedor: docker inspect

Obtener información detallada sobre contenedores e imágenes.

# Inspeccionar configuración del contenedor
docker inspect nombre_contenedor
# Obtener información específica usando formato
docker inspect --format='{{.State.Status}}'
nombre_contenedor
# Obtener dirección IP
docker inspect --format='{{.NetworkSettings.IPAddress}}'
nombre_contenedor
# Obtener volúmenes montados
docker inspect --format='{{.Mounts}}' nombre_contenedor

Monitoreo de Recursos

Monitorear el uso de recursos y el rendimiento del contenedor.

# Mostrar procesos en ejecución en el contenedor
docker top nombre_contenedor
# Mostrar estadísticas de uso de recursos en vivo
docker stats
# Mostrar estadísticas para un contenedor específico
docker stats nombre_contenedor
# Monitorear eventos en tiempo real
docker events

Operaciones de Archivos: docker cp

Copiar archivos entre contenedores y el sistema host.

# Copiar archivo del contenedor al host
docker cp nombre_contenedor:/ruta/al/archivo ./
# Copiar archivo del host al contenedor
docker cp ./archivo nombre_contenedor:/ruta/al/destino
# Copiar directorio
docker cp ./directorio
nombre_contenedor:/ruta/al/destino/
# Copiar con modo archivo para preservar permisos
docker cp -a ./directorio nombre_contenedor:/ruta/

Solución de Problemas

Depurar problemas de contenedores y conectividad.

# Comprobar código de salida del contenedor
docker inspect --format='{{.State.ExitCode}}'
nombre_contenedor
# Ver procesos del contenedor
docker exec nombre_contenedor ps aux
# Probar conectividad de red
docker exec nombre_contenedor ping google.com
# Comprobar uso de disco
docker exec nombre_contenedor df -h

Registro y Autenticación

Autenticarse e interactuar con Docker Hub.

# Iniciar sesión en Docker Hub
docker login
# Iniciar sesión en registro específico
docker login registry.ejemplo.com
# Buscar imágenes en Docker Hub
docker search nginx
# Buscar con filtro
docker search --filter stars=100 nginx

Etiquetado y Publicación de Imágenes

Preparar y publicar imágenes en registros.

# Etiquetar imagen para el registro
docker tag mi_app:latest miusuario/mi_app:v1.0
docker tag mi_app:latest
registry.ejemplo.com/mi_app:latest
# Subir a Docker Hub
docker push miusuario/mi_app:v1.0
# Subir a registro privado
docker push registry.ejemplo.com/mi_app:latest

Registro Privado

Trabajar con registros Docker privados.

# Descargar de registro privado
docker pull registry.empresa.com/mi_app:latest
# Ejecutar registro local
docker run -d -p 5000:5000 --name registro registry:2
# Subir al registro local
docker tag mi_app localhost:5000/mi_app
docker push localhost:5000/mi_app

Seguridad de Imágenes

Verificar la integridad y seguridad de las imágenes.

# Habilitar la Confianza de Contenido de Docker
export DOCKER_CONTENT_TRUST=1
# Firmar y subir imagen
docker push miusuario/mi_app:signed
# Inspeccionar firmas de imágenes
docker trust inspect miusuario/mi_app:signed
# Escanear imágenes en busca de vulnerabilidades
docker scan mi_app:latest

Limpieza y Mantenimiento del Sistema

Limpieza del Sistema: docker system prune

Eliminar recursos no utilizados de Docker para liberar espacio en disco.

# Eliminar contenedores, redes, imágenes no utilizadas
docker system prune
# Incluir volúmenes no utilizados en la limpieza
docker system prune -a --volumes
# Eliminar todo (usar con precaución)
docker system prune -a -f
# Mostrar uso de espacio
docker system df

Limpieza Dirigida

Eliminar tipos específicos de recursos no utilizados.

# Eliminar contenedores detenidos
docker container prune
# Eliminar imágenes no utilizadas
docker image prune -a
# Eliminar volúmenes no utilizados
docker volume prune
# Eliminar redes no utilizadas
docker network prune

Operaciones Masivas

Realizar operaciones en múltiples contenedores/imágenes.

# Detener todos los contenedores en ejecución
docker stop $(docker ps -q)
# Eliminar todos los contenedores
docker rm $(docker ps -aq)
# Eliminar todas las imágenes
docker rmi $(docker images -q)
# Eliminar solo imágenes colgantes (dangling)
docker rmi $(docker images -f "dangling=true" -q)

Límites de Recursos

Controlar el consumo de recursos de los contenedores.

# Limitar el uso de memoria
docker run --memory=512m nginx
# Limitar el uso de CPU
docker run --cpus="1.5" nginx
# Limitar tanto CPU como memoria
docker run --memory=1g --cpus="2.0" nginx
# Establecer política de reinicio
docker run --restart=always nginx

Configuración y Ajustes de Docker

Configuración del Daemon

Configurar el daemon de Docker para uso en producción.

# Editar configuración del daemon
sudo nano
/etc/docker/daemon.json
# Configuración de ejemplo:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
# Reiniciar servicio Docker
sudo systemctl restart docker

Variables de Entorno

Configurar el comportamiento del cliente Docker con variables de entorno.

# Establecer host de Docker
export
DOCKER_HOST=tcp://docker-remoto:2376
# Habilitar verificación TLS
export DOCKER_TLS_VERIFY=1
export
DOCKER_CERT_PATH=/ruta/a/cert
# Establecer registro predeterminado
export
DOCKER_REGISTRY=registry.empresa.com
# Salida de depuración
export DOCKER_BUILDKIT=1

Ajuste de Rendimiento

Optimizar Docker para un mejor rendimiento.

# Habilitar características experimentales
echo '{"experimental": true}' |
sudo tee
/etc/docker/daemon.json
# Opciones del controlador de almacenamiento
{
  "storage-driver": "overlay2",
  "storage-opts": [

"overlay2.override_kernel_check
=true"
  ]
}
# Configurar logging
{
  "log-driver": "syslog",
  "log-opts": {"syslog-address":
"udp://logs.empresa.com:514"}
}

Mejores Prácticas

Mejores Prácticas de Seguridad

Mantener sus contenedores seguros y listos para producción.

# Ejecutar como usuario no root en Dockerfile
RUN groupadd -r appuser && useradd -r -g appuser
appuser
USER appuser
# Usar etiquetas de imagen específicas, no 'latest'
FROM node:16.20.0-alpine
# Usar sistemas de archivos de solo lectura cuando sea posible
docker run --read-only nginx

Optimización del Rendimiento

Optimizar contenedores para velocidad y eficiencia de recursos.

# Usar compilaciones multi-etapa para reducir el tamaño de la imagen
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules
./node_modules
COPY . .
CMD ["node", "server.js"]

Enlaces Relevantes