ubuntu - cleanup - clean aufs docker
Error de Docker: no queda espacio en el dispositivo (17)
-
Limpiar imágenes
docker rmi $(docker images -f "dangling=true" -q)
- Eliminar volúmenes no deseados
- Eliminar imágenes no utilizadas
- Retire los contenedores no utilizados
Instalé docker en una máquina Debian 7 de la siguiente manera
$ echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
Después de eso, cuando intenté crear una imagen por primera vez, falló con el siguiente error
time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device"
Aquí está la información del acoplador
Containers: 2
Images: 21
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 25
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 2
Total Memory: 15.7 GiB
WARNING: No memory limit support
WARNING: No swap limit support
¿Cómo puedo aumentar la memoria? ¿Dónde se almacenan las configuraciones del sistema?
De las sugerencias de Kal:
Cuando me deshice de todas las imágenes y contenedores, liberó algo de espacio y la construcción de la imagen funcionó más tiempo antes de fallar con el mismo error. Entonces, la pregunta es, ¿a qué espacio se refiere esto y cómo lo configuro?
Como ya fue mencionado,
docker image prune [-af if you want to force remove all images]
ayuda, pero con Docker 17.06.1 y posterior sin recortar volúmenes no utilizados. Desde Docker 17.06.1, el siguiente comando también elimina los volúmenes:
docker rm $(docker ps -q -f ''status=exited'')
docker rmi $(docker images -q -f "dangling=true")
De la documentación de Docker: https://docs.docker.com/config/pruning/
El comando de poda del sistema docker es un acceso directo que poda imágenes, contenedores y redes. En Docker 17.06.0 y versiones anteriores, los volúmenes también se podan. En Docker 17.06.1 y versiones posteriores, debe especificar el indicador --volumes para la poda del sistema docker para podar volúmenes.
Si desea podar volúmenes y conservar imágenes y contenedores:
docker system prune
Compruebe que tiene espacio libre en / var, ya que aquí es donde Docker almacena los archivos de imagen de forma predeterminada (en / var / lib / docker).
Primero limpie las cosas usando
docker ps -a
para enumerar todos los contenedores (incluidos los detenidos) y
docker rm
para eliminarlos;
luego use
docker images
para enumerar todas las imágenes que ha almacenado y
docker rmi
para eliminarlas.
Luego, cambie la ubicación de almacenamiento con una opción -g en el demonio docker o editando
/etc/default/docker
y agregando la opción
-g
a
DOCKER_OPTS
.
-g
especifica la ubicación del "tiempo de ejecución de Docker", que es básicamente todo lo que Docker crea a medida que construye imágenes y ejecuta contenedores.
Elija una ubicación con mucho espacio ya que el espacio en disco utilizado tenderá a crecer con el tiempo.
Si edita
/etc/default/docker
, deberá reiniciar el demonio docker para que el cambio surta efecto.
Ahora debería poder crear una nueva imagen (o extraer una de Docker Hub) y debería ver un montón de archivos que se crean en el directorio que especificó con la opción -g.
Docker deja imágenes colgantes alrededor que pueden ocupar tu espacio. Para limpiar después de Docker, ejecute lo siguiente:
docker system prune --volumes
o con versiones anteriores de Docker:
docker volume prune
Esto eliminará las imágenes salidas y colgantes, lo que con suerte despejará el espacio del dispositivo.
Ejecuto los siguientes comandos.
No hay necesidad de reconstruir imágenes después.
docker rm $(docker ps -qf ''status=exited'') docker rmi $(docker images -qf "dangling=true") docker volume rm $(docker volume ls -qf dangling=true)
Estos eliminan los contenedores salidos / colgantes y los volúmenes colgantes.
En mi caso, la instalación de ubuntu-server 18.04.1 [por alguna extraña razón] creó un volumen lógico LVM con solo 4 GB de tamaño en lugar de 750 GB. Por lo tanto, al extraer imágenes, me daría este error "no queda espacio en el dispositivo". La solución es simple:
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
Limpie Docker utilizando el siguiente comando:
docker images --no-trunc | grep ''<none>'' | awk ''{ print $3 }'' /
| xargs docker rmi
Para mí
docker system prune
hizo el truco.
Estoy ejecutando mac os.
Parece que hay algunas maneras en que esto puede ocurrir. El problema que tuve fue que la imagen del disco acoplable había alcanzado su tamaño máximo (Docker Whale -> Preferencias -> Disco si desea ver qué tamaño tiene OSX).
Subí el límite y ya estaba listo. Estoy seguro de que limpiar las imágenes no utilizadas también funcionaría.
Si es solo una instalación de prueba de Docker (es decir, no producción) y no le importa hacer una limpieza nuclear, puede:
limpiar todos los contenedores:
docker ps -a | sed ''1 d'' | awk ''{print $1}'' | xargs -L1 docker rm
docker ps -a | sed ''1 d'' | awk ''{print $1}'' | xargs -L1 docker rm
limpiar todas las imágenes:
docker images -a | sed ''1 d'' | awk ''{print $3}'' | xargs -L1 docker rmi -f
docker images -a | sed ''1 d'' | awk ''{print $3}'' | xargs -L1 docker rmi -f
Una vez más, uso esto en mis instancias ec2 cuando desarrollo Docker, no en ninguna ruta de control de calidad o producción seria.
Lo mejor es que si tiene su Dockerfile (s), es fácil de reconstruir y / o
docker pull
.
Si está utilizando la imagen boot2docker a través de Docker Toolkit, el problema se debe al hecho de que la máquina virtual boot2docker se ha quedado sin espacio.
Cuando importa una
docker import
o agrega una nueva imagen, la imagen se copia en
/mnt/sda1
que podría haberse llenado.
Una forma de verificar qué espacio tiene disponible en la imagen, es ssh en el vm y ejecutar
df -h
y verificar el espacio restante en / mnt / sda1
El comando ssh es
docker-machine ssh default
Una vez que esté seguro de que realmente es un problema de espacio, puede limpiar según las instrucciones de algunas de las respuestas a esta pregunta, o puede elegir cambiar el tamaño de la imagen boot2docker, aumentando el espacio en
/mnt/sda1
Puede seguir las instrucciones aquí para cambiar el tamaño de la imagen https://gist.github.com/joost/a7cfa7b741d9d39c1307
Sus cgroups tienen habilitado el controlador
cpuset
.
Este controlador es principalmente útil en un entorno NUMA donde permite especificar con precisión qué CPU / banco de memoria pueden ejecutar sus tareas.
Por defecto, los
cpuset.mems
y
cpuset.cpus
obligatorios no están configurados, lo que significa que "no queda espacio" para su tarea, de ahí el error.
La forma más fácil de solucionar esto es habilitar
cgroup.clone_children
en 1 en el cgroup raíz.
En su caso, debería ser
lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
Básicamente le indicará al sistema que inicialice automáticamente
cpuset.mems
y
cpuset.cpus
del
cpuset.cpus
desde su cgroup principal.
También encontré este problema en la máquina RHEL. No encontré ninguna solución adecuada en ninguna parte de la comunidad de desbordamiento de pila y docker-hub. Si enfrenta este problema incluso después del siguiente comando:
podar sistema docker --todos
La solución que finalmente funcionó:
-
información del acoplador
- Para comprobar el controlador de almacenamiento de la ventana acoplable actual
- La mía fue: Driver de almacenamiento: devicemapper; Si tiene un controlador de almacenamiento como overlay2, no debe preocuparse. La solución seguirá funcionando para usted.
-
df -h
- Esto es para verificar los sistemas de archivos disponibles en la máquina y la ruta donde están montados. Dos rutas montadas para tener una nota:
- / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16% / var
- / dev / mapper / rootvg-apps 60G 9.2G 48G 17% / apps
- Nota - Por defecto, la ruta de almacenamiento de la ventana acoplable es / var / lib / docker. Tiene espacio disponible ~ 6 GB y, por lo tanto, todos los problemas relacionados con el espacio. Básicamente, tengo que mover el almacenamiento predeterminado a otro almacenamiento donde el espacio disponible es mayor. Para mí, la ruta del archivo sysyem ''/ dev / mapper / rootvg-apps'' que está montada en / apps. Ahora la tarea es mover / var / lib / docker a algo como / apps / newdocker / docker.
- mkdir / apps / newdocker / docker
- chmod -R 777 / apps / newdocker / docker
-
Actualice el archivo docker.serive en Linux que se encuentra en: / usr / lib / systemd / system
- vi /usr/lib/systemd/system/docker.service
-
si el dispositivo de almacenamiento es mapeador de dispositivos, comente la línea ExecStart existente y agregue a continuación en [Servicio]:
- ExecStart =
- ExecStart = / usr / bin / dockerd -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.basesize = 40GB -g / apps / newdocker / docker --exec-opt native.cgroupdriver = cgroupfs
-
O si el dispositivo de almacenamiento está superpuesto2:
- simplemente agregue -g / apps / newdocker / docker en la declaración ExexStart existente.
- Algo así como ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd: // --containerd = / run / containerd / containerd.sock
- rm -rf / var / lib / docker (eliminará todos los datos existentes de la ventana acoplable)
- systemctl stop docker
-
ps aux |
grep -i docker |
grep -v grep
- Si el comando anterior no ha producido ninguna salida, vuelva a cargar el demonio systemd mediante el siguiente comando.
- systemctl daemon-reload
- systemctl start docker
-
información del acoplador
- Consulte el espacio de datos disponible: 62.15 GB después de enrutar a la ventana acoplable al nuevo sistema de archivos.
- HECHO
Tuve el mismo error y lo solucioné de esta manera:
1) Elimine los volúmenes huérfanos en Docker, puede usar el comando incorporado de volumen docker. El comando incorporado también elimina cualquier directorio en / var / lib / docker / volume que no sea un volumen, así que asegúrese de no poner nada allí que desee guardar.
Advertencia, tenga mucho cuidado con esto si tiene algunos datos que desea conservar
Limpiar:
$ docker volume rm $(docker volume ls -qf dangling=true)
Comandos adicionales:
Lista de volúmenes colgantes:
$ docker volume ls -qf dangling=true
Listar todos los volúmenes:
$ docker volume ls
2) También considere eliminar todas las imágenes no utilizadas.
Primero, elimine las imágenes
<none>
(a veces se generan mientras se crea una imagen y si por alguna razón la construcción de la imagen se interrumpió, permanecen allí).
aquí hay un buen script que uso para eliminarlos
docker rmi $(docker images | grep ''^<none>'' | awk ''{print $3}'')
Luego, si está utilizando Docker Compose para crear imágenes localmente para cada proyecto.
Terminará con muchas imágenes generalmente nombradas como su carpeta (por ejemplo, si su carpeta de proyecto llamada Hello, encontrará las imágenes con el nombre
Hello_blablabla
).
así que también considera eliminar todas estas imágenes
puede editar el script anterior para eliminarlos o eliminarlos manualmente con
docker rmi {image-name}
para eliminar todos los contenedores, volúmenes, redes e imágenes no utilizados a la vez ( https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands ):
docker system prune -a -f
Si no es suficiente, primero se pueden eliminar los contenedores en ejecución:
docker rm -f $(docker ps -a -q)
docker system prune -a -f
aumentar / var / lib / docker o usar otra ubicación con más espacio también es una buena alternativa para deshacerse de este error (consulte ¿Cómo cambiar el directorio de instalación de la imagen del acoplador? )
también puedes usar:
docker system prune
o solo para volúmenes:
docker volume prune
ACTUALIZAR
Los comandos a continuación se han convertido en hacks a medida que Docker se vuelve más desarrollado.
La mejor práctica actual es
docker system prune
Esto eliminará:
- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images
Como a continuación, esto es nuclear.
Para limpiar su sistema, primero retire los contenedores
$ docker rm $(docker ps -aq)
luego elimine las imágenes
$ docker rmi $(docker images -q)
Por supuesto, esto es nuclear y eliminará todos los contenedores y todas las imágenes.
Puede eliminarlos uno a la vez a través de
docker rm #CONTAINER_ID#
y
docker rmi #IMAGE_ID
.