도커 이미지 확인
이번 포스팅은 도커 이미지 확인 관련 4가지 핵심 내용을 다룹니다. 도커 이미지 확인 명령어로는 아래의 3가지를 활용합니다.
- docker image ls,
- docker image inspect
- docker image history
이 3가지 명령어를 기반으로 이미지 내용 정보, 버전 훅은 태그, 이름, 레이어, 용량, 컨테이너 이미지, Dockerfile
등을 확인하는 방법을 정리하겠습니다.
1. 도커 이미지 확인 명령어
1.1. 대략적인 정보를 알 수 있는 ls 명령어
도커 이미지 내용 확인을 위한 가장 가본적인 ls
명령어부터 알아보겠습니다. 이 명령어를 통해, 원하는 도커 이미지에 대한 대략적인 정보를 확인할 수 있습니다.
기본적인 형태는 다음과 같습니다.
$ docker image ls [OPTIONS] [REPOSITORY[:TAG]]
일반적으로, 현재 도커 환경에 저장되어 있는 모든 이미지 목록과 정보를 조회하며, [REPOSITORY[:TAG]]
부분을 입력하면 특정 도커 이미지 내용 확인에 사용할 수 있습니다.
예를 들어, 다음과 같이 이미지의 이름(저장소 이름) 과 태그(버전)를 입력하면,
$ docker image ls nginx:latest
아래와 같은 정보를 얻을 수 있습니다. 앞에서부터 이미지 이름과 태그 정보, 고유한 ID, 생성된 시간, 이미지 크기를 의미합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f9c14fe76d50 4 days ago 143MB
이전 도커 명령어 docker images
도 같은 기능을 하지만, 더 체계적으로 구성된 최신 명령어 사용을 추천합니다.
1.2. '특정 이미지에 대한 상세 정보를 알 수 있는 inspect 명령어
섹션 1.1.에서 본 ls
명령어는 이미지의 이름, 태그, ID, 생성 시간, 용량, 이렇게 5개의 정보를 출력합니다.
inspect
명령어는 이들을 포함해서 특정 이미지에 대한 모든 상세 정보를 출력합니다.
기본 형식은 다음과 같습니다.
docker image inspect [OPTIONS] IMAGE [IMAGE...]
명령어를 실행하면, 스크롤을 한참 해야 할 양의 정보가 JSON 형식으로 출력됩니다.
도커는 특정 정보만 필요할 때도 이 많은 양의 데이터를 계속 출력해야 할 필요가 없도록 --format
옵션을 제공합니다.
이 옵션은 Go 템플릿 문법을 활용해 원하는 정보들만 선택 출력할 수 있도록 합니다.
--format
옵션에 대한 자세한 사용법은 도커 컨테이너 확인 - 섹션 1.2 를 참고해주세요.
다음 섹션에서는 ls
, inspect
명령어와 --format
옵션을 활용해서 원하는 정보만 출력하는 작업을 하나씩 해보겠습니다.
2. 도커 이미지 내용 정보 확인
도커 사용자들이 자주 질문하는 이미지의 이름, 버전/태그, 레이어, 용량 확인 방법을 하나씩 알아보겠습니다.
2.1. 이미지 이름 확인
도커 이미지는 아직 컨테이너로 인스턴스화 되지 않은 상태의 개체입니다. 따라서, 별도의 이름은 없고, repository 이름을 이미지 이름이라고 할 수 있습니다. repository 이름은 해당 이미지의 Docker Hub 저장소 이름이며, Ubuntu, Nginx 등 상용 서비스는 공식 이미지라는 표시가 되어 있습니다.
현재 도커 환경에 저장된 모든 이미지 이름 확인은 docker image ls
명령어가 출력한 목록의 REPOSITORY
항목을 통해 가능합니다.
2.2. 이미지 버전 / 태그 확인
도커 이미지의 버전 혹은 태그 확인 우선 ls
명령어로 가능합니다. 이미지 리스트의 TAG
항목을 확인하면 됩니다.
또 다른 방법으로는, inspect
명령어가 출력한 내용 중 RepoTags
항목을 확인할 수도 있습니다. 아래 명령어를 입력해서 확인할 수 있습니다.
$ docker image inspect --format '{ {.RepoTags} }' nginx
[nginx:latest]
$ docker image inspect --format '{ {.RepoTags} }' mariadb:10.6
[mariadb:10.6]'
2.3. 이미지 레이어 확인
도커 이미지는 여러 층의 레이어로 이루어져 있습니다. 각 레이어는 특정 작업을 포함하고 있으며, 서로 다른 이미지가 같은 레이어를 재사용하기도 합니다. 따라서, 레이어를 어떻게 구성하냐가 도커 이미지의 용량과 동작 속도를 좌우할 수도 있습니다.
도커는 레이어 정보를 정확하게 제공하지는 않습니다.
하지만, inspect
, history
2가지 명령어의 내용을 통해 어느 정도 추론할 수는 있습니다.
실제 레이어 내용은 서드파티 도구를 활용해 보다 자세하게 확인할 수 있습니다.
우선, inspect
명령어를 통해 이미지가 포함하는 레이어들의 해시값을 확인할 수 있습니다.
출력된 내용 중 RootFS
항목 내 Layers
항목을 보면 됩니다. 해시값들만 출력하려면 다음 명령어를 사용할 수 있습니다.
$ docker image inspect --format '{ {.RootFS.Layers} }' nginx
[sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3 sha256:4b8862fe7056d8a3c2c0910eb38ebb8fc08785eaa1f9f53b2043bf7ca8adbafb sha256:e60266289ce4a890aaf52b93228090998e28220aef04f128704141864992dd15 sha256:7daac92f43be84ad9675f94875c1a00357b975d6c58b11d17104e0a0e04da370 sha256:5e099cf3f3c83c449b8c062f944ac025c9bf2dd7ec255837c53430021f5a1517 sha256:4fd83434130318dede62defafcc5853d03dae8636eccfa1b9dcd385d92e3ff19]
도커는 해시값을 이용해 특정 레이어의 내용을 검색하는 등의 기능을 제공하지는 않습니다. 단지 이미지 간에 같은 레이어를 공유한다는 것을 확인할 수 있는 정도입니다.
이미지를 구성하는 레이어들이 어떤 명령어를 구동하는지는 docker image history
명령어를 통해 확인할 수 있습니다.
이 명령어들은 Dockerfile
기반으로 되어 있기 때문에 특정 레이어와 매칭되지는 않습니다.
명령어 실행 결과는 다음과 같으며, --no-trunc
옵션을 추가하면 생략되지 않은 보다 자세한 정보를 얻을 수 있습니다.
$ docker image history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
f9c14fe76d50 5 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 5 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 5 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 5 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 5 days ago /bin/sh -c #(nop) COPY file:e57eef017a414ca7… 4.62kB
<missing> 5 days ago /bin/sh -c #(nop) COPY file:36429cfeeb299f99… 3.01kB
<missing> 5 days ago /bin/sh -c #(nop) COPY file:5c18272734349488… 2.12kB
<missing> 5 days ago /bin/sh -c #(nop) COPY file:7b307b62e82255f0… 1.62kB
<missing> 5 days ago /bin/sh -c set -x && addgroup --system -… 62MB
<missing> 5 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 5 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.12 0B
<missing> 5 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.25.0 0B
<missing> 6 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 7 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 7 days ago /bin/sh -c #(nop) ADD file:88252a7f118b4d6f5… 80.5MB
도커의 내장 기능으로 확인할 수 없는 내용들은 Dive (opens in a new tab) 와 같은 서드 파티 도구를 이용해 확인해보는 것도 좋은 방법입니다. Dive는 이미지를 분석하고, 각 레이어의 내용과 최적화 방법까지 제공합니다. 이후, 유사한 작업을 하는 다른 도구들과 묶어서 새 포스팅으로 다뤄보겠습니다.
2.4. 이미지 용량 확인
이미지 용량은 ls
명령어에서 보기 좋게 출력해줍니다. SIZE
항목으로 확인할 수 있으며, 용량 값만 출력하라면 다음 명령어를 활용할 수 있습니다.
$ docker image ls --format '{ {.Size} }' nginx:latest
l43MB
inpect
명령어의 내용은 Byte 단위로 용량을 제공하며, Size
항목을 확인하면 됩니다.
$ docker image inspect --format '{ {.Size} }' nginx
142560184
3. 특정 컨테이너의 이미지 확인
특정 컨테이너의 이미지 이름 정도는 container ls
명령어로 확인할 수 있습니다.
$ docker container ls --all
CONTAINER ID IMAGE COMMAND ...
55d8d5e95e61 mariadb:10.6 "docker-entrypoint.s…"
혹은, 환경변수를 포함한 더 상세한 내용과 함께, container inspect
명령어 실행 결과 중 Config.Image
항목에서 확인할 수도 있습니다.
$ docker container inspect --format '{ {.Config.Image} }' 55d8mariadb:10.6
4. 이미지의 Dockerfile 확인
도커 이미지는 Dockerfile
기반으로 생성하며, 이미 생성된 이미지는 Dockerfile
에 대한 정보를 저장하고 있지 않습니다.
섹션 2.'3 에서 살펴본 history
명령어를 통해 Dockerfile
내용을 어느 정도 추론해볼 수는 있지만, ADD
, COPY
등 히스토리에 존재하지 않는 내용들도 있습니다.
따라서, Docker Hub 에서 검색할 수 있는 이미지라면 검색으로 내용을 확인하며, 커스텀 이미지라면 Dockerfile
도 함께 공유하는 것이 좋습니다.
5. 마치며
이번 시간에는 ls
, inspect
, history
, 이렇게 3가지 명령어를 기반으로 이미지 내용 정보, 버전 훅은 태그, 이름, 레이어, 용량, 컨테이너 이미지, Dockerfile
등을 확인하는 방법을 정리했습니다.
이미지 내용 확인이 필요한 경우에 유용하게 사용할 수 있으면 좋겠습니다.