Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[week2 tmi] 도커 Writable Layer #16

Open
ur2e opened this issue Sep 27, 2023 · 0 comments
Open

[week2 tmi] 도커 Writable Layer #16

ur2e opened this issue Sep 27, 2023 · 0 comments
Labels
documentation Improvements or additions to documentation

Comments

@ur2e
Copy link
Collaborator

ur2e commented Sep 27, 2023

45일차에 도커 writable layer에 대한 언급이 나와 이에 대해 좀 더 알아보았습니다.

Writable Layer (쓰기 가능 레이어)

레이어는 도커 이미지가 빌드될 때 Dockerfile 명령어 한 줄마다 만들어진다.
이 레이어들은 READ ONLY이기 때문에 임의로 수정할 수 없다.

missing https://kimjingo.tistory.com/62

✔️ 도커 이미지의 Layer 구조 확인

$ docker inspect mariadb:10
"Layers": [
                "sha256:c5ca84f245d30117a9a2720cb4297cedf3642816471d4d699f4d77e39e13a39c",
                "sha256:67826cdb0540113f523c05971c2fa00155609abc473cff3e968962bd14c8b89e",
                "sha256:f32d0956491fef0d7f7ce235a352686801e118fcaac38cc28973123153599ee5",
                "sha256:0ea990b97e9f7d6ae7f06cc49d1746002dfb58aa946d9c5893a0057af0d9f874",
                "sha256:618053d6d08194f938e490c703d783d05a15392124d688261c73f595a135aaab",
                "sha256:aabac12b379d907b293bae93cc41ac7988d6235add7b06bdfef6c8c9349cdf74",
                "sha256:9bfb128f293b36d2f41b25f301c373be56d5a0713b4bbc734353feac2aa6ad14",
                "sha256:450dee1bd38fcb2e00543ad93a891bf1a1d8cc6287f06a5e8b482c6266f82f12"
            ]

✔️ 레이어 구조를 가지는 이유

데이터 저장의 효율성과 빌드 시간의 단축, registry로의 pull/push를 빠르게하기 위함이다.

https://kimjingo.tistory.com/62

$ docker pull alpine                                                                                                                                                    
Using default tag: latest
latest: Pulling from library/alpine
9fda8d8052c6: Already exists  ➡️ 이미 존재하는 레이어는 다운로드하지 않는다.
Digest: sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

✔️ 쓰기 가능 레이어

docker run 명령을 이용해 이미지로 컨테이너를 생성하면 기존의 이미지 레이어들 위에 container layer가 생성된다.

기존 이미지 레이어는 Read-Only 레이어이고, 기존 레이어 위에 새로 생성된 레이어는 Read-Write 레이어이다.

실행 중인 컨테이너는 모든 변화를 writable layer에 기록하고, 컨테이너가 종료될 경우 같이 소멸된다.

image

Container Layer (Writable Layer) = Read Write
Image Layer = Read Only

  • 이미지 만들어서 layer 쌓이는 지 확인하기
$ docker inspect alpine
"Layers": [
                "sha256:b2191e2be29d816fa6fbde954316d54e10df9a882c7ca38e3e087d9cbca49fe6"
            ]

$ docker run --name test1 -it alpine
/ # exit

$ docker run --name test2 -it alpine
/ # exit

$ docker commit test1 test_exit:1
sha256:092ff067be32ac14017c99a1b1bde7fbcdcef59d7a8b529bbdf863f774a6c9de

$ docker commit test1 test_exit:2
sha256:44b8dc19d68c339e751f6c4f207d8d69b89d917a0cb2b0dda0b81c9a801c88bd

$ docker inspect test_exit:1
"Layers": [
                "sha256:b2191e2be29d816fa6fbde954316d54e10df9a882c7ca38e3e087d9cbca49fe6",
                "sha256:bbedb3095fe08d2c08c6e563aab6d3bd118edd42ac6de24df484b145683419cc"
            ]

$ docker inspect test_exit:2
"Layers": [
                "sha256:b2191e2be29d816fa6fbde954316d54e10df9a882c7ca38e3e087d9cbca49fe6",
                "sha256:2cc75bfff77056a9c7d6377906ed8df484bfa03c718694a644fd268b9541d322"
            ]
  • 도커 이미지 크기 확인하기
~ » docker run --name test3 -it alpine                                                                                                                                    yrji@yrjis-iMac
/ # echo hello > hello.txt
/ # touch hi.txt
/ # ls -al
-rw-r--r--    1 root     root             6 Sep 21 07:55 hello.txt
-rw-r--r--    1 root     root             0 Sep 21 07:55 hi.txt

~ » docker system df -v                                                                                                                                                   yrji@yrjis-iMac
Images space usage:

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
test_txt     v1        1edddf286431   13 seconds ago   7.66MB    7.66MB        54B           0
test_exit    2         44b8dc19d68c   4 minutes ago    7.66MB    7.66MB        5B            0
test_exit    1         092ff067be32   4 minutes ago    7.66MB    7.66MB        5B            0
alpine       latest    f6648c04cd6c   6 weeks ago      7.66MB    7.66MB        0B            3

SHARED SIZE 행은 이미지가 다른 이미지와 공유하는, 즉 공통 데이터에 해당하는 공간의 용량이다.

UNIQUE SIZE는 해당 이미지에서만 사용하는 공간의 용량이다.

SIZE 행이 각 이미지의 용량이며, SHARED SIZE와 UNIQUE SIZE의 합에 해당한다.

✔️ 레이어로 저장되는 Dockerfile 명령문(Instructions)

 Dockerfile에 정의된 모든 명령문(Instructions)이 레이어가 되는 것은 아니다.

RUNADDCOPY 이 3가지 단계만이 레이어로 저장되고, CMDLABELENVEXPOSE 등과 같이 메타 정보를 다루는 부분은 임시 레이어로 생성되지만 저장되지 않아 도커 이미지 사이즈에 영향을 주지 않는다.

✔️ 경량의 도커 이미지 생성 방법 → (경량의 도커 이미지 생성 더 알아보기)

이미지 레이어 개수를 줄이자

과거 도커 버전에서는 이미지 레이어 개수가 성능에 영향을 줬다고 한다. 하지만 이제는 그렇지 않다.

그래도 도커 레이어 개수를 줄이는 것은 최적화 측면에서 도움이 된다고 볼 수 있다.

레이어는 RUNADDCOPY 명령문에서만 생성되기 때문에 아래와 같이 여러 개로 분리된 명령을 체이닝(chaining) 으로 엮어보자.

레이어 개수가 적다고 도커 이미지/컨테이너 성능에 영향을 주진 않지만 Dockerfile 가독성과 유지 보수 관점에서 도움이 될 것이다.

아래와 같이 단일 RUN 구문으로 체이닝 하면 기존 4개 레이어가 생성되는 것을 1개 레이어로 줄일 수 있다. 그리고 하는 김에 설치할 패키지 순서를 알파벳 순서로 정렬하면 가독성도 높고, 중복 설치를 방지할 수 있는 효과도 있다.

`RUN apt-get update
RUN apt-get -y install gcc
RUN apt-get -y install git
RUN apt-get -y install locales`
RUN apt-get update && apt-get install -y \
    gcc \
    git \
    locales
@ur2e ur2e added the documentation Improvements or additions to documentation label Sep 27, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant