Post

Docker 이미지 내부 구조 살펴보기

docker images, history, inspect 명령어를 통해 도커 이미지의 내부 계층 구조와 메타데이터를 분석하는 실습을 정리합니다.

Docker 이미지 내부 구조 살펴보기

Docker 이미지 내부 구조 살펴보기

Dockerfile을 이용해 이미지를 빌드했다면, 그 이미지가 실제로 어떻게 구성되어 있는지 내부 구조를 살펴보는 것이 중요합니다. 이미지의 계층(layer) 구조와 메타데이터를 분석하면 Dockerfile 작성 및 최적화에 도움이 됩니다.

1. docker images로 이미지 목록 확인

도커 이미지가 정상적으로 빌드되었는지 확인하려면 다음 명령어를 사용합니다:

1
docker images
  • 역할: 현재 시스템에 존재하는 모든 도커 이미지 목록을 확인합니다.
  • TIP: docker image ls도 동일한 명령입니다.

출력 예시

1
2
3
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
hello-docker    latest    a1b2c3d4e5f6    2 minutes ago    24.1MB
python          3.12      8c12345abcd1    1 week ago       54.3MB

출력 항목 설명

항목설명
REPOSITORY이미지 이름. docker build -t로 설정한 값 또는 기본 이미지 이름
TAG이미지 버전 태그. 기본은 latest
IMAGE ID도커 이미지 고유 식별자 (SHA 축약 형태)
CREATED이미지가 만들어진 시간 (상대 시간으로 표시됨)
SIZE이미지의 디스크 상 크기. 이 크기는 중복된 계층을 제외한 순수 용량을 의미함

이 정보를 통해 어떤 이미지가 언제 만들어졌고, 얼마만큼의 용량을 차지하고 있는지를 쉽게 확인할 수 있습니다.

2. docker history로 계층(Layer) 확인

이미지가 어떤 명령어로 구성되었는지 확인할 수 있습니다:

1
docker history hello-docker
  • 역할: Dockerfile의 각 명령어가 이미지에 쌓인 계층으로 어떻게 기록되어 있는지 확인할 수 있습니다.
  • 특징: 위에서 아래로, 가장 최근 명령어부터 FROM까지 계층이 표시됩니다.
  • 활용: 어떤 명령어가 이미지 용량을 가장 많이 차지하는지 파악하고 최적화할 수 있습니다.

출력 예시

1
2
3
4
5
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
abc123def456   2 minutes ago   CMD ["python" "hello.py"]                      0B        
<missing>      2 minutes ago   COPY hello.py .                                 150B      
<missing>      2 minutes ago   WORKDIR /app                                    0B        
<missing>      2 minutes ago   FROM python:3.12                                24MB      

출력 항목 설명

항목설명
IMAGE각 계층의 이미지 ID 또는 <missing> (중간 계층은 이름 없음)
CREATED계층이 생성된 시점. docker build 시점과 일치함
CREATED BYDockerfile에서 해당 계층을 만든 명령어 내용
SIZE해당 계층의 크기. 파일 복사나 설치가 있는 단계는 크기가 큼
COMMENT주석 또는 자동 생성 정보 (보통은 비어 있음)

이 명령어는 이미지 용량 최적화에 유용하며, 어떤 Dockerfile 명령이 캐시를 유발했는지 확인할 때도 쓰입니다.

3. docker inspect로 메타데이터 분석

1
docker inspect hello-docker
  • 역할: 이미지의 메타데이터 전체를 JSON 형식으로 출력합니다.
  • 활용: 컨테이너의 기본 명령어, 환경 변수, 계층 구조 등 다양한 설정 값을 확인하거나 디버깅에 사용합니다.
  • TIP: jq를 활용해 원하는 항목만 추출 가능
1
docker inspect hello-docker | jq '.[0].Config.Cmd'

출력 예시 (일부)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[
  {
    "Id": "sha256:abc123...",
    "Config": {
      "Cmd": ["python", "hello.py"],
      "Env": ["PYTHONUNBUFFERED=1"],
      "WorkingDir": "/app"
    },
    "ContainerConfig": {
      "Image": "python:3.12"
    },
    "RootFS": {
      "Layers": [
        "sha256:layer1...",
        "sha256:layer2..."
      ]
    }
  }
]

주요 항목 설명

항목설명
Config.Cmd컨테이너가 실행될 때 기본으로 실행되는 명령어 (Dockerfile의 CMD와 동일)
Config.Env설정된 환경 변수 목록 (Dockerfile의 ENV)
Config.WorkingDir컨테이너 내 기본 작업 디렉토리 (WORKDIR)
ContainerConfig.Image해당 이미지가 생성될 때 기반이 된 베이스 이미지 정보
RootFS.Layers이미지의 실제 계층 SHA 해시 목록. 변경 내역을 추적하거나 저장 구조 확인에 사용

이 명령어는 이미지 내부 설정을 정확하게 파악하고 싶을 때 반드시 사용해야 하는 도구입니다.

4. docker image ls, docker image inspect, docker image history

docker image는 이미지 관련 기능만을 명확히 다루기 위한 서브명령어 집합입니다. 기존의 docker images, docker inspect, docker history와 기능은 동일하지만, 의도를 더 명확하게 표현할 수 있다는 장점이 있습니다.

1
docker image ls         # = docker images
  • 이미지 목록을 확인하는 명령어입니다.
  • 출력 항목은 REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 등이며, 이미지의 전체 목록을 확인할 수 있습니다.
1
docker image inspect hello-docker
  • 이미지에 대한 상세 메타데이터를 JSON 형태로 출력합니다.
  • Config, RootFS, ContainerConfig 등의 필드를 통해 이미지의 설정, 레이어, 환경 등을 확인할 수 있습니다.
1
docker image history hello-docker
  • 이미지가 Dockerfile의 어떤 명령어를 통해 생성되었는지 계층별로 보여줍니다.
  • 각각의 계층은 어떤 명령에 의해 생성되었고, 얼마나 많은 용량을 차지하는지 확인할 수 있습니다.

언제 이 형식을 쓰면 좋을까?

  • docker image는 이미지 관련 명령만 명시적으로 구분하기 때문에 스크립트나 자동화 환경(CI/CD)에서 코드 가독성과 유지보수 측면에서 유리합니다.
  • 또한 docker container, docker volume, docker network와 함께 사용할 때 명령어 그룹이 논리적으로 정리되어 일관성을 유지할 수 있습니다.

5. docker save, docker load를 통한 이미지 파일 확인

1
docker save hello-docker > image.tar
  • 도커 이미지를 .tar 파일 형태로 저장합니다.
  • 이는 다른 시스템에 전송하거나, 백업을 위해 파일로 추출할 때 사용됩니다.
1
tar -tvf image.tar
  • 저장된 tar 파일의 내용을 확인합니다. 내부적으로는 여러 계층(layer) 파일과 설정 정보가 포함되어 있습니다.

출력 예시

1
2
3
4
-rw-r--r--  0 0      0         512 May  9 01:00 manifest.json
-rw-r--r--  0 0      0        1434 May  9 01:00 repositories
-rw-r--r--  0 0      0      231385 May  9 01:00 abc1234567890.tar
-rw-r--r--  0 0      0      309248 May  9 01:00 def9876543210.tar

출력 항목 설명

파일명설명
manifest.json이미지의 계층 및 설정 정보를 담은 JSON 메타데이터 파일
repositories저장된 이미지 이름 및 태그 정보
*.tar각 이미지 계층에 해당하는 파일 시스템 내용. Dockerfile의 COPY, RUN 등의 명령어로 생성된 계층이 포함됨

참고: docker load < image.tar 명령어를 사용하면 저장한 이미지를 다시 도커에 복원할 수 있습니다.

이 명령어 조합은 도커 이미지의 전체 구조를 파일 수준에서 분석하거나, 다른 환경으로 이식할 때 매우 유용합니다.

This post is licensed under CC BY 4.0 by the author.