이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)
앞서는 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
옵션은 커밋 메시지입니다.이제 방금 만든 이미지를 이용해 컨테이너를 생성할 수 있습니다. 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
이번시간에는 이미지 구조에 대해 좀 더 자세히 알아보고, 변경사항을 커밋해보고 도커 허브를 이용해 이미지를 올리고 내리는 실습까지 진행했습니다. 다음시간에는 도커 파일을 이용하는 방법에 대해 알아보도록 하겠습니다.