도커 프룬: 실습 예제와 함께하는 완벽 가이드

매일 Docker를 사용한다면, 디스크 공간을 빨리 소비하는 방법을 알고 있을 것입니다.

시간이 지남에 따라 시스템에는 사용되지 않는 이미지, 컨테이너, 볼륨 및 네트워크가 축적됩니다. 이들은 대부분 비활성 상태로 유지되며 유용한 저장 공간을 차지하고 현재 프로젝트 작업을 방해할 수 있습니다. 다행히도 Docker는 불필요한 리소스를 쉽게 제거할 수 있는 정리 명령어를 제공합니다.

이러한 정리 명령어는 docker prune 패밀리의 일부이며, 오늘 당신은 이에 대해 모두 배우게 될 것입니다. 이것들은 빠르게 디스크 공간을 확보하는 데 사용할 수 있는 해결책이 될 것입니다.

실제 예시에 들어가기 전에 간단히 개요부터 살펴봅시다.

Docker에 새로 오셨나요? 데이터 전문가를 위한 초보자를 위한 Docker 학습 가이드를 확인하여 빠르게 숙련될 수 있습니다.Docker Prune이란 무엇인가요?

“Docker Prune”이라는 용어는 일반적으로 사용되는 Docker 자원을 정리해주는 명령어 세트를 가리킵니다.

특히 여러 프로젝트를 거치면서 계속해서 이미지를 생성하고 컨테이너를 실행하며 볼륨과 네트워크를 설정할 것입니다. 모든 이러한 것들은 시스템에 축적되어 상당한 디스크 공간을 차지합니다. docker prune의 목적은 이러한 불필요한 것들을 정리하고 저장 공간을 회수하는 것입니다.

그렇다고 해서, docker prune에는 눈에 보이는 것 이상의 기능이 있습니다.

단순히 실행할 수 있는 단일 명령어가 아닙니다. 그렇게 할 수는 있지만 때로는 세밀한 제어가 필요할 수 있습니다. 이 기사에서는 pruning을 효과적으로 관리하는 방법과 의도한 것만 삭제하도록 보장하는 방법, 그리고 중요한 데이터를 실수로 삭제하지 않도록 안전한 환경에서 연습하는 방법을 안내합니다.

prune 명령어는 활성 상태가 아닌 리소스만 제거한다는 점도 언급할 가치가 있습니다. 실행 중인 컨테이너에서 참조하는 이미지, 볼륨 및 네트워크는 삭제되지 않습니다. 다시 말해, 가지치기는 활성 워크로드에 영향을 미치지 않습니다.  

다음 섹션에서는 다양한 종류의 가지치기 명령어를 안내하고 작업 흐름에 어떻게 맞는지 설명합니다.  

이미지를 CV 또는 포트폴리오에 추가하고 싶으신가요? 이 10가지 도커 프로젝트 아이디어를 통해 취업 준비를 해보세요.

실습 예제와 함께 모든 도커 가지치기 명령어

Docker는 사용하지 않는 리소스를 개별적으로 또는 한꺼번에 정리할 수 있는 여러 개의 prune 명령을 제공합니다. 이 섹션에서는 해당 명령들에 대해 이론적으로와 실제적인 예제를 통해 배우게 됩니다. 이론실제적인 예제.  

docker system prune  

이 명령은 디스크 공간을 회수하는 데 가장 포괄적인 명령입니다. 한 번의 작업으로 모든 사용되지 않는 컨테이너, 네트워크, 이미지, 빌드 캐시를 모두 제거합니다.  

한 번의 명령으로 디스크 공간을 빠르게 확보하고 싶다면, 이 방법을 사용하십시오.

docker system prune 명령에 옵션을 전달할 수 있습니다.

  • -a 또는 --all은 달린 이미지(dangling ones, 즉 태그가 없거나 어떤 컨테이너에도 참조되지 않는 이미지)를 모두 제거합니다.
  • --filter를 사용하여 필터 값을 지정할 수 있습니다.
  • -f 또는 --force는 확인 프롬프트를 건너뛸 수 있습니다.
  • --volumes 는 익명 볼륨을 컨테이너, 네트워크, 이미지 및 빌드 캐시와 함께 정리합니다.

docker system prune 은 잠재적으로 파괴적인 작업이기 때문에 기본적으로 확인을 요청합니다.  

이미지 1 – Docker 시스템 정리 확인 프롬프트

프롬프트를 우회하고 모든 사용되지 않는 이미지, 컨테이너, 네트워크 및 볼륨을 한 번에 제거하려면 다음을 실행하십시오: 

docker system prune -a -f --volumes

이미지 2 – 단일 도커 시스템 정리 명령어로 모든 것을 제거합니다

그러나 더 세밀한 제어가 필요한 경우는 어떻게 할까요? 다음에 그에 대해 다루겠습니다.

도커 컨테이너 정리

간단히 말해, 이 명령어는 모든 중지된 컨테이너를 삭제합니다.

중지된 컨테이너는 수동으로 제거할 때까지 시스템에 남아 있습니다. 디스크 공간을 차지하고 도커 데스크톱 대시보드와 같은 도구를 사용하지 않으면 발견하기 어려울 수 있습니다.도커 데스크톱 대시보드

docker system prune과 마찬가지로이 명령은 옵션을 지원합니다:

  • --filter를 사용하여 제거할 컨테이너를 제어하는 키-값 쌍을 지정할 수 있습니다.
  • -f 또는 --force는 확인 프롬프트를 건너뛸 수 있습니다.

비동작 중인 컨테이너 목록입니다:

이미지 3 – 비동작 중인 컨테이너 목록

code-server (및 기타 중지된 컨테이너)을 제거하려면 다음을 실행하십시오:

docker container prune -f

이것은 확인을 요청하지 않으며, 몇 초 내에 이와 같은 출력이 표시됩니다:

이미지 4 – 컨테이너 가지치기 출력 메시지

그리고 그렇게 하면 더 이상 중지된 컨테이너가 없습니다:

이미지 5 – 실행되지 않는 컨테이너 목록 (2)

이제 사용되지 않은 이미지를 처리해 봅시다.

docker image prune

이전 명령어와 유사하게, docker image prune은 사용되지 않는 이미지를 삭제합니다.

기본적으로 미사용 이미지만을 삭제하며, 미태깅되었고 컨테이너와 연관되지 않은 이미지를 제거합니다. 선택적 플래그를 사용하여 미사용 이미지 전부를 삭제할 수도 있습니다.

사용 가능한 옵션 목록은 다음과 같습니다.

  • -a 또는 --all은 미태깅 이미지뿐만 아니라 모든 미사용 이미지를 삭제합니다.
  • --filter 를 사용하면 이미지를 제거하는 데 사용할 키-값 쌍을 지정할 수 있습니다.
  • -f 또는 --force 를 사용하면 확인 프롬프트를 건너뛸 수 있습니다.

이제 실제로 실행해 봅시다!

시스템에 현재 있는 이미지 목록은 다음과 같습니다:

이미지 6 – Docker 이미지 목록

모두 한 번에 제거하려면 다음 명령을 실행하세요:

docker image prune -a -f

터미널에서 다음과 같은 출력이 표시됩니다:

이미지 7 – 이미지 가지치기 출력 메시지

이후에는 Docker Desktop에 이미지가 남아 있지 않습니다:

이미지 8 – Docker 이미지 목록 (2)

다음으로 사용되지 않는 볼륨을 처리해 봅시다.

docker volume prune

이름에서 알 수 있듯이 docker volume prune 명령은 모든 사용되지 않는 로컬 볼륨을 제거합니다. 다시 말해 어떤 컨테이너에서도 참조되지 않는 볼륨을 삭제합니다.

기본적으로 해당 명령은 익명 볼륨 – 컨테이너가 시작될 때 Docker에 의해 생성된 이름 없는 볼륨만 제거합니다. 명시적으로 지정된 볼륨을 제거하려면 추가 옵션을 전달해야 합니다.

다음은 사용 가능한 옵션입니다:

  • -a 또는 --all은 익명 볼륨뿐만 아니라 모든 사용되지 않는 볼륨을 제거합니다.
  • --filter를 사용하여 제거할 볼륨을 제어하는 키-값 쌍을 지정할 수 있습니다.
  • -f 또는 --force는 확인 프롬프트를 건너뜁니다.

우리 시스템에서는 docker-compose.yml 파일에서 생성된 단일 사용자 볼륨이 있습니다:

이미지 9 – Docker 볼륨 목록

다음 명령어는모든 로컬 볼륨을 제거합니다:

docker volume prune -a -f

실행 후 다음과 유사한 출력이 표시됩니다:

이미지 10 – 볼륨 가지치기 출력 메시지

이제 볼륨이 남아 있지 않습니다:

이미지 11 – 도커 볼륨 목록 (2)

마지막으로, 사용되지 않는 네트워크를 삭제하는 방법을 살펴보겠습니다.

도커 네트워크 가지치기

도커 컨테이너가 서로 통신할 때, 그들은 종종 사용자 정의 네트워크를 사용합니다. 그러나 이러한 컨테이너가 제거된 후에도 일반적으로 네트워크는 시스템에 남아 있습니다.

docker network prune 명령어는 더 이상 어떤 컨테이너에서도 사용되지 않는 네트워크를 제거합니다.

다른 가지 명령어와 마찬가지로 몇 가지 옵션이 포함되어 있습니다:

  • --filter은 네트워크를 제거할 때 제어할 수 있는 키-값 쌍을 지정할 수 있습니다.
  • -f 또는 --force는 확인 프롬프트를 건너뛸 수 있습니다.

이미지, 컨테이너 또는 볼륨과는 달리,도커 데스크톱을 통해 네트워크를 시각적으로 검사할 수 없습니다, 따라서 명령줄에서 작업해야 합니다. 사용 가능한 네트워크 목록은 다음과 같습니다:

이미지 12 – 도커 네트워크 목록

기본 도커 설치와 관련이 없는 모든 네트워크를 제거하려면 다음을 실행하십시오:

docker network prune -a -f

명령을 실행한 후에는 다음과 같은 출력이 표시됩니다:

이미지 13 – 네트워크 가지치기 출력 메시지

이제 이전에 실행되었던 컨테이너와 관련된 모든 네트워크가 사라졌습니다:

이미지 14 – 도커 네트워크 목록

그러나, 세 개의 나머지 네트워크는 Docker가 올바르게 작동하려면 필수적이며 제거할 수 없습니다.

docker prune 명령어의 기본 사용법은 여기까지입니다! 다음에는 이러한 명령어를 안전하게 사용하는 고급 주제와 프로덕션 및 민감한 환경에 대한 모범 사례를 다룰 예정입니다.

Docker Prune 안전하게 사용하기

docker prune 명령어는 빠르게 디스크 공간을 회수하는 데 도움이 되지만, 특히 프로덕션 환경에서는 조심해서 사용해야 합니다., 특히 프로덕션 환경에서는 조심해서 사용해야 합니다.

중요한 컨테이너, 이미지 또는 볼륨을 실수로 삭제하면 데이터 손실 및 중요한 작업 흐름이 중단될 수 있습니다. 이를 방지하기 위해 prune 명령을 실행하기 전에 제거될 항목을 이해하는 것이 가장 좋습니다.

이 섹션에서는 docker prune을 안전하게 실행할 때 취해야 할 주요 주의 사항을 설명합니다.

제거될 항목을 이해하기

prune 명령은 현재 사용되지 않는 리소스만을 제거하도록 설계되었습니다.

예를 들어, docker image prune 명령은 매달린 이미지만 삭제하고, docker volume prune 명령은 어떠한 컨테이너에도 연결되지 않은 볼륨만 제거합니다. 그러나 -a -f와 같은 옵션을 추가하면모든 이미지나 볼륨을 확인 없이 제거합니다.  

또한, 복잡한 환경에서는 종속성을 놓치기 쉽기 때문에 가지치기 전에 반드시 확인하는 것이 좋은 습관입니다.  

어떤 prune 명령을 실행하기 전에, 현재 사용 중인 리소스를 확인해야합니다. 이를 확인하는 여러 가지 방법이 있으며, 이 섹션에서는 가장 일반적인 방법을 살펴보겠습니다.  

이 명령을 사용하여 중지된 컨테이너를 포함한 모든 컨테이너를 보려면:  

docker ps -a

다음과 유사한 출력이 표시되어야합니다:

이미지 15 – 모든 Docker 컨테이너 목록

마찬가지로, 다음 명령을 사용하여사용되지 않는 것을 포함한 모든 이미지를 나열합니다:

docker images

출력은 위와 유사한 구조로 될 것입니다:

이미지 16 – 모든 Docker 이미지 목록

볼륨을 확인하려면 다음 명령을 실행하십시오. 모든 볼륨 나열:

docker volume ls

이미지 17 – 모든 Docker 볼륨 목록

이 출력물을 주의 깊게 검토하여 실수로 중요한 리소스가 삭제되지 않도록 합니다.

안전을 위한 드라이런

안타깝게도 Docker는 여전히 가지치기 명령의 드라이런에 대한 내장 옵션이 없습니다, 몇 년 전에 요청되었음에도 불구하고.

이로 인해 깊이 검사를 수동으로 수행해야 합니다.이전 섹션에 나열된 명령어를 사용하여 자원을 확인한 후 가지치기 명령을 실행하기 전에.

데이터 지속성이 중요한 민감한 환경에서 작업하는 경우, 볼륨에 영향을 미치는 가지치기 명령을 실행하기 전에 백업을 생성해야 합니다.

물론, 이러한 조치는 예방적인 조치일 뿐이지만, 곧 드라이런 옵션이 구현되기를 희망합니다.

도커 프룬의 모범 사례

불필요한 잡동사니 없이 도커 환경을 유지하기 위해 정기적으로 prune 명령을 실행하는 것이 중요합니다. 필요에 따라 자동화하는 것도 좋습니다.

이 섹션에서는 프로덕션 환경에서 docker prune 명령을 실행하는 데 있어 모범 사례를 안내합니다.

정기적으로 도커 프룬 사용하기

시간이 지남에 따라 도커는 사용되지 않는 이미지, 중지된 컨테이너 및 불필요한 볼륨을 축적하며, 이는 상당한 디스크 공간을 차지합니다.

정기적으로 가지치기 명령을 실행하면 환경을 깨끗하게 유지하고 과도한 디스크 사용을 방지할 수 있습니다. 이를 유지 보수 일정의 일부로 포함시켜야 합니다.

몇 주마다 실행하는 것이 좋은 시작점이지만, 컨테이너를 자주 생성하고 제거하는 환경이라면 더 자주 실행하는 일정을 고려해야 합니다.

생산 환경에서는 신중해야 합니다.

생산 환경에서의 작업은 추가 주의가 필요하며, 도커 가지치기도 예외는 아닙니다.

지나친 부주의가 다운타임이나 데이터 손실로 이어질 수 있으며, 그 책임을 지고 싶지는 않을 것입니다. 프로덕션 환경에서 docker prune 명령을 실행하기 전에 항상 이전 섹션에서 설명한 바와 같이 시스템 리소스를 검사해야 합니다. docker ps -a, docker images, docker volume ls를 사용하세요.  

또한, 의도하지 않은 삭제로부터 복구하기가 더 쉬울 수 있으므로, all-inclusive한 docker system prune 대신에 구체적인 가지치기 명령을 사용하는 것이 좋은 아이디어입니다.  

도커 가지치기를 자동화하기  

또 다른 좋은 실천 방법은 예약된 작업을 사용하여 docker prune 명령을 자동화하여 정리 작업을 간소화하는 것입니다.  

리눅스에서는 정기적 간격으로 명령을 실행하도록 cron 작업을 설정할 수 있고, 윈도우에서는 작업 스케줄러를 사용하여 유사한 자동화를 수행할 수 있습니다. 이를 통해 수동 개입 없이 깔끔한 시스템을 유지할 수 있습니다. 그러나 프로덕션 환경에서는 자동 가지치기가 중요한 작업 부하에 간섭하지 않도록 해야 합니다.  

예를 들어, 리눅스에서 이 cron 작업은 매주 일요일 자정에 모든 포괄적인 가지치기 명령을 실행합니다:

0 0 * * 0 docker system prune -a -f

Docker Prune 문제 해결

docker prune 명령어는 디스크 공간을 회수하는 데 사용되지만, 새 이미지를 끌어오거나 새 컨테이너를 실행하기에 충분한 공간을 보장할 수 없을 수도 있습니다.

또한, 중요한 자원을 실수로 삭제할 수 있으므로 복구 전략을 논의하는 것이 중요합니다.

이 두 가지 주제에 대해 이 섹션에서 다룰 예정입니다.

디스크 공간 문제 발생

Docker 이미지는 크기가 크기 때문에 우리는 최근 13GB 이상의 이미지를 하나 가졌었고, 더 큰 이미지들이 많을 것으로 확신합니다. 따라서 docker prune를 실행한 후에도 시스템의 디스크 공간이 여전히 부족한 상태일 수 있습니다.

이미지, 컨테이너 및 볼륨이 사용하는 공간을 정확히 확인하려면 다음 명령을 실행하십시오:

docker system df

Docker에서 사용 중인 공간 확인

docker prune 명령으로 디스크 공간을 회수할 때, -a 플래그를 추가하여 미사용 중이거나 익명의 이미지, 볼륨 또는 컨테이너가 아닌 모든 것을 제거할 수 있습니다. 물론, 이 방법의 잠재적인 단점을 염두에 두십시오.

디스크 공간 문제가 지속된다면, 유일한 옵션은 사용 가능한 디스크 공간을 늘리는 것입니다.

사고로 제거한 것 복구하기

복구는 말로만 쉽다고는 하지만, 실제 명령을 실행하기 전에 가지치기로 무엇이 제거될지 이해하는 것을 권장합니다.

그럼에도 불구하고, 중요한 컨테이너, 이미지 또는 볼륨을 실수로 가지치기한 상황에 처했다면, 제거된 것을 식별하기 위해 로그를 확인하는 것부터 시작하세요.

macOS에서는 다음 두 개의 명령을 실행하여 이 작업을 수행할 수 있습니다 (Windows 및 Linux용 옵션):

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

이러한 명령을 실행하면 도커 관련 로그의 마지막 30분을 /tmp/logs.txt에 저장합니다. 이 로그를 확인하여 삭제된 컨테이너나 이미지를 확인해야 합니다.

삭제된 이미지의 경우, Docker Hub와 같은 레지스트리에서 다시 가져올 수 있습니다. 이와 유사한 명령이 작동할 것입니다:

docker pull <image_name>

그리고 삭제된 컨테이너에 대해서는 항상 영구 이미지를 기반으로 생성했다면 언제든지 다시 생성할 수 있습니다:  

docker run --name <container_name> <image_name>

또는 백업에서 복원할 수도 있습니다. 이는 볼륨 및 컨테이너 데이터를 복구하는 데 사용할 수 있습니다. 미래에는 데이터 손실을 방지하기 위해 볼륨 스냅샷 도구를 사용하는 것을 고려해보세요.  

그러나 가장 좋은 전략은 가지치기 명령을 실행하기 전에 삭제될 리소스를 검사하고 근접한 것이 작업에 영향을 미치지 않을 것이 확실할 때만 진행하는 것입니다.  

도커 가지치기 요약  

요약하면, 도커 가지치기 명령어 패밀리는 디스크 공간을 회수하는 강력한 방법이지만, 필요한 리소스를 실수로 삭제하여 데이터 손실을 초래할 수 있는 위험이 있습니다. 선택적 -a -f 플래그를 사용할 때 이 위험이 더 커집니다.  

그럼에도 불구하고, 가지치기는 시스템을 깨끗하고 조직적으로 유지하는 데 사용되는 가장 좋은 방법입니다.  

프로덕션 환경에서 특히 조심해야 합니다. docker ps -a, docker images, docker volume ls와 같은 명령을 사용하여 가동 중인 모든 컨테이너, 이미지 및 볼륨을 나열한 후 가지치기를 실행하세요. 확실히 해당 리소스를 삭제해도 괜찮다고 확신한 후에만 가지치기 명령을 실행하세요 (실행 중인 컨테이너에서 사용 중이지 않은 것으로 가정).  

Docker, 컨테이너화 및 컨테이너 오케스트레이션에 대해 더 알고 싶다면 DataCamp의 이러한 강좌를 확인해보세요:

Source:
https://www.datacamp.com/tutorial/docker-prune