Al trabajar con Docker es fácil acumular contenedores detenidos que ocupan espacio en disco sin aportar valor. Cada vez que se ejecuta docker run sin el flag --rm, el contenedor queda registrado en el sistema aunque haya terminado su ejecución. Con el tiempo, esa acumulación ralentiza los comandos de listado y consume espacio innecesario.
docker rm es el comando para eliminar contenedores. Esta guía cubre todas sus opciones: desde eliminar un contenedor individual hasta limpiar por completo el entorno Docker.
Para entender el ciclo de vida completo de los contenedores donde encaja docker rm, el artículo sobre qué es Docker explica la arquitectura de contenedores e imágenes desde los fundamentos.
Sintaxis básica de docker rm
La forma más simple de usar docker rm es pasar el nombre o el ID del contenedor:
# Eliminar por nombre
docker rm mi-contenedor
# Eliminar por ID (sirven los primeros caracteres del ID)
docker rm a3f5c8e9d2b1
docker rm a3f5
Si el contenedor está en ejecución, Docker devuelve un error:
Error response from daemon: cannot remove container "/mi-contenedor":
container is running: stop the container before removing or force remove
Para eliminarlo hay que detenerlo primero o usar el flag -f.
Opciones principales de docker rm
| Opción | Función |
|---|---|
-f / --force |
Fuerza la eliminación aunque el contenedor esté en ejecución. Lo detiene y elimina en una sola operación. |
-v / --volumes |
Elimina también los volúmenes anónimos asociados al contenedor. Los volúmenes nombrados no se eliminan. |
-l / --link |
Elimina el enlace especificado entre contenedores (legacy networking). |
Forzar la eliminación de un contenedor en ejecución

🔴 ¿Quieres entrar de lleno al mundo DevOps & Cloud Computing? 🔴
Descubre el DevOps & Cloud Computing Full Stack Bootcamp de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada
👉 Prueba gratis el Bootcamp en DevOps & Cloud Computing por una semanaEl flag -f elimina el contenedor aunque esté corriendo, enviando una señal SIGKILL al proceso principal:
# Forzar eliminación de un contenedor en ejecución
docker rm -f mi-contenedor
# Equivalente a:
docker stop mi-contenedor && docker rm mi-contenedor
La diferencia entre los dos enfoques es importante en producción. docker stop envía primero SIGTERM al proceso, esperando 10 segundos para que se cierre limpiamente antes de forzar con SIGKILL. docker rm -f envía SIGKILL directamente, sin tiempo de gracia.
Para aplicaciones que necesitan guardar estado o cerrar conexiones limpiamente (bases de datos, por ejemplo), es mejor hacer docker stop explícito antes que forzar con -f.
Eliminar múltiples contenedores a la vez
Se pueden pasar varios nombres o IDs separados por espacios:
# Eliminar varios contenedores a la vez
docker rm contenedor1 contenedor2 contenedor3
# Eliminar todos los contenedores detenidos de una vez (método clásico)
docker rm $(docker ps -a -q)
# Solo los contenedores con estado exited
docker rm $(docker ps -a -f status=exited -q)
El subshell $(docker ps -a -q) devuelve todos los IDs de los contenedores. Pasado a docker rm los elimina todos en una sola operación. Si alguno está en ejecución, el comando devuelve error para ese contenedor pero sigue eliminando el resto.
Eliminar un contenedor con sus volúmenes asociados
Por defecto, docker rm no elimina los volúmenes asociados al contenedor. El flag -v los incluye:
# Eliminar contenedor y sus volúmenes anónimos
docker rm -v mi-contenedor
# Forzar y eliminar volúmenes
docker rm -fv mi-contenedor
Es importante saber que el flag -v solo elimina volúmenes anónimos (los creados automáticamente por Docker sin nombre explícito). Los volúmenes nombrados (creados con docker volume create o con nombre en el docker-compose.yml) no se eliminan con docker rm -v y hay que borrarlos manualmente con docker volume rm.
El flag –rm en docker run: eliminación automática
Para contenedores que se usan una sola vez y no necesitan conservarse, el flag --rm en docker run elimina el contenedor automáticamente cuando el proceso principal termina:
# El contenedor se elimina automáticamente al terminar
docker run --rm ubuntu echo "Hola desde Docker"
# Ejecutar un script y limpiar automáticamente
docker run --rm -v $(pwd):/app python:3.12-slim python /app/script.py
# Test de una imagen sin dejar rastro
docker run --rm miapp:latest npm test
Es especialmente útil para tareas puntuales: ejecutar un script, hacer un test, probar un comando. El contenedor no se acumula en el sistema después de la ejecución.
Para ver cómo integrar esto en flujos de despliegue locales, el artículo sobre despliegue de aplicaciones locales con Docker cubre la gestión completa del ciclo de vida.
Limpiar el entorno Docker: prune y system prune
Cuando la acumulación de contenedores, imágenes y volúmenes no usados se convierte en un problema de espacio, Docker tiene comandos de limpieza masiva.
docker container prune: eliminar todos los contenedores detenidos
# Eliminar todos los contenedores detenidos (pide confirmación)
docker container prune
# Sin confirmación (para scripts)
docker container prune -f
# Salida típica:
# Deleted Containers:
# a3f5c8e9d2b14f7a
# b5c7d9e1f3a5c7e9
# Total reclaimed space: 245MB
docker system prune: limpieza completa del entorno
# Eliminar contenedores detenidos, redes sin usar, imágenes huérfanas y caché de build
docker system prune
# Incluir también imágenes sin usar (no solo las huérfanas)
docker system prune -a
# Incluir además volúmenes
docker system prune -a --volumes
# Sin confirmación
docker system prune -af
Comparativa de comandos de limpieza
| Comando | Qué elimina |
|---|---|
docker rm nombre |
Un contenedor específico detenido |
docker rm -f nombre |
Un contenedor (aunque esté en ejecución) |
docker container prune |
Todos los contenedores detenidos |
docker image prune |
Imágenes sin etiqueta (huérfanas) |
docker volume prune |
Volúmenes no usados por ningún contenedor |
docker network prune |
Redes no usadas por ningún contenedor |
docker system prune |
Contenedores detenidos + redes sin usar + imágenes huérfanas + caché de build |
docker system prune -a |
Todo lo anterior + imágenes sin usar por ningún contenedor activo |
Diferencia entre docker rm y docker rmi
Es una fuente de confusión frecuente, especialmente cuando se empieza con Docker.
Elimina contenedores: las instancias creadas a partir de una imagen. Un contenedor es la aplicación en ejecución o detenida. Eliminar el contenedor no afecta a la imagen de la que se creó.
Elimina imágenes: las plantillas de solo lectura desde las que se crean los contenedores. No se puede eliminar una imagen si hay algún contenedor (aunque esté detenido) que se creó a partir de ella.
# Flujo completo: eliminar contenedor y luego la imagen
docker stop mi-contenedor
docker rm mi-contenedor
docker rmi miapp:latest
# Verificar que no quedan contenedores usando la imagen antes de eliminarla
docker ps -a --filter ancestor=miapp:latest
Errores frecuentes con docker rm
Estos son los errores más habituales y cómo resolverlos:
# Error: contenedor en ejecución
# Error: cannot remove container: container is running
# Solución: detenerlo primero o usar -f
docker stop mi-contenedor && docker rm mi-contenedor
# Error: contenedor no existe
# Error: No such container: nombre
# Verificar con docker ps -a que el nombre es correcto
docker ps -a
# Error: imagen en uso al intentar docker rmi
# Error: conflict: unable to delete image: image has dependent child images
# Solución: eliminar primero todos los contenedores que usan esa imagen
docker rm $(docker ps -a -f ancestor=miapp:latest -q)
docker rmi miapp:latest
Esther llegó al Bootcamp DevOps de KeepCoding desde la psicología y los recursos humanos. Aprendió Docker desde cero: no solo los comandos, sino el modelo mental de cómo funcionan los contenedores, las imágenes y el ciclo de vida completo.
Hoy trabaja como DevOps Engineer en un proyecto bancario de gran escala. Gestionar el ciclo de vida de los contenedores y mantener el entorno limpio son tareas del día a día en ese tipo de rol. Lo más valioso del bootcamp fue aprender con proyectos reales desde el primer módulo.
Cómo aprender Docker a nivel profesional

Gestionar el ciclo de vida de los contenedores, entender cuándo eliminar un contenedor de forma limpia versus forzada, y mantener el entorno Docker organizado son habilidades que se desarrollan con la práctica en proyectos reales.
La diferencia entre un desarrollador que usa Docker y un profesional DevOps que lo opera en producción está en ese tipo de criterio operativo.
Para aprender a operar Docker con proyectos reales y profesores en activo, el DevOps y Cloud Computing Full Stack Bootcamp de KeepCoding cubre el recorrido completo en 6 meses.
Conclusión

docker rm es el comando esencial para mantener el entorno Docker limpio. La acumulación de contenedores detenidos sin eliminar es uno de los problemas más comunes en equipos que usan Docker sin una política de limpieza establecida. DevOps y Cloud Computing Full Stack Bootcamp de KeepCoding.
La combinación de --rm en docker run para contenedores de un solo uso, docker container prune para limpiar periódicamente los detenidos y docker system prune para limpiezas más profundas cubre la mayor parte de las necesidades de gestión del ciclo de vida de los contenedores en cualquier entorno de trabajo.
La referencia oficial de docker rm con todas sus opciones está en docs.docker.com/reference/cli/docker/container/rm/.



