tag - Cómo quitar los viejos contenedores Docker




hub run (25)

Siempre utilizo docker rmi $(docker ps -a -q) para eliminar todas las imágenes.

Puede eliminar el directorio /var/lib/docker/graph cuando el docker rmi falló.

Esta pregunta está relacionada con ¿Debería preocuparme el exceso de contenedores Docker que no se ejecutan? .

Me pregunto cómo quitar los contenedores viejos. La docker rm 3e552code34a permite eliminar una sola, pero ya tengo muchas. docker rm --help no da una opción de selección (como todas, o por nombre de imagen).

Tal vez hay un directorio en el que se almacenan estos contenedores donde puedo eliminarlos fácilmente de forma manual.


Ahora es posible utilizar el filtering con el docker ps :

docker rm $(docker ps -q -f status=exited)

Y para las images :

docker rmi $(docker images -q -f "dangling=true")

Sin embargo, cualquiera de ellos provocará que docker rm o docker rmi un error cuando no haya contenedores coincidentes. El truco anterior docker rm $(docker ps -aq) fue aún peor, ya que trató de eliminar cualquier contenedor en ejecución, fallando en cada uno.

Aquí hay un script más limpio para agregar en tu ~/.bashrc o ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Edición: como se indica a continuación, la respuesta original fue para eliminar imágenes, no contenedores. Actualizado para responder a ambos, incluyendo nuevos enlaces a la documentación. Gracias a Adrian (y la respuesta de Ryan) por mencionar el nuevo filtro de ps .


Retire todos los contenedores detenidos.

sudo docker rm $ (sudo docker ps -a -q)

Esto eliminará todos los contenedores detenidos al obtener una lista de todos los contenedores con la ventana acoplable ps -a -q y pasar sus identificadores a la ventana acoplable. Esto no debería eliminar ningún contenedor en ejecución, y le dirá que no puede eliminar una imagen en ejecución.

Eliminar todas las imágenes sin etiquetar

Ahora desea limpiar las imágenes antiguas para ahorrar algo de espacio.

sudo docker rmi $ (imágenes de sudo docker -q --filter "dangling = true")


Puede eliminar solo los contenedores detenidos. Detenlos todos al principio

docker stop $(docker ps -a -q)

A continuación, puede eliminar

docker rm $(docker ps -a -q)


Retire todos los contenedores detenidos:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Del comentario de pauk960 :

Desde la versión 1.3.0 puede usar filtros con la docker ps , en lugar de grep Exited use la grep Exited docker ps -a -f status=exited . Y si usa -q con él, puede obtener ID de contenedor solo en lugar de la salida completa, sin necesidad de usar awk para eso.


Eliminando todos los contenedores del shell de Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Si no desea eliminar todos los contenedores, puede seleccionar todos los contenedores creados antes o después de un contenedor específico con docker ps --before <container-ID> o con docker ps --since <container-ID> . Esta característica está al menos en la versión 0.6.5 de Docker.

Digamos que usted ha desarrollado su sistema, y ​​ahora está funcionando, pero quedan varios contenedores. Desea eliminar los contenedores creados antes de esa versión de trabajo. Determine la ID del contenedor de trabajo con la docker ps .

Retire los contenedores creados antes que otro contenedor.

docker rm $(docker ps --before 9c49c11c8d21 -q)

Otro ejemplo. Ya tienes tu base de datos ejecutándose en un contenedor Docker. Ha desarrollado su aplicación para ejecutarse en otro contenedor y ahora tiene una cantidad de contenedores innecesarios.

Eliminar los contenedores creados después de un determinado contenedor.

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker almacena contenedores en /var/lib/docker/containers en Ubuntu. Creo que los contenedores adicionales no hacen ningún otro daño, pero ocupan espacio en el disco.


Retire los 5 contenedores más antiguos:

docker rm `docker ps -aq | tail -n 5`

Vea cuántos contenedores quedan:

docker ps -aq | wc -l

Para remover TODOS los recipientes sin llanto:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

Otro método, que obtuve de Guillaume J. Charmes (crédito donde se debe):

docker rm `docker ps --no-trunc -aq`

Se eliminarán todos los contenedores de una manera elegante.

Y por Bartosz Bilicki, para Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Para PowerShell:

docker rm @(docker ps -aq)

Una actualización con Docker 1.13 (Q4 2016), crédito para VonC ( más adelante en este hilo ):

docker system prune eliminará TODOS los datos no utilizados (es decir, en orden: contenedores detenidos, volúmenes sin contenedores e imágenes sin contenedores).

Vea PR 26108 y commit 86de7c0 , que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de la cantidad de espacio que los datos del demonio Docker están tomando en el disco y permiten limpiar fácilmente el exceso "innecesario".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Aquí está mi script de docker-cleanup , que elimina contenedores e imágenes sin etiquetar. Por favor, consulte la fuente para las actualizaciones.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Fuente: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


La forma oficial es:

docker rm `docker ps -aq`

Los mantenedores de Docker han indicado que no habrá ningún comando para esto, y usted compone los comandos así:

Hemos discutido esto antes y preferimos que los usuarios usen la línea anterior sin tener que agregar código adicional a Docker.


Hay una nueva característica en Docker 1.13.x llamada poda de contenedor Docker : docker container prune

Esto hará lo que quieras y debería funcionar en todas las plataformas de la misma manera.

También hay una poda del sistema Docker : docker system prune , que limpiará contenedores, imágenes, volúmenes y redes, todo en un solo comando.

Respuesta original:

Se ha hablado un poco sobre un comando de limpieza de Docker. Puede encontrar la información en este ticket: Implementar un comando 'limpiar' (# 928)

Hasta que ese comando esté disponible, puede enlazar los comandos de Docker junto con otros comandos de Unix para obtener lo que necesita. Aquí hay un ejemplo sobre cómo limpiar los contenedores viejos que tienen semanas de antigüedad:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Para dar crédito, cuando sea necesario, este ejemplo es de https://twitter.com/jpetazzo/status/347431091415703552 .


#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done

Para cualquier persona interesada, tomé el ejemplo de qkrijger y lo convertí en un claro todo (detener y eliminar todo)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

docker rm --force `docker ps -qa`

Actualización: A partir de la versión 1.13 de Docker (lanzada en enero de 2017), puede emitir el siguiente comando para limpiar los contenedores detenidos, los volúmenes no utilizados, las imágenes colgantes y las redes no utilizadas:

docker system prune

Si desea asegurarse de que solo está eliminando contenedores que tienen un estado de exited , use esto:

docker ps -aq -f status=exited | xargs docker rm

De manera similar, si está limpiando cosas de la ventana acoplable, puede deshacerse de las imágenes sin etiquetar y sin nombre de esta manera:

docker images -q --no-trunc -f dangling=true | xargs docker rmi

Respuesta actualizada Use docker system prune docker container prune o docker container prune ahora. Ver la respuesta actualizada de VonC .

Respuesta anterior Al componer varios consejos diferentes arriba, la forma más elegante de eliminar todos los contenedores que no se ejecutan parece ser:

docker rm $(docker ps -q -f status=exited)

  • -q imprime solo los identificadores del contenedor (sin encabezados de columna)
  • -f permite filtrar su lista de contenedores impresos (en este caso, estamos filtrando para mostrar solo los contenedores salidos)

https://github.com/HardySimpson/docker-cleanup

Limpieza de la plataforma

Una pequeña carcasa todo en uno, que elimina:

  • Contenedores que no se ejecutan hace más de un día.
  • Imágenes que no pertenecen a ningún contenedor restante.

La intención de ejecutar como un trabajo crontab

Característica

  • Se eliminarán todas las imágenes <none>:<none>
  • Si la imagen tiene varias referencias de etiqueta de repo: a ella, eliminará todas las etiquetas de repo: excepto con la ejecución de un contenedor. En realidad, es una naturaleza de "docker rmi".
  • Se mostrarán muchos mensajes de error en la pantalla, y puede decidir si desea 2>/dev/null o no
  • Aprende algo de docker-gc y resuelve su problema (no puede eliminar la imagen que tiene la etiqueta de repo: mutliple)


  1. Eliminar todos los procesos de la ventana acoplable:

    docker rm $(docker ps -a -q)
    
  2. Retire el contenedor específico:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    

Con Docker 1.13 (Q4 2016), ahora tiene:

docker system prune -a eliminará TODOS los datos no utilizados (es decir, en orden: contenedores detenidos, volúmenes sin contenedores e imágenes sin contenedores).

docker system prune sin -a eliminará (para las imágenes) solo las imágenes colgantes, o las imágenes sin etiqueta, como lo commented smilebomb .

Vea PR 26108 y commit 86de7c0 , que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de la cantidad de espacio que los datos del demonio Docker están tomando en el disco y permiten limpiar fácilmente el exceso "innecesario".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Como wjv comenta,

También hay una docker {container,image,volume,network} prune , que se puede usar para eliminar las instancias no utilizadas de un solo tipo de objeto.

Presentado en commit 913e5cb , solo para Docker 1.13+.

docker container prune

Pruebe este comando para limpiar los contenedores y las imágenes colgantes.

docker system prune -f

Los pasos básicos para detener / eliminar todos los contenedores e imágenes.

  1. Listar todos los contenedores

    docker ps -aq

  2. Detener todos los contenedores en ejecución

    docker stop $(docker ps -aq)

  3. Quitar todos los contenedores

    docker rm $(docker ps -aq)

  4. Eliminar todas las imagenes

    docker rmi $(docker images -q)

Nota: Primero debe detener todos los contenedores en ejecución antes de eliminarlos. Además, antes de eliminar una imagen, debe detener y eliminar sus contenedores dependientes.


Ambos son muy diferentes. Docker es liviano y usa LXC / libcontainer (que se basa en el espacio de nombres del kernel y cgroups) y no tiene emulación de máquina / hardware como el hipervisor, KVM. Los xen que son pesados.

Docker y LXC están diseñados para el uso de espacios aislados, la contenedorización y el aislamiento de recursos. Utiliza la API de clonación del sistema operativo host (actualmente solo kernel de Linux) que proporciona espacios de nombres para IPC, NS (montaje), red, PID, UTS, etc.

¿Qué pasa con la memoria, E / S, CPU, etc.? Esto se controla mediante cgroups donde puede crear grupos con cierta especificación / restricción de recursos (CPU, memoria, etc.) y colocar sus procesos allí. Además de LXC, Docker proporciona un backend de almacenamiento ( http://www.projectatomic.io/docs/filesystems/ ), por ejemplo, un sistema de archivos de montaje de unión donde puede agregar capas y compartir capas entre diferentes espacios de nombres de montaje.

Esta es una característica poderosa donde las imágenes base son típicamente de solo lectura y solo cuando el contenedor modifica algo en la capa escribirá algo en la partición de lectura-escritura (también conocido como copia en escritura). También proporciona muchos otros envoltorios, como el registro y el control de versiones de las imágenes.

Con el LXC normal, debe venir con algunos rootfs o compartir los rootfs y cuando se comparte, y los cambios se reflejan en otros contenedores. Debido a muchas de estas características agregadas, Docker es más popular que LXC. LXC es popular en entornos integrados para implementar la seguridad en procesos expuestos a entidades externas como la red y la interfaz de usuario. Docker es popular en entornos de múltiples tenencias en la nube donde se espera un entorno de producción consistente.

Una VM normal (por ejemplo, VirtualBox y VMware) utiliza un hipervisor, y las tecnologías relacionadas tienen un firmware dedicado que se convierte en la primera capa para el primer sistema operativo (sistema operativo host o sistema operativo invitado 0) o un software que se ejecuta en el sistema operativo host para proporcionar emulación de hardware como CPU, USB / accesorios, memoria, red, etc., a los sistemas operativos invitados. Las máquinas virtuales siguen siendo populares (a partir de 2015) en un entorno multiusuario de alta seguridad.

Docker / LXC casi se puede ejecutar en cualquier hardware barato (menos de 1 GB de memoria también está bien, siempre y cuando tenga un kernel más nuevo) en comparación con las máquinas virtuales normales, se necesitan al menos 2 GB de memoria, etc., para hacer algo significativo. . Pero el soporte de Docker en el sistema operativo host no está disponible en sistemas operativos como Windows (a partir de noviembre de 2014), donde pueden ejecutarse tipos de máquinas virtuales en Windows, Linux y Mac.

Aquí hay una foto de docker / rightscale:





docker