🐳 Docker
Docker es una plataforma para ejecutar aplicaciones en contenedores aislados. Esta hoja de referencia 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 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 información 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 de 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 a partir de una imagen | |
| docker run -it ubuntu bash | Ejecutar Ubuntu con una terminal Bash interactiva | |
| docker run -d nginx | Ejecutar Nginx en modo desatendido (en segundo plano) | |
| docker run -p 8080:80 nginx | Ejecutar Nginx y vincular 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 una 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 las 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 una imagen por su ID | |
| docker rmi $(docker images -q) | Eliminar todas las imágenes (¡usar con precaución!) | 
🔁 Gestió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 | Abrir 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 desatendido (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 los contenedores | |
| docker stats | Mostrar uso de CPU, memoria, red y disco de todos los contenedores | |
| docker stats container_name | Mostrar estadísticas solo de un contenedor específico | |
| docker stats --no-stream | Mostrar un snapshot único 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 desde un 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 desde el contenedor y filtrar líneas con “ERROR” sin guardarlo 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 reiniciarlo | |
| docker update --memory 500m container | Limitar el uso de memoria de un contenedor a 500 MB | 
🧱 Imágenes y Dockerfile
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker buildx build | Construir una imagen Docker a partir de un Dockerfile | |
| docker build -t my_image . | Construir una imagen etiquetada  | |
| docker build -t my_image:1.0 . | Construir una imagen etiquetada con 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 la etiqueta de una imagen | |
| docker tag my_image myrepo/my_image:latest | Agregar una etiqueta para subir a registro  | |
| docker tag my_image:1.0 my_image:stable | Crear etiqueta  | |
| docker tag my_image my_image:backup | Agregar una etiqueta  | |
| docker image push | Subir una imagen a Docker Hub u otro registro | |
| docker push myrepo/my_image:latest | Subir imagen etiquetada  | |
| docker push myrepo/my_image:1.0 | Subir imagen etiquetada  | |
| docker push myrepo/my_image | Subir imagen con etiqueta predeterminada  | |
| docker login | Autenticarse en Docker Hub u otro registro | |
| docker login | Ingresar usuario y contraseña interactivamente en 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 un 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 de Docker | |
| docker network ls --filter driver=bridge | Mostrar solo redes con el controlador  | |
| 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 controlador  | |
| docker network create --subnet=192.168.10.0/24 my_custom_net | Crear una red con una subred específica | |
| 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 usados | |
| 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 sobre 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 usados | 
🧩 Plugins de Docker
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker plugin ls | Listar plugins instalados de Docker | |
| 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 volúmenes 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 desatendido (en 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 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 | Abrir una shell bash interactiva en el contenedor del servicio  | |
| docker compose exec db ls /var/lib/postgresql | Ejecutar el 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 los 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 descarga incluso si fallan algunas imágenes | |
| docker compose restart | Reiniciar todos o servicios específicos | |
| 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 de Docker en un archivo tar para importarlas o transferirlas después | |
| docker save -o image.tar my_img:tag | Guardar una imagen de 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 de Docker desde un archivo tar previamente guardado | |
| docker load < image.tar | Cargar una imagen de Docker desde un archivo tar | |
| docker load --input redis_latest.tar | Cargar una imagen especificando el archivo como 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 de la imagen | |
| 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 a partir de un archivo tar de un sistema de archivos | |
| docker import file.tar new_img | Importar un archivo como nueva imagen de 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 la entrada estándar | 
🧹 Limpieza y diagnóstico
| 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 no usados de Docker: contenedores detenidos, redes no usadas, imágenes colgantes y caché de compilación | |
| docker system prune -a | Eliminar imágenes no usadas incluidas las intermedias | |
| docker system prune --volumes | Eliminar volúmenes no usados junto con otros recursos | |
| docker image prune | Eliminar imágenes no usadas de Docker incluidas capas colgantes | |
| docker image prune -a | Eliminar todas las imágenes no usadas incluidas las colgantes | |
| docker image prune --filter "until=24h" | Eliminar imágenes de más de 24 horas | |
| docker container prune | Eliminar contenedores detenidos que cumplan filtros o todos si no se especifica ninguno | |
| docker container prune --filter "until=24h" | Eliminar contenedores detenidos de 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 específico | |
| 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 un stack desde un archivo compose | |
| docker stack deploy --with-registry-auth -c compose.yml mystack | Desplegar con reenvío de autenticación de 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 un stack y salir de Swarm | 
💼 Uso avanzado de Docker
🚀 Comandos profesionales de Docker
| Comando | Ejemplo | Descripción | 
|---|---|---|
| docker buildx | Herramienta avanzada de compilació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 subir una imagen multiplataforma a un registro | |
| docker context | Administrar 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 conectar a un host Docker remoto | |
| 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, filtrando 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 contenedor | |
| 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 redes | |
| 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 a 2 CPUs y 1 GB de RAM | |
| docker update --restart unless-stopped my_container | Configurar política de reinicio automático  | |
| docker update --pids-limit 200 my_container | Limitar 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 historial de capas de una imagen: comandos de construcción, tamaño de cada capa y fecha 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 comandos de construcción completos 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 
 Usa imágenes base como- alpineo- scratchpara un tamaño mínimo.
 Para aplanar capas, puedes usar- --squashdurante la construcción (requiere funciones experimentales habilitadas).
 Además, elimina 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 
 Combina comandos en un- 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 de Dockerfile 
 Usa compilaciones multi-stage para que solo los archivos necesarios permanezcan en la imagen final.
 Copia e instala dependencias primero, luego el código — esto mejora el caché de capas y acelera reconstrucciones.
- Separar secretos y configuraciones 
 Nunca almacenes archivos- .env, claves API o certificados privados dentro de la imagen.
 Usa 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, usa 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 las capas de la imagen. 
- Docker sin root 
 Ejecutar Docker sin privilegios de root mejora la seguridad y reduce el riesgo de comprometer el 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 
 Usa herramientas integradas:- docker scan my_image- O el nuevo CLI: - docker scout cves my_image- Esto ayuda a detectar vulnerabilidades en imágenes base y dependencias. 
- Monitorear uso de recursos 
 Limita contenedores por memoria, CPU y número de procesos:- docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage- Esto previene consumo excesivo de recursos. 
 También puedes limitar I/O:- docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage- Útil para contenedores que no deben sobrecargar el subsistema de disco. 
- Limpieza automática 
 Elimina regularmente imágenes, contenedores, volúmenes y redes no usados:- docker system prune -af --volumes- ⚠ Ten cuidado: este comando elimina todos los recursos no usados. - Para limpieza selectiva usa: - docker image prune --filter "until=24h"
- Integración CI/CD 
 Integra compilació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 
 Adjunta controladores de logs (- --log-driver) a sistemas centralizados: ELK, Loki, Splunk.
 Usa Prometheus + cAdvisor para métricas de contenedores.
- Despliegue en producción 
 Separa configuraciones para desarrollo y producción usando- docker-compose.override.yml.
 Para alta disponibilidad y escalado usa:- 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 capacidad 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 en el contenedor sin modo interactivo | |
| docker container logs | Muestra los logs del contenedor especificado, permitiendo ver 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 de un objeto Docker (contenedor, imagen, red, etc.) en formato JSON, incluyendo configuración y estado | |
| docker inspect my_container | Obtener información completa en JSON del 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 namespaces de otro proceso (aquí, el contenedor). Usado con stracepara rastrear llamadas del 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 a namespaces del contenedor y rastrear llamadas del proceso 1 | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash | Abrir shell bash dentro de namespaces 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 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 por el 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 ejecutándose dentro del contenedor, similar a psen Linux, para analizar actividad del contenedor | |
| docker top my_container | Mostrar procesos ejecutándose dentro del contenedor | |
| docker top my_container aux | Usar formato 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 log y filtrar líneas de error sin guardarlo en disco | 
💡 Para depuración avanzada puedes 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 los servicios especificados desde el archivo docker-compose.yml con la opción 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 según lo descrito 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 forma concurrente para acelerar el proceso | |
| docker compose build web | Construir solo la imagen del servicio  | |
| docker compose pull | Descargar las últimas versiones de imágenes del registro para todos o servicios especificados | |
| docker compose pull | Descargar imágenes para todos los servicios | |
| docker compose pull db | Descargar solo la imagen del servicio  | |
| docker compose pull --ignore-pull-failures | Continuar la ejecución ignorando errores durante la descarga de imágenes | |
| docker compose restart | Reiniciar todos o servicios especificados sin recrear contenedores | |
| docker compose restart | Reiniciar todos los servicios en el 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 una solicitud 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 detectar cambios en archivos fuente, útil para desarrollo | |
| docker compose watch | Iniciar observación de archivos y reiniciar servicios en cambios | |
| docker compose events | Transmitir eventos de Compose: inicio, parada, 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 la 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 los 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 
 Usa archivos- docker-compose.override.ymlseparados para diferentes entornos —- development,- staging,- production. Esto ayuda a aislar configuraciones y evitar conflictos entre ajustes.
 También puedes 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- Usa diferentes archivos - .env(- .env.dev,- .env.prod, etc.) para gestionar variables de entorno.
- Almacenamiento seguro de secretos 
 No incluyas datos sensibles (contraseñas, tokens) directamente en archivos Compose. En su lugar, usa:- archivos .envpara variables de entorno (nota: los archivos.envno están encriptados y no deben subirse a repos públicos)
 
- docker secrety- docker configpara gestión segura de secretos y configuración en Docker Swarm
 
- volúmenes externos para archivos de configuración con secretos
 
- sistemas externos de gestión de secretos (ej., HashiCorp Vault, AWS Secrets Manager) 
 
- archivos 
- Orden de inicio con - depends_ony- healthcheck
 Para hacer que los servicios esperen a que sus 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, ejecuta:- docker compose pull && docker compose up -d --remove-orphans- La opción - -dejecuta contenedores en segundo plano, y- --remove-orphanselimina contenedores no definidos en las 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 se eliminen contenedores no usados sin tiempo de inactividad. 
- Recarga de código en caliente para desarrollo 
 Usa- volumespara montar directorios locales en contenedores. Esto permite aplicar cambios de código al instante sin reconstruir imágenes.
 Ten en cuenta problemas de permisos de archivos y peculiaridades de caché de sistema de archivos, especialmente en Windows y macOS, para evitar problemas de rendimiento.
- Recarga de código en caliente sin volúmenes (Compose 2.22+) - develop: watch: - path: ./src action: sync target: /app
- Registro centralizado de servicios 
 Redirige logs de contenedores a sistemas de monitoreo y agregación de logs como ELK Stack, Loki, Prometheus y Fluentd para fácil análisis y alertas.
 Usa controladores de logging de Docker (- --log-driver) para habilitar recolección centralizada de logs.
 Configura controladores 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 
 Configura la política de reinicio en- docker-compose.yml:- restart: unless-stopped- Otras políticas de reinicio incluyen: - no— sin reinicio automático (predeterminado)
 
- always— reinicia siempre el contenedor
 
- on-failure— reinicia solo en fallos (opcionalmente con número de reintentos)
 - En producción, - unless-stoppedes la mejor opción para asegurar resiliencia del servicio.
 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 | Ejecuta 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 del 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) | Rastrear 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 desde el contenedor del servicio  | 
💡 Para depuración conveniente de configuraciones complejas multi-servicio, usa
docker compose run --rmpara lanzar contenedores individuales con redes y volúmenes necesarios sin afectar los servicios principales.
📚 Recursos adicionales
🚫 Ignorar archivos con .dockerignore
Agrega 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⚡ Simplificación de 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"🧠 Consejo: uso de Docker
- No intentes memorizar todo — usa docker --helpodocker <command> --helppara explorar comandos.
 
- Practica regularmente y experimenta con proyectos simples.
 
- Mantén atención al tamaño de imágenes y elimina archivos innecesarios con - .dockerignore.
🌐 Enlaces útiles
📘 Documentación oficial de Docker — guías y referencias completas sobre todos los temas de Docker:
https://docs.docker.com/
📙 Hoja de referencia de Docker — hoja de referencia oficial completa de Docker:
https://dockerlabs.collabnix.com/docker/cheatsheet/
📗 Docker Hub — imágenes y registros:
https://hub.docker.com/