이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Docker

18. Docker image layer 정보 확인

이쿠우우 2022. 7. 5. 08:23
반응형

 

 

 
 
 

docker image layer 정보 확인

 
 

 

목표

docker 명령을 통해 pull 받은 image layer는 어디에 저장되고
실행되고 있는 container의 directory는 host에서 어떻게 관리하는지 알아봄.
 
 
 

 

Test 환경

 
[Docker : 20.10.12]

 

 

 
 
 

Docker image layer 정보 확인

 
 
결론부터 말하자면 docker로 pull 받은
image layer 정보는 
/var/lib/docker/overlay2/
에 저장됨
 

image 하나를 예로 설명.

 
docker image 목록 중 python:3.8
image를 구성하는 layer 정보로 설명
 
[image 확인]

 
[해당 python image layer 정보 확인]
명령어 
docker inspect python:3.8
 
[결과]
RootFS > Layers 항목에서 
image를 구성하는 layer의 hash data를 확인할 수 있음
조회된 항목은 low layer 정보임.
실제로 layer 정보 중 한곳으로 이동해보면
data를 확인해볼 수 있음.

 
 

image layer hash data를 저장하고 있는 경로로 이동

 
[경로]
/var/lib/docker/image/overlay2/layerdb/sha256
해당 경로에는 유니온 마운트를 구성하는 low layer, upper layer의 hash data들이 모두 저장되어있음.

 
확인했던 layer hash 값으로 이동
 
[결과]

 
 

layer hash값이 가리키는 실제 layer directory name 확인

 
[cache-id 값을 확인]
1f2f4c1bb8db726710a1830a215d70eb57534756d33263847a940c0a8c4cdb9c

 
 

실제 layer 정보를 가지고 있는 directory로 이동

 
/var/lib/docker/overlay2/ 
directory로 이동하면 모든 layer 정보를 확인할 수 있음.
low, upper, merge layer가 모두 해당 위치에 저장되어있음.

 
이 중에 확인했던 
1f2f4c1bb8db726710a1830a215d70eb57534756d33263847a940c0a8c4cdb9c
directory로 이동

 
여기서 diff directory에 가보면
layer가 가지고 있는 파일정보를 확인할 수 있음

 
image를 실행한다면
이러한 low layer 정보를 모두 merge하고
위에 upper layer를 추가해서 container를 실행하게 됨.
 
[Docker 설정 파일 경로]
Docker 설정 파일 경로
/var/lib/docker/
/var/lib/docker/
/var/lib/docker/
C:\ProgramData\DockerDesktop
~/Library/Containers/com.docker.docker/Data/vms/0/
 
 

 
 

/var/lib/docker/overlay2 분석

 
위에서 설명한대로
/var/lib/docker/overlay2
해당 경로로 이동하면 docker를 통해 실행했던 container 정보를 확인할 수 있음
 
 
 

/var/lib/docker/overlay2/l

 
여기서 "l" directory가 있음.
/var/lib/docker/overlay2/l
해당 directory는 "layer의 link" 정보를 가지고 있음.
아래와 같이 특정 hash 값이 
/var/lib/docker/overlay2 경로에 있는 실제 image layer 파일을 가리키고 있음.

 
 
 

 
 
 
 

/var/lib/docker/overlay2 분석

 
host에서 docker로 실행중인 container 1개를 예제로 
/var/lib/docker/overlay2에 저장되어있는 정보의 관계성을 파악해봄.
 

 

 

host에서 docker를 통해 실행 중인 container 확인

 
[명령어]
mount | grep "overlay on" | awk '{print $3}' | grep docker
 
[결과]

해당 경로로 이동해보면 아래와 같이 
실제 container의 directory 구조를 확인할 수 있음.

즉 해당 layer는 merge layer를 뜻함.
merge layer = 실행 중인 container
 
 

merge container 가 어떻게 구성되어있는지 확인

 
위에서 알아본 바와같이 merge directory에는 
container의 directory 구조를 확인할 수 있음.

 
[merged]
해당 directory가 실제 container의 directory와 같음.

 
[link]
해당 layer의 link 값이 저장되어있음.

MEQL4LN723OROCKDXDQNUWIKOI 값을 
"/var/lib/docker/overlay2/l" 확인해보면 다음과 같이 실제 layer 경로를 가리킴

 
[lower]
이러한 merge layer는 어떤 low layer들이 곂쳐져서 만들었는지 알아보기 위해선
"lower" 파일을 확인해보면 됨.

 
l/AJR5MSCWJB44ITYUCA3PNQSBSB:l/52SEJVHDSYMLTVZJQ6B5NPDIXY
 
이와 같이 특정 링크 정보를 확인 할 수 있음.
해당 경로로 이동.
 
 

low layer 링크로 이동

해당 링크는 특정 layer의 diff 경로를 가리킴

 
실제로 이동해보면 다음과 같은 정보를 확인해볼 수 있음.
 
[ l/AJR5MSCWJB44ITYUCA3PNQSBSB ]

 
[ l/52SEJVHDSYMLTVZJQ6B5NPDIXY ]

 
이와 같이 해당 2개의 low layer가 합쳐저서
아래와 같은 merge layer로 이루어져있음.

 
 

일반 low layer 파일 정보 확인

일반 low layer는 다음과 같음

 
[diff]
해당 low layer가 가지고 있는 directory, file 정보들이 저장되어있음.

 
[link]
해당 layer의 link 값이 저장되어있음.
 
 

init low layer 파일 정보 확인

low layer로 사용되는 것 자체도
다른 low layer들이 merge되어서 만들어진 low layer일 수 있음.
layer 이름 뒤에 init 이 추가되어 있음.

 
[link]
해당 layer의 link 값이 저장되어있음.
 
[lower]
어떤 low layer로 구성이되어있는지 알 수 있음.

 
[diff]
해당 low layer가 가지고 있는 directory, file 정보들이 저장되어있음.

 
 
 

init 과 일반의 차이

 
/var/lib/docker/overlay2 를 확인해보면
layer 이름은 동일한데 뒤에 init이 붙어있는 것들이 있음.

해당 두개 layer의 차이점을 확인해보면 아래와 같음.

즉 init이 붙어있는 layer는 low layer에 해당하고
없는 layer는 해당 layer 자체가 merge로도 사용될 수 있는 것을 의미함.
 
실제로 container 개발 시 
python image를 받고
그 위에 어플리케이션을 추가해서
새로운 image를 만들어서 
해당 image를 사용하는 경우가 많은데
이때 python image는 이와 같이
일반, init layer로 별도로 관리함.
python image 자체를 container로 실행하면 해당 이름의 layer로 실행,
python image가 다른 image의 low layer로 구성되어있다면 init 이름의 layer로 사용됨.
반응형