본문 바로가기

Cloud/Docker

Docker Image 분석

기본적으로 Docker의 image는 build를 하거나 pull을 통해 Docker Hub의 Repository에서 받아오게 됩니다.

 

Docker Container image의 경우, 하기와 같이 기본적인 layer층으로 이뤄져 있습니다.

Dockerfile로 생성된 Docker Image 구조

 

기본적으로 간단한 nginx를 받았을 때, 나타나는 log입니다.

root@kube-master:~# docker pull nginx:latest
latest: Pulling from library/nginx
33847f680f63: Pull complete
dbb907d5159d: Pull complete
8a268f30c42a: Pull complete
b10cf527a02d: Pull complete
c90b090c213b: Pull complete
1f41b2f2bf94: Pull complete
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

 

우선 눈에 띄는 첫 줄과 마지막 줄을 보면, 

root@kube-master:~# docker pull nginx:latest
latest: Pulling from library/nginx
...
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

으로 새로운 nginx의 latest version을 가져오는 곳은 library로 docker의 library입니다.

결국 우리가 nginx:latest라는 것은 결국 docker.io/library/nginx:latest입니다.

 

기본적으로 Docker Image의 이름은 <NAMESPACE>/<IMAGE_NAME>:<TAG> 형식으로 구성된다.

Docker Hub의 공식 Image가 저장되어 있는 특별한 Namespace는 보통 library가 되고, 보통은 사용자의 이름이 옵니다.

ex) official nginx -> library/nginx:latest

    bitnami nginx -> bitnami/nginx-ingress-controller

 

때문에 Docker Image Repository의 Domain에 들어 있는 nginx의 최신 Official한 Image이기 때문에 docker.io/library/nginx:latest가 되는 것입니다.

 

추가로 하기의 sha256:~의 값을 nginx@sha256:~으로 붙여주면 nginx:latest와 같다고 볼 수 있습니다.

root@kube-master:~# docker pull nginx:latest
...
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
...

 

결국은 하기 4가지가 모두 같은 image 주소를 나타내고 있습니다.

  • nginx:latest
  • nginx@sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
  • library/nginx:latest
  • docker.io/library/nginx:latest

 

마지막으로 pull한 고유 ID들입니다.

root@kube-master:~# docker pull nginx:latest
...
33847f680f63: Pull complete
dbb907d5159d: Pull complete
8a268f30c42a: Pull complete
b10cf527a02d: Pull complete
c90b090c213b: Pull complete
1f41b2f2bf94: Pull complete
...

기본적으로 위에서부터 layer1으로 시작해서 nginx는 layer6까지 구성되어 있습니다.

 

해당 값들에 대해서 찾아보기 위해서는 docker data는 가 있는 위치를 찾기 위해서는 docker info를 보면 됩니다.

root@kube-master:~# docker info
...

Server:
...
 Storage Driver: overlay2
...
 Docker Root Dir: /var/lib/docker
...

기본적으로 Storage Driver는 overlay2이며, 이의 Root Directory는 /var/lib/docker에 저장됩니다.

즉 고유 ID들은 sha256값으로 layer image들은 /var/lib/docker/image/overlay2/layerdb/sha256에서 찾으면 됩니다.

 

해당 위치에서 grep으로 찾아본 값들입니다.

# 33847f680f63
root@kube-master:/var/lib/docker/image/overlay2# grep -rin 33847f680f63 .
./distribution/v2metadata-by-diffid/sha256/814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4:1:[{"Digest":"sha256:33847f680f63fb1b343a9fc782e267b5abdbdb50d65d4b9bd2a136291d67cf75","SourceRepository":"docker.io/library/nginx","HMAC":""}]

# dbb907d5159d
root@kube-master:/var/lib/docker/image/overlay2# grep -rin dbb907d5159d .
./distribution/v2metadata-by-diffid/sha256/7c0b223167b96d7deaacf1e1d2d35892166645b09b17bcc8675a4d882ef84893:1:[{"Digest":"sha256:dbb907d5159dcb993c532a46d2edaff7a72670d093d518e38e6aaf8115103f73","SourceRepository":"docker.io/library/nginx","HMAC":""}]

# 8a268f30c42a
root@kube-master:/var/lib/docker/image/overlay2# grep -rin 8a268f30c42a .
./distribution/v2metadata-by-diffid/sha256/59b01b87c9e7f668b740d23eb872c5964636c33aef795f1186f08b172197bc35:1:[{"Digest":"sha256:8a268f30c42a7c778c9c9497d043dfac6143281918cb9337f20335d4f11e1937","SourceRepository":"docker.io/library/nginx","HMAC":""}]

# b10cf527a02d
root@kube-master:/var/lib/docker/image/overlay2# grep -rin b10cf527a02d .
./distribution/v2metadata-by-diffid/sha256/988d9a3509bbb7ea8037d4eba3a5e0ada5dc165144c8ff0df89c0048d1ac6132:1:[{"Digest":"sha256:b10cf527a02df3ba9f85346ee04f59f920d9ec341a7ca688339c8ae1f8ea978c","SourceRepository":"docker.io/library/nginx","HMAC":""}]

# c90b090c213b
root@kube-master:/var/lib/docker/image/overlay2# grep -rin c90b090c213b .
./distribution/v2metadata-by-diffid/sha256/b857347059916922b353147882544f17bb96e64c639081c0677bf386c446be4f:1:[{"Digest":"sha256:c90b090c213b9e42d7982715b827803437fcbf4337f4672fead618c60cd36b84","SourceRepository":"docker.io/library/nginx","HMAC":""}]

# 1f41b2f2bf94
root@kube-master:/var/lib/docker/image/overlay2# grep -rin 1f41b2f2bf94 .
./distribution/v2metadata-by-diffid/sha256/e3135447ca3e69c6975aee1621c406e3865e0e143c807bbdcf05abefa56054a2:1:[{"Digest":"sha256:1f41b2f2bf94740d411c54b48be7f5e9dfbe14f29d1a5cf64f39150d75f39740","SourceRepository":"docker.io/library/nginx","HMAC":""}]

root@kube-master:/var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid/sha256# ls -la
total 32
drwxr-xr-x 2 root root 4096  8월  9 21:48 .
drwxr-xr-x 3 root root 4096  8월  9 21:48 ..
-rw-r--r-- 1 root root  141  8월  9 21:48 59b01b87c9e7f668b740d23eb872c5964636c33aef795f1186f08b172197bc35
-rw-r--r-- 1 root root  141  8월  9 21:48 7c0b223167b96d7deaacf1e1d2d35892166645b09b17bcc8675a4d882ef84893
-rw-r--r-- 1 root root  141  8월  9 21:48 814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4
-rw-r--r-- 1 root root  141  8월  9 21:48 988d9a3509bbb7ea8037d4eba3a5e0ada5dc165144c8ff0df89c0048d1ac6132
-rw-r--r-- 1 root root  141  8월  9 21:48 b857347059916922b353147882544f17bb96e64c639081c0677bf386c446be4f
-rw-r--r-- 1 root root  141  8월  9 21:48 e3135447ca3e69c6975aee1621c406e3865e0e143c807bbdcf05abefa56054a2

 

해당값들과 nginx image의 image들과 비교했을 때, 같은지 확인해 보면 같음을 알 수 있습니다.

root@kube-master:~# docker inspect nginx
[
    {
        ...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4",
                "sha256:7c0b223167b96d7deaacf1e1d2d35892166645b09b17bcc8675a4d882ef84893",
                "sha256:59b01b87c9e7f668b740d23eb872c5964636c33aef795f1186f08b172197bc35",
                "sha256:988d9a3509bbb7ea8037d4eba3a5e0ada5dc165144c8ff0df89c0048d1ac6132",
                "sha256:b857347059916922b353147882544f17bb96e64c639081c0677bf386c446be4f",
                "sha256:e3135447ca3e69c6975aee1621c406e3865e0e143c807bbdcf05abefa56054a2"
            ]
        },
        ...
    }
]

 

'Cloud > Docker' 카테고리의 다른 글

Ubuntu Docker Setting  (0) 2021.08.09