[Docker] 도커 이미지를 생성하고 추출하기
2022. 11. 4. 21:41ㆍBackend/Docker
728x90
반응형
1. 도커 이미지
- 도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다.
2. 도커 허브
- 도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저장소
- 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들에게 이미지를 쉽게 공유할 수 있다.
- 누구나 이미지를 올릴 수 있기 때문에 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 수 있다.
- 비공개(Private) 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다.
2-1. 도커 허브에서 이미지 검색
docker search 이미지명
- 도커 허브에서 이미지를 검색한다.
START
: 해당 이미지가 도커 사용자로부터 즐겨찾기(star) 된 수
3. commit :: 도커 이미지 생성하기
컨테이너 안에서 작업한 내용을 이미지로 만들기
3-1. 이미지로 만들 컨테이너를 생성하고 변경사항을 만든다.
first
라는 이름의 파일을 하나 생성해 기존의 이미지로부터 변경사항을 만들었다.
3-2. 컨테이너에서 호스트로 빠져나와서 컨테이너를 이미지로 만든다.
docker commit
-a "juhee" // author, 작성자를 나타내는 메타데이터를 이미지에 포함시키는 옵션
-m "my first commit" // 커밋 메세지, 이미지에 포함될 부가 설명 옵션
commit_test // 커밋할_컨테이너
commit_test:first // [REPOSITORY[:TAG]] 생성될_이미지_이름
3-3. 3-2에서 만든 이미지로 새로운 이미지를 생성한다.
1) commit_test:first
이미지로 컨테이너 생성
2) second
파일 추가
3) commit_test:second
이미지 생성
4. Layers :: 이미지 구조 이해하기
- 이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성한다.
- 전체 이미지의 실제 크기는
같은 크기의 이미지가 3개 존재하는 것이 아니라,
ubuntu 파일의 크기 + first의 변경 사항 + second의 변경사항의 크기이다.
docker inspect 이미지명
inspect 명령어는 컨테이너뿐만 아니라 네트워크, 볼륨, 이미지 등 모든 도커 단위의 정보를 얻을 때 사용할 수 있다.
이름이 중복될 경우 컨테이너에 대해 먼저 수행되므로 --type을 명시하는 것이 좋다.
ubuntu
commit_test:first
commit_test:second
이미지의 레이어 구조
이미지가 어떤 레이어로 생성됐는지 출력한다.docker history 이미지명
5. 생성한 이미지 삭제하기
docker rmi commit_test:first
- 이미지를 사용 중인 컨테이너가 존재할 경우, 해당 이미지를 삭제할 수 없다.
- 컨테이너를 삭제한 뒤 이미지를 삭제해야 한다.
Untagged
commit_test:first
이미지를 기반으로 하는 하위 이미지인commit_test:second
가 존재하므로, 실제 이미지 파일을 삭제하지 않고 레이어에 부여된 이름만 삭제했다는 뜻이다.
댕글링 이미지
컨테이너가 사용 중인 이미지를
docker rmi -f
로 강제로 삭제하면, 이미지의 이름이<none>
으로 변경되며, 이러한 이미지들을 댕글링(dangling) 이미지라고 한다.
second
이미지는 사용하고 있는 컨테이너가 없어 바로 삭제가 가능하다.Delete
는 이미지 레이어가 실제로 삭제됐음을 의미한다.
6. 이미지 추출하기
6-1. save/load
추출하기
docker save
-o ubuntu_14.04.tar // 추출될 파일명
ubuntu:14.04
- 도커 이미지를 별도로 저장하거나 옮기는 등 필요에 따라 이미지를 단일 바이너리 파일로 저장해야 할 때가 있다.
docker save
명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있다.
로드하기
docker load -i ubuntu_14.04.tar
- save 명령어로 추출된 이미지는 이미지의 모든 메타데이터를 포함하기 때문에 load 명령어로 이미지를 로드하면 이전의 이미지와 완전히 동일한 이미지가 도커 엔진에 생성된다.
6-2. export/import
docker export -o rootFS.tar // 파일명
mycontainer // 추출할 컨테이너
docker import rootFS.tar
myimage:0.0 // 저장될 이미지의 이름
save/load
명령어와 유사하게 사용할 수 있다.export
명령어는 컨테이너의 파일시스템을tar
파일로 추출하며 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않는다.commit
명령어로 컨테이너를 이미지로 만들면 컨테이너에서 변경된 사항뿐만 아니라 컨테이너가 생성될 때 설정된detached 모드, 컨테이너 커맨드
와 같은 컨테이너의 설정 등도 이미지에 함께 저장된다.
이미지를 단일 파일로 저장하는 것은 효율적인 방법이 아니다.
추출된 이미지는 레이어 구조의 파일이 아닌 단일 파일이기 때문에 여러 버전의 이미지를 추출하면 이미지 용량을 각기 차지하게 된다.
👉🏻 도커 허브 이미지 저장소 or 도커 사설 레지스트리를 사용하자!
728x90
반응형
'Backend > Docker' 카테고리의 다른 글
[Docker] Dockerfile로 이미지 생성하기 (1) | 2022.11.15 |
---|---|
[Docker] 도커 허브 저장소에 이미지 배포하기 (0) | 2022.11.05 |
프론트엔드 개발자도 Docker를 알아야 하나요? (0) | 2022.11.03 |