🐳 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 con Docker Compose y Swarm.
📦 Comandos básicos
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker | El comando principal de Docker CLI utilizado para ejecutar subcomandos y gestionar 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 información en formato JSON — útil para la 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 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 desacoplado (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 los contenedores en ejecución | |
| docker ps -a | Mostrar todos los contenedores, incluidos los detenidos | |
| docker ps --format '{{.Names}}' | Mostrar solo los nombres de los 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 la 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 la 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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker container exec | Ejecutar un comando dentro de un contenedor en ejecución | |
| docker exec -it container bash | Abrir un shell bash interactivo 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 los registros del contenedor | |
| docker logs container | Mostrar todos los registros del contenedor  | |
| docker logs -f container | Seguir los registros del contenedor en tiempo real | |
| docker logs --tail 50 container | Mostrar las últimas 50 líneas de registros | |
| docker inspect | Obtener información detallada en formato 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 en tiempo real del uso de recursos 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 una instantánea de estadísticas y salir | |
| docker container rename | Renombrar un contenedor | |
| docker rename old_name new_name | Renombrar un 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 el contenedor al directorio actual del host | |
| docker cp ./config.yaml container:/app/config.yaml | Copiar un archivo desde el host al contenedor | |
| docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR" | Transmitir un archivo de registro desde el contenedor y filtrar las 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 del contenedor sin reiniciar | |
| docker update --memory 500m container | Limitar el uso de memoria del contenedor a 500 MB | 
🧱 Imágenes y Dockerfile
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker buildx build | Construir una imagen Docker a partir de un Dockerfile | |
| docker build -t my_image . | Construir una imagen etiquetada como  | |
| 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 la 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 | Añadir o cambiar una etiqueta de imagen | |
| docker tag my_image myrepo/my_image:latest | Añadir una etiqueta para enviar al registro  | |
| docker tag my_image:1.0 my_image:stable | Crear la etiqueta  | |
| docker tag my_image my_image:backup | Añadir una etiqueta  | |
| docker image push | Enviar una imagen a Docker Hub u otro registro | |
| docker push myrepo/my_image:latest | Enviar la imagen etiquetada  | |
| docker push myrepo/my_image:1.0 | Enviar la imagen etiquetada  | |
| docker push myrepo/my_image | Enviar la imagen con la etiqueta predeterminada  | |
| docker login | Autenticarse en Docker Hub u otro registro | |
| docker login | Ingresar usuario y contraseña de forma interactiva 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 de Dockerfile para comprobar automáticamente el estado de salud del contenedor | |
| HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1 | Añadir un healthcheck para verificar la disponibilidad del servicio cada 30 segundos | |
| docker inspect --format='{{json .State.Health}}' container_name | Comprobar el estado de healthcheck de un contenedor en ejecución | 
🔌 Redes y Volúmenes
| Dominio | 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 las redes con el controlador  | |
| docker network ls --format '{{.Name}}' | Mostrar solo los nombres de las redes | |
| docker network create | Crear una nueva red 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 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 el 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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker plugin ls | Listar los 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 | Desactivar un plugin instalado | |
| docker plugin disable vieux/sshfs | Desactivar el plugin SSHFS | |
| docker plugin enable | Activar un plugin previamente desactivado | |
| docker plugin enable vieux/sshfs | Activar el plugin SSHFS | |
| docker plugin rm | Eliminar un plugin de Docker | |
| docker plugin rm vieux/sshfs | Eliminar el plugin SSHFS | 
📋 Docker Compose
| Dominio | 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 (en segundo plano) | |
| docker compose up --build | Construir imágenes antes de iniciar los 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 los recursos asociados | |
| docker compose down --volumes | Eliminar también los volúmenes creados por Compose | |
| docker compose down --rmi all | Eliminar también las imágenes creadas por Compose | |
| docker compose logs | Ver registros de todos o de servicios específicos | |
| docker compose logs | Mostrar registros de todos los servicios | |
| docker compose logs -f | Seguir los registros en tiempo real | |
| docker compose logs web | Mostrar registros 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 un shell bash interactivo dentro del 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 los servicios | |
| docker compose pull | Descargar/actualizar imágenes de servicios desde el registro | |
| docker compose pull web | Descargar la imagen solo para el servicio  | |
| docker compose pull --ignore-pull-failures | Continuar la descarga incluso si algunas imágenes fallan | |
| 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 varios 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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker image save | Guardar una o más imágenes de Docker en un archivo tar para su posterior importación o transferencia | |
| 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 mediante 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 un archivo tar sin historial de imagen ni metadatos | |
| docker export container > file.tar | Exportar el sistema de archivos del contenedor a un archivo | |
| docker export my_container > my_container_fs.tar | Exportar un 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 una nueva imagen de Docker | |
| docker import https://example.com/image.tar my_new_image | Importar una imagen directamente desde una URL | |
| docker import - my_image < file.tar | Importar desde la entrada estándar | 
🧹 Limpieza y Diagnóstico
| Dominio | 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 utilizados de Docker: contenedores detenidos, redes no usadas, 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 de Docker no utilizadas, incluidas 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 con más de 24 horas | |
| docker container prune | Eliminar contenedores detenidos que coincidan con filtros o todos si no se especifica ninguno | |
| docker container prune --filter "until=24h" | Eliminar contenedores detenidos con más de 24 horas | |
| docker container prune --force | Eliminar sin confirmación | 
🐝 Docker Swarm
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker swarm init | Inicializar un nuevo clúster de 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 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 stack y salir de Swarm | 
💼 Uso Avanzado de Docker
🚀 Comandos Profesionales de Docker
| Dominio | 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 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 conectar 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 (por ejemplo, inicio de contenedor). Útil para monitorización 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 la 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 de 2 CPUs y 1 GB de RAM | |
| docker update --restart unless-stopped my_container | Establecer política de reinicio automático  | |
| 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 en comparación 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 una imagen: comandos de compilació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 completos de compilación sin truncar | |
| docker history --format "{{.CreatedBy}}: {{.Size}}" my_image | Mostrar solo comandos de compilación y tamaños de capas | 
🛠 Prácticas útiles de Docker y Automatización
- Minimizar el tamaño de la imagen 
 Usar imágenes base como- alpineo- scratchpara un tamaño mínimo.
 Para aplanar capas, se puede usar- --squashdurante la compilación (requiere activar características experimentales).
 Además, eliminar archivos temporales y cachés en una sola capa:- RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
- Minimizar el 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 la construcción del Dockerfile 
 Usar compilaciones multi-etapa para que solo los archivos necesarios permanezcan en la imagen final.
 Copiar e instalar dependencias primero y luego copiar el código — esto mejora la caché de capas y acelera las reconstrucciones.
- Separar secretos y configuraciones 
 Nunca almacenar archivos- .env, claves API o certificados privados dentro de la imagen.
 Usar para la 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 manera 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 las capas de la imagen. 
- Docker sin root (Rootless) 
 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 
 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 el 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 el I/O:- 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 con CI/CD 
 Integrar construcción, pruebas y despliegue en GitHub Actions, GitLab CI, Jenkins pipelines.
 Ejemplo de paso en GitHub Actions:- - run: docker build -t myapp:${GITHUB_SHA} . - run: docker push myapp:${GITHUB_SHA}
- Registro y monitorización 
 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 escalado usar:- Docker Swarm
 
- Kubernetes 
 
- Docker Swarm
🐞 Depuración y Perfilado de Contenedores Docker
| Dominio | 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 su entorno aislado | |
| 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 un shell mínimo 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 registros del contenedor especificado, permitiendo ver la salida y eventos relacionados con su operación para diagnóstico y monitorización | |
| docker logs -f --tail 100 my_container | Ver las últimas 100 líneas de registros con transmisión en tiempo real | |
| docker logs my_container | Mostrar todos los registros disponibles del contenedor | |
| docker logs --since 1h my_container | Mostrar registros 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 JSON completa 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 espacios de nombres de otro proceso (aquí, el contenedor). Usado con stracepara rastrear llamadas al sistema dentro del contenedor durante la depuración | |
| nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1 | Entrar en los namespaces 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 un shell bash dentro de los 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 contenedores para diagnosticar problemas de red, analizar paquetes y monitorizar 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 un archivo para análisis posterior | |
| docker container stats | Muestra métricas actuales de uso de recursos (CPU, memoria, red, disco) de uno o varios contenedores en tiempo real | |
| docker stats my_container | Mostrar en tiempo real uso 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 la actividad del contenedor | |
| docker top my_container | Mostrar procesos ejecutándose dentro del contenedor | |
| docker top my_container aux | Usar formato alternativo de salida 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 en comparación con su imagen base, indicando archivos añadidos, modificados o eliminados | |
| docker diff my_container | Mostrar cambios en el sistema de archivos del contenedor respecto a 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 copias de seguridad | |
| — | — | — | 
| 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 se pueden usar
nsenter,strace,tcpdump,gdby otras herramientas de bajo nivel.
💼 Uso Avanzado de Docker Compose
🚀 Comandos Profesionales de Docker Compose
| Dominio | 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 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 los 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 en paralelo para acelerar el proceso | |
| docker compose build web | Construir solo la imagen del servicio  | |
| docker compose pull | Descarga las últimas versiones de imágenes del registro para todos o servicios específicos | |
| 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 | |
| docker compose restart | Reinicia todos o servicios específicos 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 | Ejecuta un comando dentro de un contenedor de servicio en ejecución con opción de modo interactivo | |
| docker compose exec db psql -U user -d database | Ejecutar psql dentro del contenedor del servicio  | |
| docker compose exec web sh | Abrir un shell dentro del contenedor  | |
| docker compose exec api curl http://localhost:8080 | Ejecutar una petición curl desde el contenedor del servicio  | |
| docker compose config | Muestra 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 | Reinicia automáticamente los servicios al cambiar 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, 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 la operación de servicios | |
| 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 ejecutándose dentro de contenedores de servicios | |
| docker compose top web | Mostrar procesos dentro de los 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 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- 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 archivos Compose. En su lugar, usar:- archivos .envpara variables de entorno (tener en cuenta que no están cifrados y no deben subirse a repos públicos)
 
- docker secrety- docker configpara secretos y configuraciones seguras 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 hasta 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, 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 frescas y se eliminen contenedores no utilizados 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.
 Tener 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 en Caliente de Código sin Volumen (Compose 2.22+) - develop: watch: - path: ./src action: sync target: /app
- Registro Centralizado de Servicios 
 Redirigir logs de contenedores a sistemas de monitorización y agregación como ELK Stack, Loki, Prometheus y Fluentd para análisis y alertas.
 Usar controladores de logging de Docker (- --log-driver) para habilitar recopilació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 el contenedor
 
- on-failure— reiniciar solo en fallos (opcional con número de reintentos)
 - En producción, - unless-stoppedes la mejor opción para garantizar resiliencia del servicio.
 Esto habilita recuperación automática de servicios tras fallos o reinicios del host.
- Perfiles de Servicios 
 Permite 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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| docker compose exec | Ejecuta un comando dentro de un servicio en ejecución, proporcionando acceso al contenedor o la ejecución de procesos individuales | |
| docker compose exec web sh | Abrir un 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 registros de servicios para diagnóstico y monitorización | |
| docker compose logs -f db | Ver registros del servicio  | |
| docker compose logs --tail=50 api | Mostrar las últimas 50 líneas de registros del servicio  | |
| docker compose logs --since=1h web | Mostrar registros 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 de servicios en ejecución | |
| docker stats $(docker compose ps -q worker) | Rastrear uso de CPU, memoria y otros recursos para el contenedor del servicio  | |
| docker compose run --rm | Ejecutar un contenedor temporal con la configuración del servicio, útil para depuración | |
| docker compose run --rm web sh | Iniciar un contenedor único 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 cómoda de configuraciones multi-servicio complejas, usar
docker compose run --rmpara lanzar contenedores individuales con redes y volúmenes necesarios sin afectar los servicios principales.
📚 Recursos adicionales
🚫 Ignorar archivos con .dockerignore
Añadir 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.
 
- Supervisa tamaños 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 oficial completa de referencia de comandos:
https://dockerlabs.collabnix.com/docker/cheatsheet/
📗 Docker Hub — imágenes y registros:
https://hub.docker.com/