🐳 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 comoalpineoscratchpara 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 soloRUNpara 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:$PATHVerificar:
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_imageO la nueva CLI:
docker scout cves my_imageEsto 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 myimageEsto 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 usandodocker-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 (with strace) |
Utilidad de Linux para entrar en los espacios de nombres de otro proceso (aquí, el contenedor). Se usa con strace para 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 ps en 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 archivosdocker-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 -dUsar 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 secretydocker 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_onyhealthcheck
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_healthyMinimizar tiempo de inactividad durante actualizaciones
Antes de actualizar servicios, ejecutar:docker compose pull && docker compose up -d --remove-orphansLa 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-orphansEsto 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
Usarvolumespara 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: /appRegistro 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 endocker-compose.yml:restart: unless-stoppedOtras 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/