9장. 도커 이미지 생성

기운찬곰·2020년 9월 6일
0

Docker

목록 보기
9/13
post-thumbnail

시작하기에 앞서서...

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)


도커 이미지 생성

앞서는 mysql, ubuntu, wordpress 같은 이미 도커 공식 허브에 존재하는 이미지를 다운받아서 컨테이너를 생성했습니다.

하지만, 실제로는 컨테이너에서 개발을 수행한 후 자신만의 이미지를 직접 생성해야 할 필요가 있습니다. 그런 방법에 대해 한번 알아보도록 하겠습니다.

먼저 우분투 컨테이너를 만든 후 아무 파일이나 하나 생성해 기존 이미지에서 변경사항을 만듭니다.

$ docker run -it --name commit_test ubuntu:18:04
$ echo test_first! >> first (컨테이너 내부에서 실행)

컨테이너를 빠져나온다음 docker commit 명령으로 컨테이너를 이미지화 시킵니다.

$ docker commit -a "ckstn0777" -m "my first commit" commit_test commit_test:first
  • -a 옵션은 author를 의미하며 이미지 작성자를 나타내는 메타데이터를 이미지에 포함시킵니다.
  • -m 옵션은 커밋 메시지입니다.
  • commit_test는 커밋할 컨테이너 이름입니다.
  • commit_test:first는 생성될 이미지 이름과 태그입니다. 태그를 입력하지 않으면 자동으로 latest로 설정됩니다.

docker images로 잘 생성되었는지 확인해봅니다.

이제 방금 만든 이미지를 이용해 컨테이너를 생성할 수 있습니다. first 파일도 존재하는 것을 확인할 수 있습니다.

$ docker run -it --name commit_test2 commit_test:first


이미지 구조 이해

이제 이미지 구조를 이해해보도록 하겠습니다. ubunt:18:04를 먼저 보겠습니다.

$ docker inspect ubuntu:18.04

다음으로는 commit_test:first의 layer를 보겠습니다.

둘의 차이점은 commit_test:first layer 가장 밑에 한개가 더 있다는 점입니다. 아마 이 부분이 바로 변경을 기록한 부분이라고 생각됩니다.

위에서 ubuntu 이미지 크기는 64.2MB, commit_test 역시 64.2MB이었습니다. 그럼 도합 128.4MB을 차지하고 있을까요? 이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성하기 때문에 실제 크기는 64.2MB + first 파일 크기만큼만 차지 하게 됩니다.


이미지 삭제

만약 commit_test:first로 commit_test2 컨테이너를 생성했다고 치고, commit_test:first를 삭제하려고 하면 음... 제대로 될까요? (참고로 이미지 삭제명령은 docker rmi 입니다)

보니까 컨테이너 1a73..(=commit_test2)이 사용중이라고 하는군요. 강제로 삭제시키고 이미지 또한 삭제시켜보겠습니다.

$ docker rm -f commit_test2
$ docker rmi commit_test:first

참고로, 말 안한게 있는데 commit_test2에서 second파일 생성후 commit_test:second라는 이미지를 생성해줬습니다.

그렇다면...commit_test:first라는 이미지를 삭제했다고 해서 그 레이어 파일은 사라졌을까요? 아닙니다. commit_test:second가 가지고 있을겁니다. (first 파일 또한 가지고 있겠죠)


commit_test:second를 삭제시켜보겠습니다.

이번에는 삭제되는 레이어가 나오고 있습니다.

결국 여기서 알 수 있는 점은 삭제되는 이미지의 부모 이미지가 존재하지 않아야만 해당 이미지의 파일이 실제 삭제된다는 점입니다.


이미지 추출

도커 이미지를 별도로 저장하거나 옮기는 등 필요에 따라서 이미지를단일 바이너리 파일로 저장해야 할 때가 있습니다. 하지만 레이어 구조가 아닌 단일 파일이기 때문에 이미지 용량을 각기 차지 하게 됩니다. (실습은 따로 하지 않겠습니다)


이미지 배포

사실 이미지 추출보다 이미지 배포가 더 중요합니다. 이게 더 효율적이기도 하고요.

방법은 도커 허브 이미지 저장소를 이용하는 것과 사용자가 직접 만드는 사설 레지스트리를 이용하는 방법이 있는데 저는 도커 허브 저장소를 이용하는 방법만 해보겠습니다.

사이트 주소 : https://hub.docker.com/

많이 쓰던 ubuntu도 공식 이미지로 검색할 수 있습니다.


이미지 저장소 생성

뭔가 깃허브와 비슷하게 생겼습니다. Create Repository를 클릭합니다.

살짝 아쉬운점은 비공개 저장소는 무료로 1개밖에 지원해주지 않습니다...😂😂


저장소에 올릴 이미지 생성

$ docker commit commit_test my-image-name:0.0

먼저, commit_test 컨테이너로 부터 이미지를 생성합니다. 그러나 이 이미지로는 이미지 저장소에 올릴 수 없습니다. 특정 저장소에다가 올릴때는 앞에 저장소 이름(사용자 이름)을 붙어야 합니다.


$ docker tag my-image-name:0.0 ckstn0777/my-image-name:0.0

이렇게 하면 기존 이미지가 사라지는건 아니고 이미지를 복붙하는겁니다.


로그인하기

$ docker login
$ docker push ckstn0777/my-image-name:0.0

보면 알겠지만 변경된 레이어만 이미지 저장소로 전송되는 겁니다.(나머지는 우분투에 존재)


이미지 내려받기

$ docker pull ckstn0777/my-image-name:0.0


마침

이번시간에는 이미지 구조에 대해 좀 더 자세히 알아보고, 변경사항을 커밋해보고 도커 허브를 이용해 이미지를 올리고 내리는 실습까지 진행했습니다. 다음시간에는 도커 파일을 이용하는 방법에 대해 알아보도록 하겠습니다.

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

0개의 댓글

관련 채용 정보