programing

오래된 도커 컨테이너를 제거하는 방법

muds 2023. 11. 2. 22:10
반응형

오래된 도커 컨테이너를 제거하는 방법

이 질문은 도커 컨테이너의 초과, 미실행에 대해 우려해야 합니까?와 관련된 질문입니다.

오래된 컨테이너를 어떻게 제거해야 하는지 궁금합니다.docker rm 3e552code34a하나를 제거할 수는 있지만 이미 많이 있습니다.docker rm --help모두 또는 이미지 이름으로 선택 옵션을 제공하지 않습니다.

혹시 이 컨테이너들을 수동으로 쉽게 삭제할 수 있는 디렉토리가 있을까요?

Docker 1.13.x 이후에는 Docker 컨테이너 프루닝을 사용할 수 있습니다.

docker container prune

이렇게 하면 중지된 모든 컨테이너가 제거되고 모든 플랫폼에서 동일한 방식으로 작동해야 합니다.

도커 시스템 프루닝도 있습니다.

docker system prune

사용되지 않는 모든 컨테이너, 네트워크, 이미지(대깅 및 참조되지 않음) 및 선택적으로 볼륨을 하나의 명령으로 정리합니다.


이전 도커 버전의 경우 도커 명령어를 다른 유닉스 명령어와 함께 문자열화하여 필요한 것을 얻을 수 있습니다.다음은 몇 주가 지난 오래된 컨테이너를 정리하는 방법에 대한 예입니다.

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

이 예는 https://twitter.com/jpetazzo/status/347431091415703552 에서 제공하는 것입니다.

Guillaume J. Charmes(예정지 신용)로부터 받은 또 다른 방법:

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

모든 용기를 우아한 방식으로 제거합니다.

그리고 Windows용 Bartosz Bilicki:

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

PowerShell의 경우:

docker rm @(docker ps -aq)

도커 1.13(2016년 4분기) 업데이트, VonC 크레딧(이 스레드의 후반부):

docker system prune 에서는 사용되지 않는 모든 데이터(즉, 정지된 컨테이너, 정지된 볼륨, 컨테이너 없는 이미지 순)를 삭제합니다.

PR 26108커밋 86de7c0을 참조하십시오. 여기에는 도커 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 "필요하지 않은" 초과분을 쉽게 제거할 수 있도록 지원하는 몇 가지 새로운 명령이 소개되어 있습니다.

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 system prune아니면docker container prune지금. 폰씨의 최신 답변을 보세요.

이전 답변 위의 여러 가지 힌트를 구성하면 실행되지 않는 모든 용기를 제거하는 가장 우아한 방법은 다음과 같습니다.

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

  • -q열 머리글 없이 컨테이너 ID만 인쇄합니다.
  • -f인쇄된 용기 목록을 필터링할 수 있습니다(이 경우 종료된 용기만 표시하도록 필터링합니다).

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

docker rm `docker ps -aq`

도커 유지 관리자는 이에 대한 명령이 없을 것이라고 표시했습니다. 당신은 다음과 같이 명령을 작성합니다.

우리는 이에 대해 이전에 논의한 바 있으며 사용자가 도커에 추가 코드를 추가할 필요 없이 위 라인을 사용하는 것을 선호합니다.

도커 1.13(2016년 4분기)을 통해 이제 다음과 같은 이점을 얻게 되었습니다.

docker system prune -a 에서는 사용되지 않는 모든 데이터(즉, 정지된 컨테이너, 정지된 볼륨, 컨테이너 없는 이미지 순)를 삭제합니다.

docker system prune-a가 없으면 (이미지의 경우) 매달린 이미지만 제거되거나, 스마일밤에서 언급한 것처럼 태그가 없는 이미지가 제거됩니다.

PR 26108커밋 86de7c0을 참조하십시오. 여기에는 도커 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 "필요하지 않은" 초과분을 쉽게 제거할 수 있도록 지원하는 몇 가지 새로운 명령이 소개되어 있습니다.

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

wjv 댓글로.

또한 있습니다.docker {container,image,volume,network} prune, 가지 유형의 개체에 대해 사용되지 않는 인스턴스를 제거하는 데 사용할 수 있습니다.

커밋 913e5cb에 소개되어 있으며, 도커 1.13+ 전용입니다.

docker container prune

2021년 업데이트(신규)

docker container prune

This - 2017 (OLD) 방식

정지된 모든 용기를 제거하는 방법

docker rm $(docker ps -a -q)

모든 용기 제거(정지 정지되지 않음)

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

이제 필터링을 사용할 수 있습니다.docker ps:

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

이미지의 경우:

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
}

편집: 아래에 언급된 바와 같이 원래 답변은 용기가 아닌 이미지를 제거하는 것입니다.문서에 대한 새로운 링크를 포함하여 두 가지 모두에 대해 답변하도록 업데이트되었습니다.새로운 것에 대해 언급해 준 Adrian(그리고 Ryan의 답변)에게 감사드립니다.ps여과의

정지된 용기를 모두 제거합니다.

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

pauk960의 코멘트로부터:

버전 1.3.0부터 필터를 사용할 수 있습니다.docker ps, 대신에grep Exited사용하다docker ps -a -f status=exited. 그리고 만약 당신이 사용한다면.-q그것으로 당신은 전체 출력 대신 컨테이너 ID만 얻을 수 있고, 그것을 위해 awk를 사용할 필요가 없습니다.

모든 컨테이너를 제거하지 않으려면 특정 컨테이너 이전 또는 이후에 생성된 모든 컨테이너를 선택할 수 있습니다.docker ps -f before=<container-ID>아니면 같이docker ps -f since=<container-ID>

시스템을 개발했고, 지금은 작동하고 있지만 여러 개의 컨테이너가 남아 있다고 가정해 보겠습니다.해당 작업 버전 이전에 만든 컨테이너를 제거하려고 합니다.작업 컨테이너의 ID를 결정합니다.docker ps.

다른 컨테이너 이전에 생성된 컨테이너 제거

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

또 다른 예.데이터베이스가 이미 도커 컨테이너에서 실행 중입니다.다른 컨테이너에서 실행할 응용프로그램을 개발했고 이제 불필요한 컨테이너가 여러 개 있습니다.

특정 컨테이너 뒤에 생성된 컨테이너 제거

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

도커는 컨테이너를 저장합니다./var/lib/docker/containersUbuntubuntu에서.여분의 컨테이너는 다른 피해는 없지만 디스크 공간을 차지한다고 생각합니다.

업데이트: 도커 버전 1.13(2017년 1월 출시) 이후로 정지된 컨테이너, 사용되지 않은 볼륨, 매달린 이미지 및 사용되지 않은 네트워크를 정리하기 위해 다음 명령을 내릴 수 있습니다.

docker system prune

다음이 포함된 컨테이너만 삭제하도록 하려면exitedstatus, 사용 방법을 사용합니다.

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

마찬가지로 도커 항목을 정리하는 경우 태그가 지정되지 않은 이름 없는 이미지를 다음과 같은 방법으로 제거할 수 있습니다.

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

이것은 나의docker-cleanup태그가 지정되지 않은 컨테이너와 이미지를 제거하는 스크립트입니다.업데이트된 내용이 있는지 소스를 확인해주시기 바랍니다.

#!/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

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

먼저 용기를 제거하기 전에 실행을 중지합니다.

실행 중인 컨테이너 제거

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

당신은 사용할 수 있습니다.kill대신에stop. 내 경우엔 내가 더 선호합니다.stop제가 재방송을 하는 편이고, 매번 새로 만드는 편이기 때문에 잘 닫으려고 노력합니다.

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

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

모든 용기 제거

docker rm $(docker ps -a -q)

Windows 셸에서 모든 컨테이너 제거:

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

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

도커정리

작은 일체형 셸로 다음을 제거합니다.

  • 1일 이상 실행되지 않은 컨테이너
  • 나머지 컨테이너에 속하지 않는 이미지

크론탭 작업으로 실행할 의도

특징

  • 모두 제거됩니다.<none>:<none>이미지들
  • 이미지에 여러 repo:tag 참조가 있는 경우 컨테이너 실행을 제외한 모든 repo:tag가 제거됩니다.사실 그것은 "도커미"의 성격입니다.
  • 많은 오류 메시지가 화면에 표시되며, 당신은 다음과 같이 결정할 수 있습니다.2>/dev/null그렇지 않으면.
  • 도커-gc에서 무언가를 배우고 문제를 해결합니다(복수의 repo:tag가 있는 이미지는 제거할 수 없습니다).

따라서 개인적으로는 이미지와 컨테이너 모두에 대한 배포 스크립트의 일부로 최신 n개의 컨테이너와 이미지만 유지하는 것을 권장합니다.도커 이미지에 함께 사용하는 버전 스키마와 동일한 태그를 지정합니다.git tag최신 도커 이미지에 항상 "최신" 태그를 지정합니다.즉, 아무것도 정리하지 않고 도커 이미지는 다음과 같이 나타납니다.

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 images그리고.docker ps날짜별로 둘다 주문하면 됩니다.tail상위 3개를 제외한 모든 항목을 선택하고 제거합니다.

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

배포 스크립트와 함께(또는 로컬에서) 실행하면 공간을 너무 많이 차지하거나 오래된 이미지로 인해 어수선한 작업을 하지 않고도 항상 이미지를 충분히 롤백할 수 있습니다.

개인적으로, 저는 언제든지 생산 박스에 컨테이너 하나만 보관하고 있지만, 더 많은 것을 원한다면 컨테이너를 가지고도 같은 종류의 일을 할 수 있습니다.

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

마지막으로, 단순화된 예에서는 한 번에 하나의 저장소만 다루지만, 더 많은 저장소가 있다면 동일한 아이디어를 통해 좀 더 정교해질 수 있습니다.마지막 세 개의 이미지를 some_repo/some_image에 저장하려고 합니다.그냥 섞으면 돼요.grep그리고.awk제 길로 가겠습니다.

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

다시 말하지만, 용기에도 같은 생각이 적용되지만, 이 시점에서 이해하게 되므로 예는 그만 두겠습니다.

용도:

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

로컬에 있는 모든 컨테이너를 강제로 중지하고 제거합니다.

모든 기존 이미지 보기:

docker images -a

모든 기존 컨테이너 보기:

docker ps -a

단일 이미지 삭제:

docker images -a
docker rmi <IMAGE_ID>

단일 컨테이너 중지:

docker ps -a
docker stop <CONTAINER_ID>

다중 컨테이너 중지:

docker ps -a
docker stop <CONTAINER_ID1> <CONTAINER_ID2>

단일 컨테이너 삭제:

docker ps -a
docker rm <CONTAINER_ID>

여러 이미지 삭제:

docker images -a
docker rmi <IMAGE_ID1> <IMAGE_ID2>

중지된 여러 개의 컨테이너를 삭제합니다.

docker ps -a
docker rm <CONTAINER_ID1> <CONTAINER_ID2>

단일 명령에서만 이미지 삭제:

docker rmi -f $(docker images -a -q)

한 번의 명령으로 컨테이너와 이미지를 모두 삭제합니다.

docker rm $(docker ps -a -q) && docker rmi -f $(docker images -a -q)

모든 용기를 가지치기하는 방법:

docker container prune

가장 오래된 5개의 용기를 제거합니다.

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

남은 컨테이너 수 확인:

docker ps -aq | wc -l

정지된 모든 용기를 제거합니다.

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

이렇게 하면 도커 ps -a -q가 있는 모든 컨테이너의 목록을 얻고 ID를 도커 rm에 전달하여 정지된 모든 컨테이너를 제거합니다.이렇게 하면 실행 중인 컨테이너가 제거되지 않으며 실행 중인 이미지를 제거할 수 없다는 것을 알 수 있습니다.

태그가 지정되지 않은 모든 이미지 제거

이제 오래된 이미지를 정리하여 공간을 절약하려고 합니다.

sudo docker rmi (sudo docker images -q --filter "dangling=true")

새로운 방법: spotify/docker-gc가 속임수를 씁니다.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • 한 시간 이상 전에 종료된 컨테이너는 제거됩니다.
  • 그 후 남은 컨테이너에 속하지 않는 이미지는 제거됩니다.

환경 설정을 지원해 왔습니다.

태그가 여러 개인 이미지를 강제로 삭제

 FORCE_IMAGE_REMOVAL=1

컨테이너 삭제 강제화

 FORCE_CONTAINER_REMOVAL=1 

가비지 컬렉션에서 최근에 종료된 컨테이너 및 이미지 제외

 GRACE_PERIOD_SECONDS=86400

이 설정은 또한 GRACE_PERIODE_SECONDS 초 미만으로 생성된 이미지를 제거하지 못하도록 합니다.

드라이 런

 DRY_RUN=1

고아 컨테이너 볼륨 정리 CLEAN_UP_VOLUME=1

참조 : 도커-gc

이전 방식:

실행되지 않는 오래된 컨테이너 삭제

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

실행 중이지 않은 도커 컨테이너와 연관된 모든 이미지 삭제

 docker images -q | xargs --no-run-if-empty docker rmi

도커 버전 1.10.x 이상에 대해 고아 도커 볼륨 정리

 docker volume ls -qf dangling=true | xargs -r docker volume rm

기간기준

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
  1. 모든 도커 프로세스 제거:

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

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

다음 명령을 사용하여 종료된 컨테이너를 제거할 수 있습니다.

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

도커의 이전 이미지도 제거하기 위한 전체 요지: 이전 도커 컨테이너와 이미지를 제거하기 위한 요지.

저는 이 간단한 답을 보지 못했기 때문에 추가하고 싶었고, 질문은 구체적으로 "전체"가 아니라 "오래된" 것입니다.

sudo docker container prune --filter "until=24h"

보다 오래된 용기를 제거하고자 하는 시간 범위에 따라 24시간을 조정합니다.

#!/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

정지된 용기만 제거할 수 있습니다.처음에 그들을 모두 멈추세요.

docker stop $(docker ps -a -q)

그러면 제거할 수 있습니다.

docker rm $(docker ps -a -q)

이 명령을 사용하여 용기와 매달린 이미지를 청소합니다.

docker system prune -a

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

디렉터리를 제거할 수 있습니다./var/lib/docker/graph언제docker rmi불합격의

모든 용기 및 이미지를 정지/제거하는 기본 단계

  1. 모든 용기 나열

    docker ps -aq

  2. 실행 중인 모든 컨테이너 중지

    docker stop $(docker ps -aq)

  3. 모든 용기 제거

    docker rm $(docker ps -aq)

  4. 모든 이미지 제거

    docker rmi $(docker images -q)

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

다음 명령을 사용하여 종료 및 다시 시작 도커 컨테이너를 삭제합니다.

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

아래 명령을 사용하여 none(없음)으로 명명된 이미지를 제거

docker image rm --force $(docker image ls  |grep none |awk '{print $3}')

관심있는 모든 사람들을 위해 qkrijger의 예를 들어 명확한 all로 바꿨습니다(모두 멈추고 제거).

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

언급URL : https://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers

반응형