운영 서버에서 docker 를 사용하다 보면 사용하지 않는 image 및 container 등이 늘어나 디스크 공간을 차지하기 마련이다. 그래서 아래의 명령을 cron 으로 스케줄링하여 무쓸모 image 및 container 는 삭제하는 것이 좋다. (참고로 AWS ECS 에서는 ECS 컨테이너 에이전트가 컨테이너 인스턴스에서 사용하지 않은 이미지/컨테이너 등을 자동으로 정리해 준다. 오홍~)
$ docker rm $(docker ps -a)
$ docker rmi $(docker images -a)
하지만 로컬 호스트의 경우 운영 서버와는 다르게 각종 이미지들이 쌓여 있을 것이고 지워야 할 것들과 지우지 말아야 할 것들을 구분해야 한다. 위 명령으로 실행중이지 않은 모든 이미지와 컨테이너를 삭제해도 큰 문제는 없지만 다시 필요한 이미지를 생성하거나 다운받아야 하는 불편함이 생길 수 있다. 혹여라도 대기 중인 image 를 삭제하지 않게 prune 명령을 사용하여 dangling 이미지, 컨테이너, 볼륨, 네트워크를 삭제하는 것이 좋다.
$ docker container prune -f
$ docker image prune -f
Prune images
$ docker image prune -f | cs |
컨테이너에서 태그가 지정되지 않고 어느 컨테이너에서도 참조하지 않는 dangling image 를 삭제한다. 모든 이미지 리스트(docker images -a) 에서 repository 와 tag 가 <none> 으로 설정되어 있는 이미지 중 어느 컨테이너에서도 참조하고 있지 않은 이미지를 dangling image 라고 한다. 이 dangling image 는 별다른 설정이 없다면 다시 사용되지 않을 이미지들이며, 동일한 repository:tag 로 이미지가 생성되어 기존 이미지에 덮어씌워질 때 나타난다.
docker rmi $(docker images -f "dangling=true") 명령과 동일하다. 이 명령으로 이미지가 삭제되지 않았다면 다른 컨테이너에서 참조 중이거나 이미 실행중인 것이다. --force(-f) 플래그는 강제 삭제가 아닌 프롬프트 무시 플래그이다.
$ docker image prune -a -f | cs |
컨테이너가 생성되지 않은(실행 및 중지 상태가 아닌) 모든 이미지를 삭제한다. 종료되었지만 프로세스에 남아있는 컨테이너의 이미지는 삭제하지 못한다. docker rmi -f $(docker images -a) 명령은 위 명령과 비슷하지만, 프로세스에 남아있는 종료된 컨테이너의 이미지도 삭제한다.
이미지가 많아서 필터링이 필요한 경우는 아래와 같이 --filter 플래그를 사용할 수 있다. --filter "key=value" 형식이며, 여러 개의 --filter 플래그를 같이 사용할 수 있다. 필터링에 사용할 수 있는 key 는 특정 시간 이전에 생성된 이미지를 지정하는 until 과 label 일치 여부로 비교하는 label 이 있다.
$ docker image prune -f -a --filter "until=24h" $ docker image prune -a --force --filter "until=2017-01-04T00:00:00" $ docker image prune --filter="label=deprecated" $ docker image prune --filter="label=maintainer=john" $ docker image prune --filter="label!=maintainer" $ docker image prune --filter="label!=maintainer=john" | cs |
Prune containers
컨테이너는 docker run 으로 시작할 때 --rm 플래그를 지정하지 않으면 컨테이너 중지시에 자동으로 제거되지 않는다. docker ps -a 명령으로 호스트의 모든 컨테이너, 실행 중이거나 중지된 모든 컨테이너를 확인할 수 있으며, 중지된 컨테이너의 디스크 공간을 확보하기 위해 docker container prune 명령을 사용할 수 있다. 위 docker image prune 과 마찬가지로 필터링을 사용할 수 있다.
$ docker container prune $ docker container prune --filter "until=24h" | cs |
마찬가지로 volume 과 network 도 prune 명령으로 제거할 수 있다.
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.