늘모자란, 개발 :: docker container commit(backup) and remove old images by filter

늘모자란, 개발

docker... 이 애증의 물건..

써본 사람은 알겠지만, docker와 스토리지 용량은 뗄 수 없는 관계이다.
항상 용량 문제에 항상 부딪히게 되는데 이건 소프트적으로 해결할 수 있는 용량이 아니다. 결국 물리적인 하드를 추가할 수 밖에 없었다...

이걸 왜 하게 됐냐면 이 글 의 내용 때문이다.
마지막으로, 서버 이미지를 하루마다 저장해 허브에 푸시합니다. DB 두개가 한번에 박살나도, 최대 10분내에 복구가 가능합니다.(순수하게 다운로드 시간)
라고 적어놨는데 허브에 푸시한다는건 말이 안된다. 일단 푸시 시간이 너무 어마무시하게 걸린다.
지금 내 이미지의 용량은 115기가쯤인데 48시간동안 docker push 했으나 결국 업로드에 실패했다... 컴퓨터가 먼저 리셋되었다.
결국 새 스토리지도 달았겠다 로컬에 저장해놓고 관리하기로 했다.

우선 현재 나는 2개 컨테이너를 운영중인데, MySQL 을 repl 화 해서 master / slave 로 나누어 관리하고 있다.
master와 slave의 차이는 my.cnf 와 같은 설정차이일뿐, 실 서비스 중인 master 컨테이너를 건드릴 필요는 없다.
그래서 slave를 commit 해서 새로운 이미지를 만들면된다. commit 중엔 컨테이너가 pause 상태에 빠지게 되는데, resume 되면 알아서 slave가 master로부터 데이터를 긁어와 동기화 되므로 별 걱정할 필요가 없다.

내 스토리지가 보관할 수 있는 이미지 갯수는 약 4개.
커밋 전 용량이 부족할 수 있으니 오래된 이미지를 정리한다. 이때 필터옵션을 줘서 오래된 이미지를 삭제 할 수 있다.

docker image prune -a -f --filter "until=3h"


이때, 필터옵션을 주지 않으면 사용하지 않는 모든 컨테이너가 삭제되므로 반드시 주의해야한다.
배치 작업을 위해 -f를 준거지 단순 정리목적이라면 -f를 사용하지 말고 !!반드시!! 재 확인이 필요함

그 이후, 컨테이너를 커밋한다.

docker container commit <CONTAINER> <IMAGE NAME:TAG>


인데 일반적으로 알고 있는 docker commit은 이미지에 commit 하는거고, 이건 container 를 기반으로 새로운 이미지를 만드는 것이다.
나같은 경우엔 TAG에 배치 시작 시간을 넣어줬는데, 태그는 아무래도 상관없다. creation date 로 prune 되기때문에 뭘 넣어도 상관없다.

이 과정에서 알게 된게 있는데,
같은 이름의 이미지명과 태그를 입력해 commit 하게 되면 commit 이 안되는게 아니고, 이름과 태그 둘다 none 으로 입력된다.

이렇게 해서 특정 시간마다 배치작업을 설정하게 되면, 3시간이 지난 이미지는 알아서 날아가고, 시간마다 새로운 이미지가 생성된다.
압축까지 해서 보관하는 방법도 있는데, 나는 그렇게까진 안하고.. latest 4시간만 보관하기로 했다.
2018/03/13 10:24 2018/03/13 10:24