Docker : 이미지 편

Docker 2019. 2. 22. 15:00

Docker 이미지 개요


이번 편에서는 도커 이미지의 생성과 삭제, 이미지의 구조를 알아보려고 한다.


파일에 대한 분산버전관리를 웹 호스팅으로 지원하는 GitHub에서는 계정만 있으면 본인의 프로젝트를 push 할 수 있고 공개된 프로젝트라면 누구나 업로드 된 프로젝트를 pull 할 수 있다.



이와 마찬가지로 도커에서는 Docker Hub라는 중앙 이미지 저장소를 제공하고 있고 도커 계정이 있다면 누구나 업로드, 다운로드가 가능하다는 점에서 GitHub와 비슷하다고 볼 수 있다.


지난 컨테이너 편에서 컨테이너 생성 전에 docker pull 명령어로 묻지도 따지지도 않고 ubuntu 이미지를 내려 받았었다. docker pull 명령을 입력하면 기본적으로 도커 허브(Docker Hub)라는 중앙 이미지 저장소를 바라보고 해당 이미지가 있다면 내려받는다.




Docker 이미지 생성과 삭제


도커 이미지는 지난 컨테이너 편에서 한번 내려받았으므로 먼저 이미지 삭제 후 다시 내려받을것이다.

이미지 삭제는 컨테이너를 지우는 것 만큼 간단하게 할 수 있다. 지난시간에 만든 이미지 목록을 docker images 명령을 입력하여 확인해보자.


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE ubuntutest_img latest b5d9797d2234 7 days ago 216 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB



apache2가 설치된 ubuntutest_img와 도커허브에서 내려받은 공식버전 ubuntu 14.04버전이 목록에 출력 되었다. docker rmi 명령어로 이미지를 삭제한다. (Deleted: sha256:b5d9797d22340d....와 같은 해시코드는 잠시 후 이미지 구조에서 설명하겠다.)


# docker rmi b5d9797d2234 Untagged: ubuntutest_img:latest Deleted: sha256:b5d9797d22340d09f6d3f1ad3bd324e32709c8c79193419ce182dc4241b57685 Deleted: sha256:9fc4083d26906a29c77640dea07a396d3cd8d23536d3a4a9a80249ab8272fe12

# docker rmi 5dbc3f318ea5

Untagged: docker.io/ubuntu:14.04 Untagged: docker.io/ubuntu@sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578 Deleted: sha256:5dbc3f318ea50ea06fca865425e7d2b47fa2baa6094d3cb3760a1721f828a0ae Deleted: sha256:5dfbfe35dbdbb50d4c55416c4f87d870243f1ab00c42c8df3a77fa6169babf5f Deleted: sha256:22ec73a9fd69b430b5e164916e6476bf7fc0963897c4af32e6c3857d3357f023 Deleted: sha256:28df65e350302192e76c49c6157d8c9925c65e9f2f7f882900f42915fa487a02 Deleted: sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6



이미지가 잘 지워졌다.


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE



이제 콘솔에 docker images 명령어를 아무리 외쳐봐도 텅 빈 Repository만 출력 될 뿐이다.

공허함에 사무쳐 오늘도 눈물을 흘린다.


(저쪽 세상에서도 행복해야해!!)




는 테스트를 위해 재빨리 새로운 이미지를 내려받도록 하자


# docker run -i -t ubuntu:14.04

Unable to find image 'ubuntu:14.04' locally Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu e53f134edff2: Pull complete efbbd466a715: Pull complete e11368b8e0c7: Pull complete 7dab2de7692b: Pull complete Digest: sha256:cac55e5d97fad634d954d00a5c2a56d80576a08dcc01036011f26b88263f1578 Status: Downloaded newer image for docker.io/ubuntu:14.04




Docker 이미지의 구조



도커 이미지는 Layer라는 계층구조를 가지고 있다. ubuntu 이미지를 내려받은 시점부터 어떤 변화가 일어나면 도커는 그 내용을 Layer라는 항목으로 저장한다.



도커 이미지의 Layer 정보를 확인하려면 inspect 명령으로 확인 할 수 있다. 방금 다운로드 받은 ubuntu 이미지의 Layer를 확인 해보자.

총 4개의 Layer가 확인 되었다. 


# docker inspect ubuntu:14.04 ...

"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24" ]


Layer가 추가되는 과정을 확인 해보기위해 새로운 컨테이너를 생성하고 docker commit 명령어로  두 개의 이미지를 더 생성한다.


# docker run -i -t --name layer_test ubuntu:14.04

root@c73025587f2b:/# exit exit # docker commit layer_test layer_test:first sha256:48f47ef8257da1311d3bd68d0874b5078075760c5162042b674c009a005e22c8 # docker run -i -t --name layer_test2 layer_test:first

root@d33a60d75c45:/# echo layer_test2 >> test2 root@d33a60d75c45:/# exit exit

# docker commit layer_test2 layer_test:second

sha256:127ab2a395852fb94f21a165c0848961c40b3c098c06dfbb215220953accd5a0



이제 Layer가 어떻게 늘어났는지 각 이미지들의 정보를 확인해보자


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE layer_test second 303124b8ac57 2 minutes ago 188 MB layer_test first 48f47ef8257d 2 minutes ago 188 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB

# docker inspect layer_test:first


...


"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24", "sha256:2e3b0a26611390fb38e16eda5c942b8fa0a8db41097cf57286b3d530b240e809" ]


# docker inspect layer_test:second

...

"Layers": [ "sha256:e8769e218081127b7c313bde4a0ba2cb0107d72167b5c0d198bfb5dadfd81ad6", "sha256:d1b9ba926eff7fe934a15b295c9d86e899aa0d9ebdd9064501ffe28ae6ab3f7f", "sha256:8f9b85d7bbd37cd511f70bb4d25078177cd7f0d2b7644cd7f545b60e084d6b09", "sha256:40f4c1f68b3783868af0759c34c67d7338b0a640b3a452275dd34541424a7f24", "sha256:2e3b0a26611390fb38e16eda5c942b8fa0a8db41097cf57286b3d530b240e809", "sha256:257c7e092ad9a30f4ee28ba63bd7bf296d2ef55244f6cc4ca7952c06e911e666" ]



파란색은 원본인 ubuntu:14.04, 노란색은 layer_test:first, 연두색은 layer_test:second이다.

컨테이너 생성 후 docker commit으로 새로운 이미지가 생성 될 때 마다 레이어가 추가 된 모습을 볼 수 있다.

이해를 돕기 위해 이것을 그림으로 나타내면 아래와 같다. 필자는 이것을 변화의 레이어 화 라고 하겠다.






그런데 여기서 한 가지 의문이 드는 부분이 있다. 이미지 size가 생성 할 때 마다 188MB씩 늘어나고 있는데 그렇다면 매번 commit 할 때마다 용량이 늘어나는것인가? 


# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE layer_test second 303124b8ac57 2 minutes ago 188 MB layer_test first 48f47ef8257d 2 minutes ago 188 MB docker.io/ubuntu 14.04 5dbc3f318ea5 4 weeks ago 188 MB



결론부터 말하자면 용량이 증분 형태로 늘어나지는 않는다. 말 그대로 Layer를 생성하여 이미지 위에 덧 붙인다고 생각하면 쉽다. 원본 ubuntu:14.04의 용량 188MB에 layer_test:first의 용량 1MB 미만, layer_test:second의 용량 1MB미만이라고 보면 된다. 



그럼 layer_test:second는 layer_test:first기반으로 만들어진 이미지인데 layer_test:first가 삭제되면 layer_test:second는 어떻게 되는 것인가?


# docker rmi layer_test:first (?)


이 경우 layer_test:first를 기반으로 두고 있는 layer_test:second가 아직 살아 있기 때문에 layer_test:first의 Layer의 내용은 보존 된 채로 layer_test:first라는 이미지 이름만 사라지게 된다.



여기까지 도커 이미지의 생성과 삭제 그리고 도커 이미지의 구조까지 간략히 살펴보았다. 

도커 이미지의 Layer 구조는 포토샵에서 쓰이는 Layer 기능과 비슷하다고 생각하면 이해가 쉬울 것이다.

이상으로 Docker : 이미지 편을 마치겠다.

(급하게 마치는 감이 없지않아 있는데 절대 시간에 쫓겨서 쓴 글이 아니다.)




Docker : 이미지 편
끝.

'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요