사용법 - 오래된 Docker 컨테이너를 제거하는 방법





15 Answers

Guillaume J. Charmes (신용이 만기가되는 곳)에서 얻은 또 다른 방법 :

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

모든 컨테이너를 우아한 방법으로 제거합니다.

Bartosz Bilicki (Windows 용) :

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

PowerShell의 경우 :

docker rm @(docker ps -aq)

Docker 1.13 (Q4 2016) 업데이트, VonC 대한 크레딧 ( 이 스레드의 뒷 부분 ) :

docker system prune 은 사용하지 않은 모든 데이터를 삭제합니다 (예 : 컨테이너가 중지됨, 컨테이너가없는 볼륨 및 컨테이너가없는 이미지).

PR 2610886de7c0 커밋을 참조하십시오.이 명령은 Docker 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 "불필요한"초과 작업을 쉽게 정리할 수 있도록 몇 가지 새로운 명령을 도입합니다.

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
docker

이 질문은 과도한 비 작동 Docker 컨테이너에 대해 우려해야합니까? .

나는 오래된 컨테이너를 제거하는 방법을 궁금해. docker rm 3e552code34a 사용하면 하나만 제거 할 수 있지만 이미 많은 작업이 있습니다. docker rm --help 는 선택 옵션 (전부 또는 이미지 이름과 같은)을 제공하지 않습니다.

어쩌면 이러한 컨테이너를 수동으로 쉽게 삭제할 수있는 곳에 이러한 디렉토리가 저장되는 디렉토리가 있습니까?




공식적인 방법 은 다음과 같습니다.

docker rm `docker ps -aq`

Docker 관리자는 명령을 내릴 필요가 없다고 말했고 다음과 같은 명령을 작성합니다.

앞서 Docker에 코드를 추가하지 않고도 위의 줄을 사용하도록 사용자를 선호했습니다.




이제 docker ps 와 함께 filtering 을 사용할 수 있습니다.

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

그리고 images :

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

그러나 일치하는 컨테이너가 없으면 docker rm 또는 docker rmi 에서 오류가 발생합니다. 이전 docker rm $(docker ps -aq) 트릭은 실행중인 컨테이너를 제거하려고 시도 할 때 더 나빴습니다. 각 컨테이너에서 실패했습니다.

~/.bashrc 또는 ~/.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
}

편집 : 아래에서 언급했듯이 원래의 대답은 컨테이너가 아닌 이미지를 제거하는 것이 었습니다. 문서에 대한 새로운 링크를 포함하여 두 가지 모두에 대답하도록 업데이트되었습니다. 새로운 ps 필터링에 대해 언급 한 Adrian (및 Ryan의 답변)에게 감사드립니다.




중지 된 모든 컨테이너를 제거하십시오.

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

pauk960 의 의견에서 :

버전 1.3.0 부터 grep Exited 대신 grep Exited docker ps -a -f status=exited docker ps 필터를 docker ps 와 함께 사용할 수 있습니다. 그리고 함께 -q 를 사용하면 전체 출력 대신 컨테이너 ID 만 얻을 수 있으므로 awk를 사용할 필요가 없습니다.




업데이트 : Docker 버전 1.13 (2017 년 1 월에 출시 됨)에서 다음 명령을 실행하여 중지 된 컨테이너, 사용되지 않은 볼륨, 매달려있는 이미지 및 사용되지 않은 네트워크를 정리할 수 있습니다.

docker system prune

exited 상태의 컨테이너 만 삭제하려는 경우 다음을 사용하십시오.

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

마찬가지로, 도커 물건을 청소하는 경우 태그가 지정되지 않은 이름없는 이미지는 다음과 같이 제거 할 수 있습니다.

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



먼저 컨테이너를 제거하기 전에 실행중인 컨테이너를 중지하십시오.

실행중인 컨테이너 제거

docker rm $(docker stop -t=1 $(docker ps -q))

그 대신에 stop kill 을 사용할 수 있습니다. 내 경우에는 내가 그들을 다시 실행하는 경향이 있기 때문에 매번 새로운 것을 만드는 경향이 있으므로 매번 stop 편이 좋다. 그래서 나는 그들을 매끄럽게 종료하려고 노력한다.

참고 : 컨테이너를 중지하려고하면 오류가 발생합니다.

오류 : 실행중인 컨테이너를 제거 할 수 없습니다. 먼저 중지하십시오.

모든 컨테이너를 제거하십시오.

docker rm $(docker ps -a -q)



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

도커 정리

작은 올인원 셸로 다음을 제거합니다.

  • 1 일 이상 지나지 않은 컨테이너
  • 남아있는 컨테이너에 속하지 않는 이미지

crontab 작업으로 실행하려고합니다.

특색

  • <none>:<none> 이미지를 모두 제거합니다 <none>:<none>
  • 이미지에 여러 개의 repo : tag 참조가 있으면 컨테이너를 실행하는 경우를 제외하고 모든 repo : tag가 제거됩니다. 실제로 그것은 "docker rmi"의 본질입니다.
  • 많은 오류 메시지가 화면에 표시되고 2>/dev/null 결정할 수 있습니다.
  • docker-gc에서 무엇인가를 배우고 그 문제를 해결하십시오 (repo : tag가 여러 개있는 이미지는 삭제할 수 없습니다)



따라서 가장 최근의 n 개의 컨테이너와 이미지 만 유지하면서 이미지와 컨테이너 모두에 대한 배포 스크립트의 일부로이 작업을 개인적으로 수행하는 것이 좋습니다. Docker 이미지에 git tag 와 함께 사용하는 것과 동일한 버전 관리 스키마를 사용하고 항상 최신 Docker 이미지에 "latest"태그를 붙입니다. 즉, 아무 것도 정리하지 않으면 내 Docker 이미지가 다음과 같이 표시됩니다.

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

이제는 물론 내 모든 이미지 상자 (또는 컨테이너)를 모든 제작 상자에서 영원히 유지하고 싶지는 않습니다. 롤백을위한 마지막 3 ~ 4 개를 원하고 다른 모든 것을 없애고 싶습니다. 유닉스의 tail 는 당신의 가장 친한 친구입니다. docker imagesdocker ps 둘 다 날짜순으로 정렬되기 때문에 tail 를 사용하여 상위 3 개를 제외한 모든 것을 선택하고 제거 할 수 있습니다.

docker rmi $(docker images -q | tail -n +4)

배포 스크립트 (또는 로컬)와 함께 실행하면 너무 많은 공간을 차지하거나 오래 된 이미지를 어지럽히 지 않고 편안하게 롤백 할 수있는 충분한 이미지를 항상 유지할 수 있습니다.

개인적으로는 언제든지 하나의 컨테이너 만 제 제작 상자에 보관할 수 있지만 원하는 경우 컨테이너로 같은 종류의 작업을 수행 할 수 있습니다.

docker rm $(docker ps -aq | tail -n +4)

마지막으로, 단순화 된 예제에서는 한 번에 하나의 저장소 만 처리하지만 더 많은 공간이 있으면 동일한 아이디어로 조금 더 정교해질 수 있습니다. some_repo / some_image에서 마지막 세 개의 이미지를 유지하려고합니다. grepawk 섞어서 내 방식대로 사용할 수 있습니다.

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

다시 말하지만, 컨테이너에 동일한 아이디어가 적용됩니다.하지만이 시점까지는 이해할 수 있도록 예제를 제공하지 않을 것입니다.




가장 오래된 컨테이너 5 개를 제거하십시오.

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

몇 개의 컨테이너가 남아 있는지 확인하십시오.

docker ps -aq | wc -l



  1. 모든 고정 프로세스를 제거하십시오.

    docker rm $(docker ps -a -q)
    
  2. 특정 컨테이너를 제거하십시오 :

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



모든 컨테이너 및 이미지를 중지 / 제거하는 기본 단계

  1. 모든 컨테이너를 나열하십시오.

    docker ps -aq

  2. 실행중인 모든 컨테이너를 중지하십시오.

    docker stop $(docker ps -aq)

  3. 모든 컨테이너를 제거하십시오.

    docker rm $(docker ps -aq)

  4. 모든 이미지 삭제

    docker rmi $(docker images -q)

주 : 먼저 실행중인 모든 컨테이너를 제거하기 전에이를 중지해야합니다. 또한 이미지를 제거하기 전에 종속 된 컨테이너를 중지하고 제거해야합니다.




나는 항상 docker rmi $(docker ps -a -q) 를 사용하여 모든 이미지를 제거합니다.

docker rmi 실패하면 /var/lib/docker/graph 디렉토리를 제거 할 수 있습니다.




이 명령을 사용하여 컨테이너 및 매달린 이미지를 정리하십시오.

docker system prune -f



관심있는 사람에게 qkrijger의 예를 들어 명확한 것으로 바꾸 었습니다 (모두 중지 및 제거).

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



특정 이미지에서 생성 된 모든 컨테이너 제거 :

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')



Related


Tags

docker