🐳 Docker
Docker es una plataforma para ejecutar aplicaciones en contenedores aislados. Esta hoja de trucos contiene comandos para trabajar con imágenes, contenedores, redes, volúmenes, así como Docker Compose y Swarm.
📦 Comandos básicos
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker | El comando principal de la CLI de Docker usado para ejecutar subcomandos y administrar contenedores, imágenes, redes y volúmenes | |
| docker version | Mostrar la versión instalada de Docker (cliente y servidor). Útil para verificar la instalación | |
| docker version --format '{{.Client.APIVersion}}' | Mostrar solo la versión de la API del cliente Docker | |
| docker version --format '{{.Server.Version}}' | Mostrar solo la versión del servidor (Engine) de Docker | |
| docker version --format '{{json .}}' | Mostrar información completa de la versión en formato JSON | |
| docker system info | Mostrar información general del sistema Docker: número de contenedores, imágenes, recursos | |
| docker info | Mostrar datos de Docker: versiones, redes, número de contenedores e imágenes | |
| docker info --format '{{json .}}' | Mostrar info en formato JSON — útil para automatización | |
| docker info --format '{{.NCPU}} CPUs, {{.MemTotal}} bytes RAM' | Mostrar número de CPUs y memoria total | |
| docker info --format '{{.Driver}}' | Mostrar el controlador de almacenamiento usado por Docker | |
| docker image pull | Descargar una imagen desde Docker Hub u otro registro. Los contenedores no pueden ejecutarse sin imágenes | |
| docker pull ubuntu | Descargar la última imagen disponible de Ubuntu | |
| docker pull nginx:alpine | Descargar la imagen ligera de Nginx basada en Alpine Linux | |
| docker pull redis:7 | Descargar la imagen de Redis versión 7 | |
| docker container run | Crear y ejecutar un nuevo contenedor desde una imagen | |
| docker run -it ubuntu bash | Ejecutar Ubuntu con una terminal Bash interactiva | |
| docker run -d nginx | Ejecutar Nginx en modo desacoplado (en segundo plano) | |
| docker run -p 8080:80 nginx | Ejecutar Nginx y enlazar el puerto 80 del contenedor al puerto 8080 del host | |
| docker container ls | Listar contenedores en ejecución | |
| docker ps | Mostrar solo contenedores en ejecución | |
| docker ps -a | Mostrar todos los contenedores, incluidos los detenidos | |
| docker ps --format '{{.Names}}' | Mostrar solo nombres de contenedores | |
| docker container start | Iniciar uno o más contenedores detenidos | |
| docker start container_name | Iniciar un contenedor por nombre | |
| docker start $(docker ps -aq) | Iniciar todos los contenedores | |
| docker start -ai container_name | Iniciar un contenedor y adjuntar terminal interactiva | |
| docker container stop | Detener un contenedor en ejecución | |
| docker stop container_name | Detener un contenedor por nombre | |
| docker stop $(docker ps -q) | Detener todos los contenedores en ejecución | |
| docker stop -t 5 container_name | Detener un contenedor dándole 5 segundos para finalizar procesos | |
| docker container restart | Reiniciar un contenedor | |
| docker restart container_name | Reiniciar un contenedor específico | |
| docker restart $(docker ps -q) | Reiniciar todos los contenedores en ejecución | |
| docker restart -t 10 container_name | Reiniciar un contenedor con un retraso de 10 segundos | |
| docker container rm | Eliminar un contenedor | |
| docker rm container_name | Eliminar un contenedor detenido específico | |
| docker rm $(docker ps -aq) | Eliminar todos los contenedores detenidos | |
| docker rm -f container_name | Forzar eliminación de un contenedor en ejecución | |
| docker image ls | Listar imágenes descargadas | |
| docker images | Mostrar todas las imágenes en el host | |
| docker images -a | Mostrar todas las imágenes, incluidas capas intermedias | |
| docker images --format '{{.Repository}}:{{.Tag}}' | Mostrar solo nombres y etiquetas de imágenes | |
| docker image rm | Eliminar una o más imágenes del almacenamiento local | |
| docker rmi test1:latest | Eliminar imagen con etiqueta  | |
| docker rmi 1a2b3c4d5e6f | Eliminar imagen por su ID | |
| docker rmi $(docker images -q) | Eliminar todas las imágenes (¡usar con precaución!) | 
🔁 Administración de contenedores
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker container exec | Ejecutar un comando dentro de un contenedor en ejecución | |
| docker exec -it container bash | Iniciar una shell bash interactiva dentro del contenedor llamado  | |
| docker exec container ls /app | Ejecutar el comando  | |
| docker exec -d container touch /tmp/testfile | Ejecutar un comando en el contenedor en modo desacoplado (sin esperar) | |
| docker container logs | Ver logs del contenedor | |
| docker logs container | Mostrar todos los logs del contenedor  | |
| docker logs -f container | Seguir logs del contenedor en tiempo real | |
| docker logs --tail 50 container | Mostrar las últimas 50 líneas de logs | |
| docker inspect | Obtener información detallada en JSON sobre un contenedor o imagen | |
| docker inspect container | Mostrar detalles del contenedor  | |
| docker inspect --format '{{.NetworkSettings.IPAddress}}' container | Mostrar la dirección IP del contenedor | |
| docker container stats | Mostrar estadísticas de uso de recursos en tiempo real de contenedores | |
| docker stats | Mostrar CPU, memoria, red y uso de disco de todos los contenedores | |
| docker stats container_name | Mostrar estadísticas solo de un contenedor específico | |
| docker stats --no-stream | Mostrar una captura única de estadísticas y salir | |
| docker container rename | Renombrar un contenedor | |
| docker rename old_name new_name | Renombrar contenedor de  | |
| docker container cp | Copiar archivos entre un contenedor y el host | |
| docker cp container:/src/file.txt ./file.txt | Copiar un archivo del contenedor al directorio actual del host | |
| docker cp ./config.yaml container:/app/config.yaml | Copiar un archivo del host al contenedor | |
| docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR" | Transmitir un archivo de log del contenedor y filtrar líneas “ERROR” sin guardar en disco | |
| docker container top | Mostrar procesos en ejecución dentro de un contenedor | |
| docker top container | Mostrar procesos del contenedor llamado  | |
| docker container pause | Pausar todos los procesos en un contenedor | |
| docker pause container | Pausar el contenedor  | |
| docker container unpause | Reanudar un contenedor pausado | |
| docker unpause container | Reanudar el contenedor  | |
| docker container update | Actualizar configuraciones de un contenedor sin reiniciar | |
| docker update --memory 500m container | Limitar uso de memoria del contenedor a 500 MB | 
🧱 Imágenes y Dockerfile
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker buildx build | Construir una imagen Docker desde un Dockerfile | |
| docker build -t my_image . | Construir una imagen etiquetada  | |
| docker build -t my_image:1.0 . | Construir una imagen etiquetada con la versión  | |
| docker build --no-cache -t my_image . | Construir una imagen sin usar caché para una compilación limpia | |
| docker container commit | Crear una imagen desde el estado actual de un contenedor | |
| docker commit container my_img:v1 | Crear imagen  | |
| docker commit -m "Added config" container my_img:v2 | Crear una imagen con un mensaje de commit | |
| docker commit -a "John Doe" container my_img:latest | Crear una imagen especificando el autor | |
| docker image tag | Agregar o cambiar una etiqueta de imagen | |
| docker tag my_image myrepo/my_image:latest | Agregar una etiqueta para enviar al registro  | |
| docker tag my_image:1.0 my_image:stable | Crear etiqueta  | |
| docker tag my_image my_image:backup | Agregar etiqueta  | |
| docker image push | Enviar una imagen a Docker Hub u otro registro | |
| docker push myrepo/my_image:latest | Enviar imagen etiquetada  | |
| docker push myrepo/my_image:1.0 | Enviar imagen etiquetada  | |
| docker push myrepo/my_image | Enviar imagen con etiqueta predeterminada  | |
| docker login | Autenticarse en Docker Hub u otro registro | |
| docker login | Ingresar usuario y contraseña de forma interactiva para Docker Hub | |
| docker login myregistry.local:5000 | Iniciar sesión en un registro privado | |
| docker login -u username -p password | Iniciar sesión con usuario y contraseña (no recomendado) | |
| docker logout | Cerrar sesión en Docker Hub u otro registro | |
| docker logout | Cerrar sesión en Docker Hub | |
| docker logout myregistry.local:5000 | Cerrar sesión en registro privado | |
| HEALTHCHECK | Instrucción Dockerfile para verificar automáticamente el estado de salud del contenedor | |
| HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1 | Agregar health check para verificar disponibilidad del servicio cada 30 segundos | |
| docker inspect --format='{{json .State.Health}}' container_name | Verificar el estado de healthcheck de un contenedor en ejecución | 
🔌 Redes y volúmenes
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker network ls | Listar todas las redes de Docker | |
| docker network ls | Mostrar todas las redes creadas en Docker | |
| docker network ls --filter driver=bridge | Mostrar solo redes con el driver  | |
| docker network ls --format '{{.Name}}' | Mostrar solo nombres de redes | |
| docker network create | Crear una nueva red de Docker | |
| docker network create my_net | Crear una red llamada  | |
| docker network create --driver bridge my_bridge_net | Crear una red con el driver  | |
| docker network create --subnet=192.168.10.0/24 my_custom_net | Crear una red con una subred especificada | |
| docker network connect | Conectar un contenedor a una red | |
| docker network connect my_net container | Conectar el contenedor llamado  | |
| docker network connect --alias db_net my_net container | Conectar con alias  | |
| docker network disconnect | Desconectar un contenedor de una red | |
| docker network disconnect my_net container | Desconectar contenedor  | |
| docker volume ls | Listar todos los volúmenes de Docker | |
| docker volume ls | Mostrar todos los volúmenes de Docker | |
| docker volume ls --filter dangling=true | Mostrar volúmenes no utilizados | |
| docker volume create | Crear un nuevo volumen de Docker | |
| docker volume create my_vol | Crear un volumen llamado  | |
| docker volume create --driver local --opt type=tmpfs my_tmp_vol | Crear un volumen temporal usando tmpfs | |
| docker volume inspect | Mostrar información detallada de un volumen | |
| docker volume inspect my_vol | Mostrar detalles del volumen  | |
| docker volume rm | Eliminar uno o más volúmenes | |
| docker volume rm my_vol | Eliminar el volumen llamado  | |
| docker volume rm $(docker volume ls -qf dangling=true) | Eliminar todos los volúmenes no utilizados | 
🧩 Plugins de Docker
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker plugin ls | Listar plugins de Docker instalados | |
| docker plugin ls | Mostrar todos los plugins y su estado | |
| docker plugin install | Instalar un plugin de Docker desde un registro | |
| docker plugin install vieux/sshfs | Instalar el plugin de volumen SSHFS | |
| docker plugin install store/weaveworks/net-plugin:latest_release | Instalar el plugin de red Weave | |
| docker plugin disable | Deshabilitar un plugin instalado | |
| docker plugin disable vieux/sshfs | Deshabilitar el plugin SSHFS | |
| docker plugin enable | Habilitar un plugin previamente deshabilitado | |
| docker plugin enable vieux/sshfs | Habilitar el plugin SSHFS | |
| docker plugin rm | Eliminar un plugin de Docker | |
| docker plugin rm vieux/sshfs | Eliminar el plugin SSHFS | 
📋 Docker Compose
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker compose up | Iniciar contenedores definidos en docker-compose.yml | |
| docker compose up | Iniciar todos los servicios en el directorio actual en modo interactivo | |
| docker compose up -d | Iniciar servicios en modo desacoplado (segundo plano) | |
| docker compose up --build | Construir imágenes antes de iniciar servicios | |
| docker compose down | Detener y eliminar contenedores, redes y volúmenes creados por up | |
| docker compose down | Detener todos los servicios en ejecución y eliminar recursos asociados | |
| docker compose down --volumes | Eliminar también volúmenes creados por Compose | |
| docker compose down --rmi all | Eliminar también imágenes creadas por Compose | |
| docker compose logs | Ver logs de todos o de servicios específicos | |
| docker compose logs | Mostrar logs de todos los servicios | |
| docker compose logs -f | Seguir logs en tiempo real | |
| docker compose logs web | Mostrar logs solo del servicio  | |
| docker compose exec | Ejecutar un comando dentro de un contenedor de servicio en ejecución | |
| docker compose exec web bash | Entrar en una shell bash interactiva dentro del contenedor del servicio  | |
| docker compose exec db ls /var/lib/postgresql | Ejecutar comando  | |
| docker compose exec -d worker touch /tmp/done | Ejecutar un comando dentro del contenedor  | |
| docker compose build | Construir o reconstruir imágenes de servicios | |
| docker compose build | Construir todas las imágenes definidas en  | |
| docker compose build web | Construir solo la imagen del servicio  | |
| docker compose build --no-cache | Construir imágenes sin usar caché | |
| docker compose ps | Mostrar el estado de todos los servicios y contenedores | |
| docker compose ps -a | Mostrar todos los contenedores, incluidos los detenidos | |
| docker compose ps --services | Mostrar solo nombres de servicios | |
| docker compose pull | Descargar/actualizar imágenes de servicios desde el registro | |
| docker compose pull web | Descargar imagen solo para el servicio  | |
| docker compose pull --ignore-pull-failures | Continuar descargando incluso si algunas imágenes fallan | |
| docker compose restart | Reiniciar todos o servicios especificados | |
| docker compose restart db | Reiniciar solo el servicio  | |
| docker compose restart -t 10 | Reiniciar servicios con un tiempo de espera de 10 segundos | |
| docker compose config | Mostrar la configuración final de Compose en formato YAML | |
| docker compose config --services | Listar todos los servicios en la configuración | |
| docker compose config --volumes | Listar todos los volúmenes definidos en la configuración | |
| docker compose start | Iniciar servicios detenidos sin recrear contenedores | |
| docker compose start web | Iniciar el servicio  | |
| docker compose start db api | Iniciar múltiples servicios a la vez | |
| docker compose stop | Detener servicios sin eliminar contenedores | |
| docker compose stop web | Detener el servicio  | |
| docker compose stop -t 5 | Detener servicios con un tiempo de espera de 5 segundos | 
📤 Exportar e importar
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker image save | Guardar una o más imágenes Docker en un archivo tar para importación o transferencia posterior | |
| docker save -o image.tar my_img:tag | Guardar una imagen Docker en un archivo tar | |
| docker save my_image > my_image.tar | Forma alternativa de guardar una imagen en un archivo | |
| docker save -o redis_latest.tar redis:latest | Guardar una imagen específica de Redis en un archivo | |
| docker image load | Cargar imágenes Docker desde un archivo tar guardado previamente | |
| docker load < image.tar | Cargar una imagen Docker desde un archivo tar | |
| docker load --input redis_latest.tar | Cargar una imagen especificando el archivo por parámetro | |
| docker load --quiet < my_image.tar | Cargar una imagen sin mostrar progreso | |
| docker container export | Exportar el sistema de archivos de un contenedor como archivo tar sin historial ni metadatos | |
| docker export container > file.tar | Exportar sistema de archivos del contenedor a un archivo | |
| docker export my_container > my_container_fs.tar | Exportar contenedor por nombre | |
| docker export -o container_fs.tar container_id | Exportar por ID de contenedor usando la opción  | |
| docker image import | Crear una nueva imagen desde un archivo tar de un sistema de archivos | |
| docker import file.tar new_img | Importar archivo como nueva imagen Docker | |
| docker import https://example.com/image.tar my_new_image | Importar imagen directamente desde una URL | |
| docker import - my_image < file.tar | Importar desde entrada estándar | 
🧹 Limpieza y diagnósticos
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker system df | Mostrar uso de disco de Docker: volúmenes, imágenes, contenedores y caché de compilación | |
| docker system df -v | Salida detallada con información de cada imagen, contenedor y volumen | |
| docker system df --format '{{json .}}' | Mostrar información en formato JSON | |
| docker system prune | Eliminar todos los datos Docker no utilizados: contenedores detenidos, redes sin uso, imágenes colgantes y caché de compilación | |
| docker system prune -a | Eliminar imágenes no utilizadas incluidas las intermedias | |
| docker system prune --volumes | Eliminar volúmenes no utilizados junto con otros recursos | |
| docker image prune | Eliminar imágenes Docker no utilizadas incluidas las capas colgantes | |
| docker image prune -a | Eliminar todas las imágenes no utilizadas incluidas las colgantes | |
| docker image prune --filter "until=24h" | Eliminar imágenes de más de 24 horas | |
| docker container prune | Eliminar contenedores detenidos según filtros o todos si no se especifican | |
| docker container prune --filter "until=24h" | Eliminar contenedores detenidos con más de 24 horas | |
| docker container prune --force | Eliminar sin pedir confirmación | 
🐝 Docker Swarm
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker swarm init | Inicializar un nuevo clúster Docker Swarm en el nodo actual | |
| docker swarm init --advertise-addr 192.168.1.100 | Inicializar el clúster especificando la dirección IP | |
| docker swarm init --listen-addr 0.0.0.0:2377 | Inicializar con un puerto de escucha especificado | |
| docker service create | Crear un nuevo servicio en el clúster Swarm | |
| docker service create --name nginx nginx | Crear un servicio Nginx en Swarm | |
| docker service create --replicas 3 --name web webserver | Crear un servicio con 3 réplicas | |
| docker service create --name redis --publish 6379:6379 redis | Crear un servicio con mapeo de puertos | |
| docker stack deploy | Desplegar un stack de servicios en el clúster Swarm basado en un archivo Compose | |
| docker stack deploy -c docker-compose.yml mystack | Desplegar stack desde archivo compose | |
| docker stack deploy --with-registry-auth -c compose.yml mystack | Desplegar con reenvío de autenticación del registro | |
| docker stack deploy -c swarm-compose.yml mystack | Usar un archivo compose alternativo para el stack | |
| docker stack rm | Eliminar uno o más stacks del clúster Swarm | |
| docker stack rm mystack | Eliminar el stack  | |
| docker stack rm | Eliminar todos los stacks (no recomendado) | |
| docker stack rm mystack && docker swarm leave --force | Eliminar stack y salir de Swarm | 
💼 Uso avanzado de Docker
🚀 Comandos profesionales de Docker
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker buildx | Herramienta avanzada de construcción de imágenes que reemplaza docker build. Soporta multiplataforma, caché, compilaciones paralelas y exportación a varios formatos. Útil para CI/CD y desarrollo multiplataforma | |
| docker buildx build --platform linux/arm64,linux/amd64 -t myimg:multi . | Construir una imagen multiplataforma (ARM y x86 simultáneamente) | |
| docker buildx build --load -t localimg . | Construir una imagen y cargarla en la caché local del Docker Engine | |
| docker buildx build --push --platform linux/amd64,linux/arm64 -t repo/app:latest . | Construir y enviar una imagen multiplataforma a un registro | |
| docker context | Gestionar contextos de Docker para trabajar con entornos remotos o múltiples. Permite cambiar rápidamente entre Docker Engines locales y remotos | |
| docker context create myremote --docker "host=ssh://user@host" | Crear un contexto para conectarse a un host remoto de Docker | |
| docker context use myremote | Cambiar al contexto remoto | |
| docker context ls | Listar contextos disponibles y el activo | |
| docker system events | Escuchar eventos de Docker en tiempo real, con filtrado por tipo de evento (ej. inicio de contenedor). Útil para monitoreo y automatización | |
| docker events --filter 'event=start' | Mostrar solo eventos de inicio de contenedores | |
| docker events --since 1h --until 10m | Mostrar eventos de la última hora hasta hace 10 minutos | |
| docker events --filter 'type=network' | Mostrar solo eventos relacionados con red | |
| docker events --filter 'image=nginx' | Mostrar eventos relacionados con la imagen  | |
| docker container update | Cambiar límites de recursos y configuraciones de un contenedor en ejecución sin reiniciarlo | |
| docker update --cpus 2 --memory 1g my_container | Establecer límite en 2 CPUs y 1 GB RAM | |
| docker update --restart unless-stopped my_container | Establecer política de reinicio automático a  | |
| docker update --pids-limit 200 my_container | Limitar el número de procesos a 200 | |
| docker container diff | Mostrar cambios en el sistema de archivos de un contenedor comparado con su imagen original. Útil para depuración y auditoría | |
| docker diff my_container | Mostrar todos los cambios en el sistema de archivos del contenedor | |
| docker diff my_container | grep '^A' | Mostrar solo archivos añadidos ( | |
| docker image history | Mostrar el historial de capas de la imagen: comandos de construcción, tamaño de cada capa y tiempo de creación. Útil para optimización y auditoría | |
| docker history my_image | Mostrar historial de capas de una imagen | |
| docker history --no-trunc my_image | Mostrar todos los comandos de construcción sin truncar | |
| docker history --format "{{.CreatedBy}}: {{.Size}}" my_image | Mostrar solo comandos de construcción y tamaños de capas | 
🛠 Prácticas útiles de Docker y automatización
- Minimizar tamaño de la imagen 
 Usar imágenes base como- alpineo- scratchpara tamaño mínimo.
 Para comprimir capas, usar- --squashdurante la construcción (requiere características experimentales habilitadas).
 Además, eliminar archivos temporales y cachés en una sola capa:- RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
- Minimizar número de capas 
 Combinar comandos en un solo- RUNpara reducir el número de capas y el tamaño final de la imagen:- RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
- Optimizar construcción del Dockerfile 
 Usar compilaciones multi-etapa para que solo los archivos necesarios queden en la imagen final.
 Copiar e instalar dependencias primero, luego copiar el código — esto mejora el caché de capas y acelera reconstrucciones.
- Separar secretos y configuraciones 
 Nunca almacenar archivos- .env, llaves API o certificados privados dentro de la imagen.
 Usar para configuración:- docker secret(en Swarm)
 
- variables de entorno (-e VAR=valueo.env)
 
- volúmenes externos para configuraciones 
 
- Secretos en tiempo de construcción (BuildKit) 
 Para pasar secretos de forma segura durante la construcción, usar la opción- --secret:- docker buildx build --secret id=mysecret,src=./secret.txt .- En Dockerfile, el secreto estará disponible en - /run/secrets/mysecret:- RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret- 🛡 Esto evita que los secretos se almacenen en capas de la imagen. 
- Docker sin root 
 Ejecutar Docker sin privilegios de root mejora la seguridad y reduce el riesgo de compromiso del host.
 Para habilitar:- dockerd-rootless-setuptool.sh install export PATH=/usr/bin:$PATH- Verificar: - docker info | grep Rootless- ⚠ Algunas funciones (ej. reenvío de puertos <1024) no estarán disponibles. 
- Escanear imágenes en busca de vulnerabilidades 
 Usar herramientas integradas:- docker scan my_image- O la nueva CLI: - docker scout cves my_image- Esto ayuda a detectar vulnerabilidades en imágenes base y dependencias. 
- Monitorear uso de recursos 
 Limitar contenedores por memoria, CPU y número de procesos:- docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage- Esto previene el consumo excesivo de recursos. 
 También se puede limitar E/S:- docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage- Útil para contenedores que no deberían sobrecargar el subsistema de disco. 
- Limpieza automática 
 Eliminar regularmente imágenes, contenedores, volúmenes y redes no utilizados:- docker system prune -af --volumes- ⚠ Cuidado: este comando elimina todos los recursos no utilizados. - Para limpieza selectiva usar: - docker image prune --filter "until=24h"
- Integración CI/CD 
 Incorporar construcción, pruebas y despliegue en GitHub Actions, GitLab CI, pipelines de Jenkins.
 Ejemplo de paso en GitHub Actions:- - run: docker build -t myapp:${GITHUB_SHA} . - run: docker push myapp:${GITHUB_SHA}
- Registro y monitoreo 
 Adjuntar controladores de logs (- --log-driver) a sistemas centralizados: ELK, Loki, Splunk.
 Usar Prometheus + cAdvisor para métricas de contenedores.
- Despliegue en producción 
 Separar configuraciones para desarrollo y producción usando- docker-compose.override.yml.
 Para alta disponibilidad y escalamiento usar:- Docker Swarm
 
- Kubernetes 
 
- Docker Swarm
🐞 Depuración y perfilado de contenedores Docker
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker container exec | Ejecuta un comando dentro de un contenedor en ejecución, proporcionando acceso interactivo o la posibilidad de ejecutar procesos en el entorno aislado del contenedor | |
| docker exec -it my_container bash | Iniciar una terminal interactiva (bash) dentro de un contenedor en ejecución | |
| docker exec -it my_container sh | Iniciar una shell mínima dentro del contenedor (si bash no está disponible) | |
| docker exec my_container ls /app | Ejecutar un comando dentro del contenedor sin modo interactivo | |
| docker container logs | Muestra los logs del contenedor especificado, permitiendo ver la salida y eventos relacionados con su operación para diagnóstico y monitoreo | |
| docker logs -f --tail 100 my_container | Ver las últimas 100 líneas de logs con transmisión en tiempo real | |
| docker logs my_container | Mostrar todos los logs disponibles del contenedor | |
| docker logs --since 1h my_container | Mostrar logs de la última hora | |
| docker inspect | Muestra información detallada en formato JSON sobre un objeto de Docker (contenedor, imagen, red, etc.), incluyendo configuración y estado | |
| docker inspect my_container | Obtener información completa en JSON sobre el contenedor | |
| docker inspect --format '{{.State.Pid}}' my_container | Obtener el PID del proceso principal del contenedor en el host | |
| docker inspect --format '{{.NetworkSettings.IPAddress}}' my_container | Mostrar la dirección IP del contenedor | |
| nsenter(withstrace) | Utilidad de Linux para entrar en los espacios de nombres de otro proceso (aquí, el contenedor). Se usa con stracepara rastrear llamadas al sistema dentro del contenedor para depuración | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1 | Entrar en espacios de nombres del contenedor y rastrear llamadas al sistema del proceso 1 | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash | Abrir una shell bash dentro de los espacios de nombres del contenedor | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --net netstat -tulnp | Ver puertos abiertos dentro del contenedor | |
| tcpdump(inside container) | Herramienta de consola para capturar y analizar tráfico de red. Usada en el contenedor para diagnosticar problemas de red, analizar paquetes y monitorear conexiones | |
| docker exec -it my_container tcpdump -i any | Capturar y analizar tráfico de red dentro del contenedor | |
| docker exec -it my_container tcpdump -nn port 80 | Capturar tráfico solo en el puerto 80 | |
| docker exec -it my_container tcpdump -w /tmp/dump.pcap | Guardar tráfico en archivo para análisis posterior | |
| docker container stats | Muestra métricas actuales de uso de recursos (CPU, memoria, red, disco) para uno o varios contenedores en tiempo real | |
| docker stats my_container | Mostrar uso en tiempo real de CPU, memoria, red y disco del contenedor | |
| docker stats | Mostrar estadísticas de todos los contenedores | |
| docker stats --no-stream | Mostrar estadísticas una sola vez y salir | |
| docker container top | Muestra la lista de procesos que se ejecutan dentro del contenedor, similar a psen Linux, para analizar la actividad del contenedor | |
| docker top my_container | Mostrar procesos en ejecución dentro del contenedor | |
| docker top my_container aux | Usar formato de salida alternativo como  | |
| docker top my_container -eo pid,cmd | Mostrar solo PID y comando de procesos | |
| docker diff | Muestra cambios en el sistema de archivos del contenedor comparado con su imagen base, indicando archivos añadidos, modificados o eliminados | |
| docker diff my_container | Mostrar cambios en el sistema de archivos del contenedor comparado con la imagen base | |
| docker diff my_container | grep '^A' | Mostrar solo archivos añadidos ( | |
| docker diff my_container | grep '^C' | Mostrar solo archivos modificados ( | |
| docker cp | Copia archivos y directorios entre un contenedor y el host, permitiendo intercambio de datos y respaldo | |
| — | — | — | 
| docker cp my_container:/path/to/file ./file | Copiar archivo del contenedor al host | |
| docker cp ./config.yaml my_container:/app/config.yaml | Copiar archivo del host al contenedor | |
| docker cp my_container:/var/log/app.log - | tar x -O | grep "ERROR" | Copiar archivo de logs y filtrar líneas de error sin guardar en disco | 
💡 Para depuración avanzada se pueden usar
nsenter,strace,tcpdump,gdby otras herramientas de bajo nivel.
💼 Uso avanzado de Docker Compose
🚀 Comandos profesionales de Docker Compose
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker compose up | Inicia y gestiona el ciclo de vida de servicios especificados desde el archivo docker-compose.yml con la posibilidad de ejecutarlos en segundo plano | |
| docker compose up -d web db | Ejecutar solo los servicios  | |
| docker compose up --build | Reconstruir imágenes antes de iniciar servicios | |
| docker compose up --remove-orphans | Eliminar contenedores no definidos en el archivo compose actual | |
| docker compose build | Construye imágenes para servicios descritos en el archivo compose con control de caché y paralelismo | |
| docker compose build --no-cache | Reconstruir completamente imágenes sin usar caché | |
| docker compose build --parallel | Construir todos los servicios de manera concurrente para acelerar el proceso | |
| docker compose build web | Construir solo la imagen del servicio  | |
| docker compose pull | Descarga las últimas versiones de imágenes desde el registro para todos o servicios específicos | |
| docker compose pull | Descargar imágenes de todos los servicios | |
| docker compose pull db | Descargar imagen solo para el servicio  | |
| docker compose pull --ignore-pull-failures | Continuar ejecución ignorando errores durante la descarga de imágenes | |
| docker compose restart | Reinicia todos o servicios especificados sin recrear contenedores | |
| docker compose restart | Reiniciar todos los servicios del proyecto actual | |
| docker compose restart worker | Reiniciar solo el servicio  | |
| docker compose restart web db | Reiniciar múltiples servicios a la vez | |
| docker compose exec | Ejecutar un comando dentro de un contenedor de servicio en ejecución con modo interactivo opcional | |
| docker compose exec db psql -U user -d database | Ejecutar psql dentro del contenedor del servicio  | |
| docker compose exec web sh | Abrir una shell dentro del contenedor  | |
| docker compose exec api curl http://localhost:8080 | Ejecutar petición curl desde el contenedor del servicio  | |
| docker compose config | Mostrar la configuración final de Compose considerando todos los archivos y variables de entorno | |
| docker compose config | Mostrar configuración combinada en formato YAML | |
| docker compose config --services | Listar todos los servicios | |
| docker compose config --environment | Mostrar todas las variables de entorno usadas por los servicios | |
| docker compose watch | Reiniciar automáticamente servicios al cambiar archivos fuente, útil para desarrollo | |
| docker compose watch | Comenzar a vigilar archivos y reiniciar servicios al cambiar | |
| docker compose events | Transmitir eventos de Compose: inicio, detención, actualización de servicios | |
| docker compose events --json | Recibir eventos en formato JSON | |
| docker compose rm | Eliminar contenedores de servicios detenidos | |
| docker compose rm web db | Eliminar contenedores de los servicios  | |
| docker compose pause | Pausar operación de un servicio | |
| docker compose pause api | Pausar el servicio  | |
| docker compose unpause | Reanudar servicios pausados | |
| docker compose unpause api | Reanudar el servicio  | |
| docker compose create | Crear contenedores sin iniciarlos | |
| docker compose create web db | Crear contenedores para  | |
| docker compose images | Mostrar lista de imágenes usadas por servicios | |
| docker compose images | Mostrar imágenes de todos los servicios | |
| docker compose top | Mostrar procesos en ejecución dentro de contenedores de servicios | |
| docker compose top web | Mostrar procesos dentro de contenedores del servicio  | 
🛠 Prácticas útiles y automatización con Docker Compose
- Separación de entornos 
 Usar archivos- docker-compose.override.ymlseparados para diferentes entornos —- development,- staging,- production. Esto ayuda a aislar configuraciones y evitar conflictos.
 También se pueden combinar múltiples archivos de configuración usando la opción- -f:- docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- Usar diferentes archivos - .env(- .env.dev,- .env.prod, etc.) para gestionar variables de entorno.
- Almacenamiento seguro de secretos 
 No incluir datos sensibles (contraseñas, tokens) directamente en los archivos Compose. En su lugar, usar:- archivos .envpara variables de entorno (nota: los.envno están cifrados y no deben subirse a repos públicos)
 
- docker secrety- docker configpara gestión segura de secretos y configuraciones en Docker Swarm
 
- volúmenes externos para archivos de configuración que contengan secretos
 
- sistemas externos de gestión de secretos (ej. HashiCorp Vault, AWS Secrets Manager) 
 
- archivos 
- Orden de inicio con - depends_ony- healthcheck
 Para que servicios esperen a que dependencias estén listas:- services: db: image: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s retries: 5 api: image: my_api depends_on: db: condition: service_healthy
- Minimizar tiempo de inactividad durante actualizaciones 
 Antes de actualizar servicios, ejecutar:- docker compose pull && docker compose up -d --remove-orphans- La opción - -dejecuta contenedores en segundo plano, y- --remove-orphanselimina contenedores no definidos en configuraciones actuales.
 Para detener y eliminar completamente contenedores antiguos si es necesario:- docker compose down --remove-orphans- Esto asegura que se carguen imágenes nuevas y contenedores no usados sean eliminados sin tiempo de inactividad. 
- Recarga en caliente de código para desarrollo 
 Usar- volumespara montar directorios locales en contenedores. Esto permite aplicar cambios de código al instante sin reconstruir imágenes.
 Prestar atención a problemas de permisos de archivos y peculiaridades de caché del sistema de archivos, especialmente en Windows y macOS.
- Recarga en caliente sin volumen (Compose 2.22+) - develop: watch: - path: ./src action: sync target: /app
- Registro centralizado de servicios 
 Redirigir logs de contenedores a sistemas de monitoreo y agregación como ELK Stack, Loki, Prometheus y Fluentd para análisis y alertas.
 Usar drivers de logging de Docker (- --log-driver) para habilitar recolección centralizada de logs.
 Configurar drivers de logging para contenedores en Compose:- services: api: image: my_api logging: driver: "json-file" options: max-size: "10m" max-file: "3"
- Reinicio automático de servicios 
 Configurar política de reinicio en- docker-compose.yml:- restart: unless-stopped- Otras políticas de reinicio incluyen: - no— sin reinicio automático (por defecto)
 
- always— siempre reiniciar contenedor
 
- on-failure— reiniciar solo en fallos (opcionalmente con número de reintentos)
 - En producción, - unless-stoppedes la mejor opción para garantizar resiliencia de servicios.
 Esto permite recuperación automática de servicios tras fallos o reinicios del host.
- Perfiles de servicios 
 Permiten ejecutar solo grupos específicos de servicios:- services: db: image: postgres profiles: ["backend"] web: image: nginx profiles: ["frontend"]- Para ejecutar solo el perfil frontend: - docker compose --profile frontend up
🐞 Depuración y perfilado de servicios en Docker Compose
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker compose exec | Ejecutar un comando dentro de un servicio en ejecución, proporcionando acceso al contenedor o ejecución de procesos individuales | |
| docker compose exec web sh | Abrir una shell dentro del contenedor del servicio  | |
| docker compose exec db psql -U user -d database | Ejecutar el comando psql dentro del contenedor del servicio  | |
| docker compose logs | Ver logs de servicios para diagnóstico y monitoreo | |
| docker compose logs -f db | Ver logs del servicio  | |
| docker compose logs --tail=50 api | Mostrar las últimas 50 líneas de logs del servicio  | |
| docker compose logs --since=1h web | Mostrar logs de la última hora del servicio  | |
| docker inspect | Ver información detallada sobre el contenedor que ejecuta un servicio | |
| docker inspect $(docker compose ps -q web) | Obtener JSON con información detallada del contenedor del servicio  | |
| docker container stats | Monitorear uso de recursos de contenedores que ejecutan servicios | |
| docker stats $(docker compose ps -q worker) | Seguir uso de CPU, memoria y otros recursos del contenedor del servicio  | |
| docker compose run --rm | Ejecutar un contenedor temporal con configuraciones de servicio, útil para depuración | |
| docker compose run --rm web sh | Iniciar un contenedor de una sola vez para el servicio  | |
| docker container cp | Copiar archivos entre host y contenedor | |
| docker cp $(docker compose ps -q db):/dump.sql ./dump.sql | Copiar un archivo del contenedor del servicio  | 
💡 Para depuración conveniente de configuraciones complejas con múltiples servicios, usar
docker compose run --rmpara iniciar contenedores individuales con redes y volúmenes necesarios sin afectar servicios principales.
📚 Recursos adicionales
🚫 Ignorar archivos con .dockerignore
Agregar archivos y carpetas al archivo .dockerignore que no deben incluirse en la imagen para reducir tamaño y acelerar la construcción:
node_modules/
*.log
.env⚡ Simplificar comandos con alias
Puedes crear alias para comandos usados frecuentemente y ejecutarlos más rápido:
alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcb="docker compose build"🧠 Tip: Consejos de uso de Docker
- No intentes memorizar todo — usa docker --helpodocker <comando> --helppara explorar comandos.
 
- Practica regularmente y experimenta con proyectos simples.
 
- Vigila el tamaño de las imágenes y elimina archivos innecesarios mediante - .dockerignore.
🌐 Enlaces útiles
📘 Documentación oficial de Docker — guías completas y referencias sobre todos los temas de Docker:
https://docs.docker.com/
📙 Docker Cheat Sheet — hoja de trucos oficial completa de Docker:
https://dockerlabs.collabnix.com/docker/cheatsheet/
📗 Docker Hub — imágenes y registros:
https://hub.docker.com/