Docker 이미지 내부 구조 살펴보기
Dockerfile을 이용해 이미지를 빌드했다면, 그 이미지가 실제로 어떻게 구성되어 있는지 내부 구조를 살펴보는 것이 중요합니다. 이미지의 계층(layer) 구조와 메타데이터를 분석하면 Dockerfile 작성 및 최적화에 도움이 됩니다.
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 BY | Dockerfile에서 해당 계층을 만든 명령어 내용 |
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
파일 형태로 저장합니다. - 이는 다른 시스템에 전송하거나, 백업을 위해 파일로 추출할 때 사용됩니다.
- 저장된 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
명령어를 사용하면 저장한 이미지를 다시 도커에 복원할 수 있습니다.
이 명령어 조합은 도커 이미지의 전체 구조를 파일 수준에서 분석하거나, 다른 환경으로 이식할 때 매우 유용합니다.