ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] 도커 이미지
    컨테이너/도커 2021. 1. 2. 02:47

    2.3 도커 이미지

     

    도커 허브와 도커 엔진

     

    도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다(도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저장소). 

     

    # docker search ubuntu

     

    *docker search 명령어는 도커 허브에서 이미지를 검색하며, 도커 허브 이미지임을 명시하기 위해  docker.io/ubuntu와 같이 docker.io 접두어를 사용할 수 있다. 허나 일반적으로 최상위 접두어를 명시하지 않으면 도커 허브의 이미지를 의미한다.

     

    2.3.1 도커 이미지 생성

    1) 컨테이너 안에서 작업한 내용을 이미지로 생성

    # docker run -i -t --name commit_test ubuntu:14.04
    
    
    
    # docker commit \
    -a "seho100" -m "my first commit" \
    commit_test \                                       // 컨테이너 이름
    commit_test:first                                   // 생성되는 이미지 이름

     

    ▷ -a 옵션은 author를 뜻하며 이미지의 작성자를 나타내는 메타데이터를 이미지에 포함시킨다.

    ▷ -m 옵션은 커밋 메시지를 뜻한다.

     

     

    2) 기존 이미지로 새로운 이미지를 생성

    # docker run -i -t --name commit_test2 commit_test:first
    
    
    
    # docker commit \
    -a "seho100" -m "my second commit" \
    commit_test2 \
    commit_test:second

     

     

    2.3.2 도커 이미지 구조

     

    도커 이미지는 layer라는 계층구조를 가지고 있다. 

     

     

    도커 이미지의 계층구조 Layer

     

    도커 이미지의 Layer 정보를 확인하려면 docker inspect 명령어로 확인할 수 있다.

     

    # docker inspect ubuntu:14.04

     

     

    여기서 의문이 드는 부분은 이미지를 생성할 때 마다 size가 188MB씩 늘어나는데 매번 commit 할 때마다 용량이 늘어나는 것인가?

     

    # docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    layer_test          second              303124b8ac57        2 minutes ago       188 MB
    layer_test          first               48f47ef8257d        2 minutes ago       188 MB
    docker.io/ubuntu    14.04               5dbc3f318ea5        4 weeks ago         188 MB

     

    결론부터 말하자면 188MB 크기의 이미지가 3개 존재하는 것은 아니다.

    이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성하기 때문에 전체 이미지의 실제 크기는 188MB + first파일의 크기 + second파일의 크기가 된다.

     

    그럼 layer_test:second는 layer_test:first 기반으로 만들어진 이미지인데 layer_test:first가 삭제되면 layer_test:second는 어떻게 될까?

     

    이 경우 layer_test:first를 부모로 두고 있는 자식 layer_test:second가 살아 있기 때문에 layer_test:first의 Layer 내용은 보존된 채로 layer_test:first라는 이미지 이름만 사라지게 된다.

     

     

     

    2.3.3 이미지 추출

     

    도커 이미지를 별도로 저장하거나 옮길 때 단일 바니어리 파일로 저장해야 할 때가 있다. docker save 명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있다.

     

    -o 옵션에는 추출될 파일명을 입력한다.

    • save, load
    # docker save -o ubuntu_14_04.tar ubuntu:14.04          // 이미지를 하나의 파일로 추출
       
    
    # docker load -i ubuntu_14_04.tar                       // 이미지를 로드하여 도커 엔진에 의해 생성

     

    • export, import : 이미지로 만든 컨테이너가 생성될 때 설정된 detached 모드, 컨테이너 커맨드와 같은 컨테이너의 설정 정보를 저장하지 않고 컨테이너의 파일시스템을 tar 파일로 추출한다.
    # docker export -o rootFS.tar mycontainer
    
    
    # docker import rootFS.tar myimage:0.0

     

    그러나 이미지를 단일 파일로 저장하는 것은 효율적이지 않다.

    추출된 이미지는 Layer 구조의 파일이 아닌 단일 파일이기 때문에 여러 버전의 이미지를 추출할수록 이미지 용량을 각기 차지하게 된다.

    '컨테이너 > 도커' 카테고리의 다른 글

    [Docker] 도커 컴포즈  (0) 2021.01.13
    [Docker] 이미지 배포  (0) 2021.01.06

    댓글

Designed by Tistory.