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