도커 오류 : 장치에 남은 공간이 없습니다.


329

다음과 같은 방법으로 데비안 7 컴퓨터에 도커를 설치했습니다.

$ 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

그 후 처음 이미지를 만들려고 할 때 다음 오류로 실패했습니다.

 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"

도커 정보는 다음과 같습니다.

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

메모리를 늘리려면 어떻게해야합니까? 시스템 구성은 어디에 저장됩니까?

칼의 제안에서 :

모든 이미지와 컨테이너를 제거하면 약간의 여유 공간이 생겼으며 동일한 오류로 실패하기 전에 이미지 빌드가 더 오래 실행되었습니다. 문제는 이것이 어느 공간을 참조하며 어떻게 구성합니까?


1
때로는 스토리지 백엔드에 따라 컨테이너 당 크기 제한에 도달 할 수 있습니다 . 이 링크는 devicemapper에 대한 수정 방법을 보여줍니다.
jpaugh

4
디스크에 inode가 없을 때이 오류가 발생했습니다. 확인df -ih
Kevin Smyth

@KevinSmyth 이것을 지적 해 주셔서 감사합니다. 나는 이것이 전에 inode 한계의 중요성에 대해 알지 못했습니다.
yosefrow

답변:


337

나는 같은 오류가 있었고 이런 식으로 해결했다.

1 . Docker에서 고아 볼륨을 삭제하면 내장 docker volume 명령을 사용할 수 있습니다. 내장 명령은 또한 볼륨이 아닌 / var / lib / docker / volumes의 디렉토리를 삭제하므로 저장하려는 항목이 없는지 확인하십시오.

보관하려는 데이터가있는 경우이 점에 매우주의하십시오.

대청소:

$ docker volume rm $(docker volume ls -qf dangling=true)

추가 명령 :

매달린 볼륨 목록 :

$ docker volume ls -qf dangling=true

모든 볼륨을 나열하십시오.

$ docker volume ls

2. 또한 사용하지 않은 이미지를 모두 제거하십시오.

먼저 <none>이미지를 제거하십시오 ( 이미지를 빌드하는 동안 생성되는 이미지가 있으며 어떤 이유로 이미지 빌드가 중단 된 경우 이미지가 그대로 유지됨).

여기에 그것들을 제거하는 데 사용되는 멋진 스크립트가 있습니다.

docker rmi $(docker images | grep '^<none>' | awk '{print $3}')

그런 다음 Docker Compose를 사용하여 모든 프로젝트에 대해 로컬로 이미지를 빌드하십시오. 일반적으로 폴더와 같은 이름의 이미지가 많이 생성됩니다 (예 : 프로젝트 폴더가 Hello 인 경우 이미지 이름 Hello_blablabla). 또한이 이미지들을 모두 제거해보십시오

위의 스크립트를 편집하여 제거하거나 수동으로 제거 할 수 있습니다

docker rmi {image-name}


23
참고 사항 : Mac의 awk 명령은 큰 따옴표가 아닌 작은 따옴표로 묶어야합니다. 그렇지 않으면 무시됩니다.
ndtreviv

2
나는 MAC에 있고 나를 위해 일하고있다! 그러나 조언에 감사드립니다.
Mahmoud Zalt 2016 년

2
얼마나 이상해! 그것은 나를 위해 작동하지 않습니다. grep과 동일한 결과를 인쇄합니다. 아 잘 낯선 일이 일어났습니다.
ndtreviv 2016 년

3
이때 이미지에 동일한 필터를 사용할 수 있습니다. docker images -qf dangling=true물론로 제거하십시오 docker rmi $(docker images -qf dangling=true).
Tyler Jones

3
오류가 발생합니다. "docker volume rm"에는 적어도 1 개의 인수가 필요합니다.
IgorGanapolsky

330

업데이트
Docker가 더 발전함에 따라 아래 명령이 해킹되었습니다. 현재 모범 사례는

docker system prune

제거됩니다 :

- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images

아래에서와 같이 이것은 핵입니다.


시스템을 청소하려면 먼저 용기를 제거하십시오

$ docker rm $(docker ps -aq)

그런 다음 이미지를 제거하십시오

$ docker rmi $(docker images -q)

이것은 물론 핵이며 모든 컨테이너와 모든 이미지를 제거합니다. 당신은을 통해 한 번에 그들을 하나를 제거 할 수 있습니다 docker rm #CONTAINER_ID#docker rmi #IMAGE_ID.


2
Kevin Smyth가 지적했듯이이 오류는에서 볼 수있는 inode가 부족하기 때문일 수 있습니다 df -ih. 더 외과 적으로 진단하려면 입력 ncdu한 다음 c를 눌러 파일 개수를, C를 눌러 파일 개수를 기준으로 정렬하여 모든 inode를 어떻게 사용하고 있는지 대략적으로 추정하십시오. 문제가 실제로 도커 인 경우 가장 많은 inode를 사용하는 디렉토리에서 즉시 알 수 있습니다.
yosefrow

2
실제로 이것은 올바른 접근 방식이므로 투표를 거쳐 대답해야합니다. 건물 환경이 오염되어 이제 해킹되어 일시적으로 고칠 수 있지만 적절한 접근 방식은 다음과 같아야합니다.docker system prune
zhrist

@zhrist Haha 동의합니다
Joshua Cook

@ coler-j 아마도 ... 원래의 매우 구체적인 질문으로 생각한다면. 그러나 서로에게 정직하자. 대부분의 사람들은 OP가 유스 케이스를 모호하게 하여이 질문을 찾지 않지만 도커 캐시에 공간이 부족하기 때문에이 질문을 찾지 못했습니다.
Joshua Cook

@JoshuaCook 그것은 실제로 매우 일반적인 문제입니다 : github.com/docker/for-win/issues/1042 실제 해결책이 없습니다. 근본 원인을 찾으려고 노력하는 것은 매우 실망 스럽습니다. :(
coler-j

70

Docker는 기본적으로 이미지 파일을 / var / lib / docker에 저장하는 위치이므로 / var에 여유 공간이 있는지 확인하십시오.

먼저 docker ps -a모든 컨테이너 (중지 된 컨테이너 포함)를 나열 docker rm하고 제거 하여 물건을 정리 하십시오. 다음 사용 docker images목록에 사용자가 저장 한 모든 이미지 및 docker rmi제거 할 수 있습니다.

그런 다음 docker 데몬에서 -g 옵션을 사용하거나 옵션을 편집 /etc/default/docker하고에 추가 하여 저장 위치를 ​​변경하십시오 . "Docker runtime"의 위치를 ​​지정합니다. 이는 기본적으로 이미지를 빌드하고 컨테이너를 실행할 때 Docker가 만드는 모든 것입니다. 사용 된 디스크 공간이 시간이 지남에 따라 증가하는 경향이 있으므로 충분한 공간이있는 위치를 선택하십시오. 를 편집하는 경우 변경 사항을 적용하려면 docker 데몬을 다시 시작해야합니다.-gDOCKER_OPTS-g/etc/default/docker

이제 새 이미지를 만들거나 Docker Hub에서 이미지를 가져와야하며 -g 옵션으로 지정한 디렉토리에 많은 파일이 생성되는 것을 볼 수 있습니다.


Kal에게 감사합니다. DOCKER_OPTS에 대한 설명서를 찾을 수 없습니다. -g 옵션은 무엇을 의미하며 무엇으로 설정해야합니까? 또한 docker / aufs / mnt 아래의 내용을 삭제할 수 있습니까?
user_mda 2016 년

루비, DOCKER_OPTS에 대한 실제 문서를 찾지 못했다고 생각하지만 문서를 편집하는 방법에 대한 문서가 여기 저기 있습니다. 내가 찾을 수있는 가장 가까운 것은 docs.docker.com/installation/ubuntulinux/… 끝에 있으며 DOCKER_OPTS 에서 DNS 설정 편집에 대해 설명합니다. DOCKER_OPTS의 옵션은 단지 데몬으로 전달되므로 해당 참조는 docs.docker.com/reference/commandline/cli/#daemon 입니다. -g는 "Docker runtime"의 기본 위치를 설정합니다
Kal

또한 docker / aufs / mnt 아래의 내용을 삭제할 수 있습니까?
user_mda 2016 년

수동으로 삭제하지 마십시오. 대신에 컨테이너 (종료 된 컨테이너 포함)와 필요없는 이미지를 삭제하십시오. -g 옵션을 변경하기 전에이를 수행해야합니다. 사용 docker ps -a후 (종료 포함한) 모든 컨테이너를 나열하고 docker rm제거 할 수 있습니다. 사용 docker images후 모든 이미지를 나열하고 docker rmi제거 할 수 있습니다. 잘만되면 그것은 모든 (또는 대부분의 것들)을 청소해야합니다.
Kal

감사합니다. 이미지와 컨테이너를 지우면 약간의 공간이 생겼습니다. 도커 런타임이 무엇을 가리켜 야합니까? 그러나도 커가 이미지를 저장하는 데 사용하는 공간을 늘리는 방법이 있습니까?
user_mda 2016 년

37

이미 언급했듯이

docker system prune

사용되지 않지만 볼륨을 정리하지 않고 Docker 17.06.1 이상에서 도움이됩니다. Docker 17.06.1부터 다음 명령도 볼륨을 제거합니다.

docker system prune --volumes

Docker 설명서에서 https://docs.docker.com/config/pruning/

docker system prune 명령은 이미지, 컨테이너 및 네트워크를 제거하는 바로 가기입니다. Docker 17.06.0 이하에서는 볼륨도 정리됩니다. Docker 17.06.1 이상에서 볼륨을 제거하려면 docker 시스템 제거에 대한 --volumes 플래그를 지정해야합니다.

볼륨을 정리하고 이미지와 컨테이너를 유지하려는 경우 :

docker volume prune

3
docker volume prune여기에있는 다른 모든 솔루션이 작동을 멈출 때 오늘 도움이되었습니다.
AVProgrammer

1
엄청난 도움-오류를 수정하는 것 외에도 하드 드라이브에 많은 공간이 생겼습니다.
매트 브라운

29

Docker의 테스트 설치 (생산이 아님)이고 핵 청소를 신경 쓰지 않는다면 다음을 수행 할 수 있습니다.

모든 용기를 청소하십시오 : docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

모든 이미지를 청소하십시오. docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

다시, 나는 심각한 QA 또는 생산 경로가 아닌 Docker를 개발할 때 내 EC2 인스턴스에서 이것을 사용합니다. 가장 좋은 점은 Dockerfile이 있으면 쉽게 다시 빌드 할 수 있다는 것입니다 docker pull.


1
내 boot2docker 인스턴스에서 전화해야했습니다 docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -f. OS X BSD 버전은 boot2docker 버전과 달리 옵션 을 xargs지원합니다 -L.
orluke

1
docker ps -a -q텍스트 조작을 피하기 위해 등을 사용할 수 있습니다 . 즉 docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)트릭을 수행해야합니다
Niklas B.

21

사용하지 않는 모든 컨테이너, 볼륨, 네트워크 및 이미지를 한 번에 제거하려면 ( https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands ) :

docker system prune -a -f --volumes

충분하지 않으면 먼저 실행중인 컨테이너를 제거 할 수 있습니다.

docker rm -f $(docker ps -a -q)
docker system prune -a -f --volumes

/ var / lib / docker를 늘리거나 더 많은 공간이있는 다른 위치를 사용하는 것도이 오류를 제거하는 좋은 대안입니다 ( Docker 이미지 설치 디렉토리를 변경하는 방법 참조 ).


docker system prune볼륨을 제거하지 않습니다.
Bonifacio2

1
docker system prune -a -f --volumes볼륨을 제거합니다.
Jimson Kannanthara James

19

Mac 용 Docker

그래서 docker system prunedocker system prune --volumes다른 답변에서 제안 해제 된 일부 공간마다,하지만 결국 난 아무것도 실행 때마다 나는 오류가 발생했습니다.

실제로 루트 문제를 해결 한Docker.raw 것은 Docker for Mac이 저장에 사용 하는 파일을 삭제 하고 다시 시작하는 것이 었습니다.

해당 파일을 찾으려면 Docker for Mac을 열고 *로 이동하십시오.

Preferences > Resources > Advanced > Disk Image Location

*이 버전은 2.2.0.5 용이지만 이전 버전에서는 유사해야합니다.

Docker for Mac **의 최신 버전에서는 UI의 디스크에있는 파일의 실제 크기와 최대 할당 크기가 표시됩니다. 당신은 아마 그것이 거대한 것을 볼 것입니다. 예를 들어 내 컴퓨터에서는 41GB였습니다 !

** 이전 버전에서는 UI의 실제 디스크 사용량을 표시하지 않으며 MacOS Finder는 항상 파일 크기를 최대 할당 크기로 표시합니다. 터미널에서 디렉토리를 열고 실행하여 디스크의 실제 크기를 확인할 수 있습니다du -h Docker.raw

Docker.rawMac 용 Docker를 삭제 하고 다시 시작한 후 파일이 자동으로 다시 생성되어 다시 0GB 로 돌아 갔습니다 .

물론 Docker 캐시를 잃어 버렸지 만 모든 것이 이전같이 계속 작동했습니다 . 예상대로 Docker 명령을 몇 개 실행하면 파일이 몇 GB로 다시 채워지기 시작했지만 41GB에 거의 미치지 못했습니다.


최신 정보

몇 달 후, Docker.raw비슷한 크기로 다시 채워졌습니다. 따라서이 방법은 효과가 있었지만 몇 개월마다 반복해야합니다. 저에게는 괜찮습니다.

왜 이것이 작동하는지에 대한 참고 사항-Mac 용 Docker의 버그라고 가정해야합니다. 처럼 정말 보인다 docker system prune/가 docker system prune --volumes완전히이 파일의 내용을 삭제해야하지만 파일이 명령에 의해 삭제 될 수없는 다른 물건을 축적 나타납니다. 어쨌든 수동으로 삭제하면 문제가 해결됩니다!


15

Docker는 공간을 차지할 수있는 매달린 이미지를 남깁니다. Docker 후에 정리하려면 다음을 실행하십시오.

docker image prune [-af if you want to force remove all images]

또는 이전 버전의 Docker :

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")

이것은 종료되고 매달려있는 이미지를 제거하여 장치 공간을 깨끗하게 제거합니다.


14
  1. 매달린 이미지 정리 docker rmi $(docker images -f "dangling=true" -q)
  2. 원치 않는 볼륨 제거
  3. 사용하지 않은 이미지 제거
  4. 미사용 용기 제거

나에게 문제는 이미지가 너무 많다는 것입니다. 정리하면도 커가 다시 작동합니다.
Tran Triet

9

당신은 또한 사용할 수 있습니다 :

docker system prune

또는 단지 볼륨의 경우 :

docker volume prune

7

필자의 경우 ubuntu-server 18.04.1을 설치하면 (이상한 이유로) 750GB 대신 4GB 크기의 LVM 논리 볼륨이 만들어졌습니다. 따라서 이미지를 가져올 때 "장치에 남은 공간이 없습니다"라는 오류가 발생합니다. 수정은 간단합니다.

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

.. 다음 스레드에서 resize2fs 에 대한 단계별 설명을 참조하십시오 . stackoverflow.com/questions/32485723/…
Alex

7

RHEL 컴퓨터 에서도이 문제가 발생했습니다. 스택 오버플로 및 도커 허브 커뮤니티에서 적절한 솔루션을 찾지 못했습니다. 아래 명령을 수행 한 후에도이 문제가 발생하는 경우 :

도커 시스템 정리 --all

마침내 효과가 있었던 솔루션 :

  1. 도커 정보
    • 현재 도커 저장소 드라이버를 확인하려면
    • 광산은 : 스토리지 드라이버 : devicemapper; 스토리지 드라이버가 overlay2 인 경우 걱정할 것이 없습니다. 해결책은 여전히 ​​당신을 위해 작동합니다.
  2. df -h
    • 이것은 머신에서 사용 가능한 파일 시스템과 마운트 된 경로를 확인하기위한 것입니다. 메모 할 두 개의 마운트 된 경로 :
    • / dev / mapper / rootvg-var 7.6G 1.2G 6.1G 16 % / var
    • / dev / mapper / rootvg-apps 60G 9.2G 48G 17 % / apps
    • – 기본적으로 도커 저장 경로는 / var / lib / docker입니다. 사용 가능한 공간이 ~ 6GB이므로 모든 공간 관련 문제가 있습니다. 따라서 기본적으로 기본 저장소를 사용 가능한 공간이 더 많은 다른 저장소로 이동해야합니다. 나를 위해 / apps에 마운트 된 파일 시스템 경로 '/ dev / mapper / rootvg-apps'. 이제 작업은 / var / lib / docker를 / apps / newdocker / docker와 같은 것으로 옮기는 것입니다.
  3. mkdir / apps / newdocker / docker
  4. chmod -R 777 / apps / newdocker / docker
  5. / usr / lib / systemd / system에있는 Linux에서 docker.serive 파일을 업데이트하십시오.
    • vi /usr/lib/systemd/system/docker.service
  6. 저장 장치가 devicemapper 인 경우 기존 ExecStart 줄을 주석 처리하고 [Service] 아래에 아래를 추가하십시오.
    • 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
  7. 또는 저장 장치가 오버레이 2 인 경우 :
    • 기존 ExexStart 문에 -g / apps / newdocker / docker를 추가하기 만하면됩니다.
    • ExecStart = / usr / bin / dockerd -g / apps / newdocker / docker -H fd : // --containerd = / run / containerd / containerd.sock과 같은 것
  8. rm -rf / var / lib / docker (기존의 모든 도커 데이터를 삭제합니다)
  9. systemctl 정지 도커
  10. PS AUX | grep -i 도커 | grep -v grep
    • 위 명령으로 출력이 생성되지 않은 경우 아래 명령으로 systemd 데몬을 다시로드하십시오.
  11. systemctl 데몬 재로드
  12. systemctl 시작 도커
  13. 도커 정보
    • 새로운 파일 시스템에 도커로 연결 한 후 62.15GB의 사용 가능한 데이터 공간을 확인하십시오.
  14. 끝난

나는 이것을 달성하는 방법에 대한 모든 문서를보고있다! 감사합니다. 이것을 답변 중 하나로 표시 할 수 있습니까?
Vulegend

6

다음 명령을 사용하여 Docker를 청소하십시오.

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi

4

cgroup에 cpuset컨트롤러가 활성화되어 있습니다. 이 컨트롤러는 작업을 실행할 수있는 CPU / 메모리 뱅크를 세부적으로 지정할 수있는 NUMA 환경에서 주로 유용합니다.

기본적으로 필수 cpuset.mems이며 cpuset.cpus설정되어 있지 않으므로 작업에 "공간이 남아 있지 않음"을 의미하므로 오류가 발생합니다.

이 문제를 해결하는 가장 쉬운 방법 cgroup.clone_children은 루트 cgroup에서 1 을 활성화 하는 것입니다. 귀하의 경우에는

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children

기본적으로 컨테이너 cpuset.memscpuset.cpus상위 cgroup에서 컨테이너를 자동으로 초기화하도록 시스템에 지시 합니다.


1
이것이 정답입니다. 실제로 Docker를> = Docker 1.8로 업그레이드 하면 문제 해결됩니다. 이것은 github.com/opencontainers/runc/issues/133 과 관련이 있습니다.이 문제에서 또 다른 잠재적 인 해결 방법은 "echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
cpuguy83

2

Docker Toolkit을 통해 boot2docker 이미지를 사용하는 경우 boot2docker 가상 머신에 공간이 부족하여 문제가 발생합니다.

당신이 작업을 수행 할 때 docker import또는 새로운 이미지를 추가, 이미지는로 복사됩니다 /mnt/sda1전체가 될 수도있다.

이미지에서 사용 가능한 공간을 확인하는 한 가지 방법은 vm으로 ssh df -h하고 / mnt / sda1에서 나머지 공간을 확인 하고 실행 하는 것입니다.

ssh 명령은 docker-machine ssh default

공간 문제인지 확인한 후에는이 질문에 대한 답변 중 일부 지침에 따라 정리하거나 공간을 늘려서 boot2docker 이미지 자체의 크기를 조정하도록 선택할 수 있습니다 /mnt/sda1

https://gist.github.com/joost/a7cfa7b741d9d39c1307 이미지 크기 조정을 수행하려면 여기의 지침을 따르십시오


2

Docker Desktop을 사용하는 경우 Docker의 환경 설정 으로 이동하여 고급 설정 에서 디스크 이미지 크기 를 늘릴 수 있습니다 .

다음은 macOS의 스크린 샷입니다.

macOS의 Docker Desktop, 리소스, 고급, 디스크 이미지 크기


1

기본 스토리지 공간이 40GB로 설정된 것일 수 있습니다 (기본 경로, / var / lib / docker).

다른 경로를 가리 키도록 저장소 볼륨을 변경할 수 있습니다

  • 파일 편집-> / etc / sysconfig / docker-storage
  • 아래 줄 업데이트 (없는 경우 추가)

DOCKER_STORAGE_OPTIONS = '-storage-driver = 오버레이 --graph = CUSTOM_PATH'

  • docker systemctl을 중지하십시오.

docker info 명령을 실행하면 스토리지 드라이버가 오버레이로 표시됩니다.


0

이것이 발생할 수있는 몇 가지 방법이있는 것 같습니다. 내가 가진 문제는 도커 디스크 이미지가 최대 크기에 도달했다는 것입니다 (OSX의 크기를 보려면 Docker Whale-> Preferences-> Disk).

나는 한도를 올렸고 가고 좋았습니다. 사용하지 않은 이미지를 정리해도 잘 작동합니다.


0

아래 명령을 실행합니다.

나중에 이미지를 다시 만들 필요가 없습니다.

docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)

출구 / 댕글 컨테이너 및 댕글 링 볼륨을 제거합니다.


0

나를 docker system prune위해 트릭을했다. 나는 맥 OS를 실행 중이다.


이것은 실제로 Mac OS에서 사용 된 공간을 정리하려고 할 때 실제로 작동했습니다. 명령 docker volume ls을 사용하는 것은 아무것도 반환하지 않았으므로 스토리지가 주로 캐시와 매달려있는 이미지에 사용 된 것처럼 보입니다.
Tuhin

-3
$ docker rm $(docker ps -aq)

이것은 나를 위해 일했다

docker system prune 

최신 버전에서는 더 나은 옵션으로 보입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.