Docker & Kubernetes

도커 이미지(Docker Image) 관리하기

beekei 2022. 12. 29. 15:20
반응형

모든 컨테이너는 이미지를 기반으로 생성되므로 이미지를 다루는 방법은 도커 관리에서 빼놓을 수 없는 부분이다.

이미지의 이름을 구성하는 저장소, 이미지 이름, 태그를 잘 관리하는 것뿐만 아니라 이미지가 어떻게 생성되고 삭제되는지, 이미지 구조는 어떻게 돼 있는지 등을 아는 것 또한 중요하다.

 

도커 허브(Docker Hub)

도커 허브(Docker Hub)는 도커가 공식적으로 제공하고 있는 이미지 저장소로서, 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들과 이미지를 쉽게 공유할 수 있다.

대부분의 이미지는 도커 허브에서 공식적으로 제공하거나 다른 사람들이 도커 허브에 이미 올려놓은 경우가 대부분이라서 애플리케이션 이미지를 직접 만들지 않아도 손쉽게 사용할 수 있는데, 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을수도 있다.

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


도커 이미지 찾기

도커 허브에서 어떤 이미지가 있는지 확인하기 위해 도커 허브 사이트를 직접 접속해서 찾아볼 수도 있지만 도커 엔진에서 docker search 명령어를 사용할 수도 있다.

$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   15390     [OK]
websphere-liberty                WebSphere Liberty multi-architecture images …   291       [OK]
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   112       [OK]
...

출력 결과에서 STARS는 사용자의 즐겨찾기 수를 나타낸다.

docker search 명령어는 도커 허브에서 이미지를 검색하며, 도커 허브 이미지임을 명시하기 위해 docker.io/ubuntu와 같이 docker.io 접두어를 사용할 수도 있다.


도커 이미지 생성

docker search로 검색한 이미지를 pull 명령어로 내려받아 사용할 수도 있지만 특정 개발 환경을 직접 구현한 뒤 이미지를 직접 생성해야할 경우가 있다.

$ docker -i -t --name ubuntu ubuntu:20.04
$ root@e20ab79f07f5:/home# vim test.txt
docker image create test
$ root@e20ab79f07f5:/home# cat test.txt
docker image create test
$ exit
$ docker commit -a "devbeekei" -m "docker image create test" ubuntu ubuntu_test:first
sha256:fdb516e9a622120b47dc0b4ee5e21db43377282500bce8d479e826fde6968322

위 예제는 ubuntu:20.04 컨테이너 안에 파일을 생성하고 ubuntu라는 이름의 컨테이너를 ubuntu_test라는 이미지 이름과 first라는 태그로 이미지를 생성하였다.  -a 옵션은 작성자(author)를 뜻하며 -m 옵션은 설명 메세지를 뜻한다.

$ docker images
REPOSITORY                         TAG       IMAGE ID       CREATED              SIZE
ubuntu_test                        first     fdb516e9a622   About a minute ago   181MB
ubuntu                             20.04     d5447fc01ae6   2 weeks ago          72.8MB

이미지 구조 이해

이미지를 좀 더 효율적으로 다루기 위해 컨테이너가 어떻게 이미지로 만들어지며, 이미지의 구조는 어떻게 돼 있는지 알 필요가 있다.

$ docker inspect ubuntu:20.04
...
"RootFS": {
    "Type": "layers",
    "Layers": [
        "sha256:0002c93bdb3704dd9e36ce5153ef637f84de253015f3ee330468dccdeacad60b"
    ]
},
...

$ docker inspect ubuntu_test:first
...
"RootFS": {
    "Type": "layers",
    "Layers": [
        "sha256:0002c93bdb3704dd9e36ce5153ef637f84de253015f3ee330468dccdeacad60b",
        "sha256:99a3b06363ed6786e5260c3d865615a8ea3bb24b39f238b241674a0fb8e9270e"
    ]
},
...

이미지 상세 정보를 확인해보면 Layers 항목에 값이 하나 더 추가되어있는데, 위에서 commit한 내용이 추가된 것이다.

docker history 명령어를 사용해 좀 더 쉽게 확인이 가능하다.

$ docker history ubuntu:20.04
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
d5447fc01ae6   2 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      2 weeks ago   /bin/sh -c #(nop) ADD file:9d282119af0c42bc8…   72.8MB

$ docker history ubuntu_test:first
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
fdb516e9a622   34 minutes ago   bash                                            108MB     docker image create test
d5447fc01ae6   2 weeks ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      2 weeks ago      /bin/sh -c #(nop) ADD file:9d282119af0c42bc8…   72.8MB

이미지 추출

도커 이미지를 별도로 저장하거나 옭기는 등 필요에 따라 이미지를 단일 바이너리 파일로 저장해야 할 때는 docker save 명령어를 통해 하나의 파일로 추출이 가능하다.

$ docker save -o ubuntu.tar ubuntu:20.04

-o 옵션에는 추출할 파일명을 설정할 수 있다.

추출된 이미지는 load 명령어로 도커에서 다시 로드할 수 있다.

추출된 이미지는 모든 메타데이터를 포함하기 때문에 load 명령어로 이미지를 로드하면 이전의 이미지와 완전히 동일한 이미지가 도커 엔진에 생성된다.

$ docker rmi ubuntu:20.04
$ docker images
REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE

$ docker load -i ubuntu.tar
$ docker images
REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE
ubuntu                             20.04     d5447fc01ae6   2 weeks ago     72.8MB

save, load 명령어와 유사하게 사용할 수 있는 명령어로 export, import가 있는데 export 명령어는 컨테이너의 파일시스템을 tar 파일로 추출하며 컨테이너 및 이미지에 대한 정보를 저장하지 않는다.

반응형