Docker (6) - 이미지를 파일로 저장하고 관리하기
1. 개요
지금까지는 이미지를 항상 Docker Hub 같은 레지스트리에서 pull로 받아서 사용했다. 그런데 인터넷이 안 되는 폐쇄망이거나, 레지스트리를 거치지 않고 이미지를 바로 다른 서버로 옮기고 싶을 때는 이미지를 파일(tar)로 통째로 내보내고 다시 불러오는 방법이 필요하다.
이번 글에서는 이미지를 파일로 저장(save)하고 불러오는(load) 방법과, 더 이상 쓰지 않는 이미지를 정리하는 방법을 정리한다.
2. 이미지를 tar 파일로 저장하고 불러오기
docker image save는 이미지의 레이어 구조까지 그대로 보존한 상태로 tar 파일로 압축해준다. 단순히 파일 하나로 묶는 게 아니라, 원본 이미지와 동일하게 복원할 수 있는 형태로 저장된다는 점이 핵심이다.
1
2
3
4
5
# 저장
docker image save [옵션] 이미지이름 > 파일경로
# 로드
docker image load < 파일경로
실습 흐름
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1) 이미지 다운로드
docker pull eclipse/mysql
# 2) 이미지 확인
docker images
docker image ls -aq
# 3) 이미지를 tar로 저장
docker image save eclipse/mysql > test_mysql.tar
# 4) 파일 확인
ls
# 5) tar 파일로부터 이미지 다시 불러오기
docker image load < test_mysql.tar
>, <로 리다이렉션을 쓰는 형태이기 때문에, 저장한 tar 파일을 USB나 스카피(scp)로 다른 서버에 옮긴 뒤 그 서버에서 load만 해주면 레지스트리 없이도 동일한 이미지를 그대로 재현할 수 있다.
3. 이미지 삭제와 정리
이미지 삭제
1
docker image rm [옵션] {이미지이름[:태그] | imageID}
docker image rm 대신 docker rmi로 줄여 써도 동일하게 동작한다.
| 옵션 | 의미 |
|---|---|
-f, --force | 강제 삭제 |
-a, --all | 모든 이미지 관련 작업에 적용 |
--no-prune | 삭제 후 dangling 상태가 된 parent 이미지를 자동으로 지우지 않음 |
셸의 커맨드 치환($(명령어))을 활용하면 전체 이미지를 한 번에 지울 수도 있다.
1
2
docker rmi $(docker images -q)
docker rmi -f $(docker images -q)
사용하지 않는 이미지 정리
컨테이너가 하나도 참조하지 않는 이미지만 골라서 지우고 싶다면 prune을 쓰는 게 더 안전하다.
1
docker image prune -a
4. 정리
이미지를 tar 파일로 저장/로드하는 기능은 레지스트리를 거치지 않고 이미지를 다른 환경으로 옮기거나 백업해둘 때 유용하다. save는 레이어 구조를 그대로 보존하기 때문에 load로 불러온 이미지는 원본과 동일하게 동작한다.
이미지가 쌓이다 보면 디스크 공간을 많이 차지하게 되는데, 특정 이미지를 지울 때는 docker rmi, 사용 중이 아닌 이미지를 한꺼번에 정리할 때는 docker image prune -a를 상황에 맞게 구분해서 쓰면 된다.