도커 이미지를 생성하고 추출하기

이주희·2022년 11월 4일
0

Docker

목록 보기
11/16

1. 도커 이미지

  • 도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다.

2. 도커 허브

  • 도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저장소

  • 도커 계정을 가지고 있다면누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들에게 이미지를 쉽게 공유할 수 있다.

  • 누구나 이미지를 올릴 수 있기 때문에 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 수 있다.

  • 비공개(Private) 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다.


2-1. 도커 허브에서 이미지 검색

docker search 이미지명
  • 도커 허브에서 이미지를 검색한다.
  • START: 해당 이미지가 도커 사용자로부터 즐겨찾기(star) 된 수

3. commit :: 도커 이미지 생성하기

컨테이너 안에서 작업한 내용을 이미지로 만들기

1. 이미지로 만들 컨테이너를 생성하고 변경사항을 만든다.

first라는 이름의 파일을 하나 생성해 기존의 이미지로부터 변경사항을 만들었다.

2. 컨테이너에서 호스트로 빠져나와서 컨테이너를 이미지로 만든다.

docker commit 
-a "juhee" // author, 작성자를 나타내는 메타데이터를 이미지에 포함시키는 옵션
-m "my first commit" // 커밋 메세지, 이미지에 포함될 부가 설명 옵션
commit_test // 커밋할_컨테이너 
commit_test:first // [REPOSITORY[:TAG]] 생성될_이미지_이름

이미지가 생성되었다!

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 도커 사설 레지스트리를 사용하자!

profile
🍓e-juhee.tistory.com 👈🏻 이사중

0개의 댓글