Docker는 개발자와 시스템 관리자에게 애플리케이션을 빠르게 구축, 테스트 및 배포할 수 있는 강력한 도구를 제공합니다. 그러나 시간이 지남에 따라 Docker 환경은 사용하지 않는 컨테이너, 이미지, 볼륨 등으로 인해 디스크 공간을 과도하게 차지할 수 있습니다. 이 글에서는 Docker 환경에서 불필요한 디스크 공간을 효과적으로 초기화하고 관리하는 방법을 자세히 살펴보겠습니다.

본론

Docker 환경을 최적화하고 디스크 공간을 확보하기 위한 여러 가지 방법을 살펴보겠습니다. 각 방법에 대해 상세한 설명과 함께 실제 사용 예시를 제공하겠습니다.

1. 사용하지 않는 컨테이너 제거

가장 먼저 할 수 있는 것은 더 이상 필요하지 않은 컨테이너를 제거하는 것입니다.

docker container prune

이 명령어는 중지된 모든 컨테이너를 제거합니다. 실행 중인 컨테이너는 영향을 받지 않습니다.

예를 들어, 개발 과정에서 여러 버전의 애플리케이션을 테스트하느라 많은 컨테이너를 생성했다고 가정해봅시다. 이제 테스트가 완료되었다면, 다음과 같이 불필요한 컨테이너를 한 번에 제거할 수 있습니다:

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
f9f29bcba5f2a5b5c9d81ce4dfe2d499073e8a6a49c983ae69c05fa0b5a8cf9b
a7eff4b2605d7523e271b7e0c31671b4e1137a5f4a6bfce9d3ef0c124dcb0375
...
Total reclaimed space: 1.2GB

2. 사용하지 않는 이미지 제거

다음으로, 더 이상 필요하지 않은 Docker 이미지를 제거할 수 있습니다.

docker image prune

이 명령어는 사용되지 않는 이미지(dangling images)만 제거합니다. 모든 사용하지 않는 이미지를 제거하려면 -a 옵션을 사용합니다.

docker image prune -a

예를 들어, CI/CD 파이프라인에서 매 빌드마다 새로운 이미지를 생성한다고 가정해봅시다. 시간이 지나면 이전 버전의 이미지들이 쌓이게 됩니다. 이를 정리하려면:

$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: myapp:v1.0.0
untagged: myapp:v1.1.0
untagged: myapp:v1.2.0
...
Total reclaimed space: 5.3GB

3. 사용하지 않는 볼륨 제거

Docker 볼륨은 데이터를 저장하는 데 사용되지만, 더 이상 필요하지 않은 경우 제거할 수 있습니다.

docker volume prune

예를 들어, 데이터베이스 컨테이너를 여러 번 생성하고 삭제하는 과정에서 불필요한 볼륨이 남아있을 수 있습니다:

$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
mysql_data
mongodb_data
...
Total reclaimed space: 2.9GB

4. 사용하지 않는 네트워크 제거

컨테이너 간 통신을 위해 생성된 네트워크도 정리할 수 있습니다.

docker network prune

마이크로서비스 아키텍처를 테스트하면서 여러 네트워크를 생성했다고 가정해봅시다:

$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
frontend_network
backend_network
...

5. 모든 사용하지 않는 Docker 객체 제거

한 번에 모든 사용하지 않는 Docker 객체(컨테이너, 이미지, 볼륨, 네트워크)를 제거하려면:

docker system prune

더 철저한 정리를 위해 다음 옵션을 사용할 수 있습니다:

docker system prune -a --volumes

이 명령어는 모든 중지된 컨테이너, 사용하지 않는 네트워크, 사용되지 않는 이미지(중간 이미지 포함), 그리고 사용하지 않는 볼륨까지 모두 제거합니다.

주의: 이 명령어는 매우 강력하므로 실행 전에 영향을 받는 리소스를 잘 확인해야 합니다.

$ docker system prune -a --volumes
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all volumes not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
Deleted Networks:
Deleted Volumes:
Deleted Images:
Total reclaimed space: 15.6GB

6. 특정 기간 이전의 리소스 제거

특정 시간 이전에 생성된 리소스만 제거하고 싶다면 --filter 옵션을 사용할 수 있습니다.

docker system prune --all --force --filter "until=24h"

이 명령어는 24시간 이상 된 리소스를 제거합니다. 이는 특히 CI/CD 환경에서 유용할 수 있습니다. 예를 들어, 일주일 전의 빌드 결과물을 모두 정리하고 싶다면:

$ docker system prune --all --force --filter "until=168h"
Deleted Containers:
Deleted Images:
Deleted Networks:
Deleted Volumes:
Total reclaimed space: 20.5GB

결론

Docker는 강력한 도구이지만, 효율적인 리소스 관리가 필요합니다. 이 글에서 소개한 방법들을 사용하여 Docker 환경의 디스크 공간을 최적화할 수 있습니다. 정기적인 정리 작업을 통해 시스템 성능을 향상시키고, 불필요한 리소스로 인한 문제를 예방할 수 있습니다.

단, 이러한 명령어들을 사용할 때는 주의가 필요합니다. 특히 프로덕션 환경에서는 실행 전에 영향을 받는 리소스를 잘 확인해야 합니다. 필요한 데이터나 리소스가 실수로 삭제되지 않도록 주의하세요. 또한, 자동화 스크립트를 작성하여 정기적으로 정리 작업을 수행하는 것도 좋은 방법입니다.

Docker 환경 최적화는 지속적인 관리가 필요한 작업입니다. 시스템의 특성과 요구사항에 맞게 위의 방법들을 적절히 조합하여 사용하면, 효율적이고 안정적인 Docker 환경을 유지할 수 있을 것입니다.

댓글남기기