도커 이미지

mohadang·2022년 4월 11일
0

도커

목록 보기
18/26
post-thumbnail

도커는 기본적으로 도커 허브(Docker Hub)라는 중앙 이미지 저장소에서 이미지를 내려 받는다.

도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저장소러서, 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있다.

docker create, docker run, docker pull 명령어로 이미지를 내려받을 때 도커는 도커 허브에서 해당 이미지를 검색한 뒤 내려받는다. 단 도커 허브는 누구나 이미지를 올릴 수 있기 때문에 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 수 있다.

이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개(Private) 저장소를 사용할 수 있는데 저장수의 수에 따라 요금을 지불해야 한다.

도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다(도커 사설 레지스트리)

EX) 도커 이미지 검색(search)

$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   14034     [OK]
websphere-liberty                WebSphere Liberty multi-architecture images …   283       [OK]
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   112       [OK]
neurodebian                      NeuroDebian provides neuroscience research s…   88        [OK]
open-liberty                     Open Liberty multi-architecture images based…   51        [OK]
ubuntu-debootstrap               DEPRECATED; use "ubuntu" instead                46        [OK]
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   40
ubuntu/mysql                     MySQL open source fast, stable, multi-thread…   29
ubuntu/apache2                   Apache, a secure & extensible open-source HT…   26
  • STARS는 해당 이미지가 도커 사용자로부터 얼마나 즐겨찾기(start)됐는지를 나타냄

도커 이미지 생성(commit)

docker commit ${OPTION} ${CONTAINER} {REPOSITORY{:TAG}}

// 이미지로 만들 컨테이너 생성
$ docker run -it --name commit_test ubuntu:14.04
// 내가 만든 컨테이너라는 것을 표시하기 위해 간단한 파일 생성
# root@09c628aa8248:/# echo test_first >> first

// 생성한 commit_test 컨테이너로 이미지 생성
$ docker commit -a "mohadangKim" -m "commit message" commit_test my_repository:first
sha256:81902ebfff826a0c0b34ff1057ded52484a624a0ae4f17b858acfff161004b58
// 생성된 이미지 확인
# root@red-virtual-machine:~# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
my_repository   first     81902ebfff82   4 seconds ago   197MB
ubuntu          14.04     13b66b487594   12 months ago   197MB
  • -a : author, 이미지 작성자를 나타낸는 메타데이터를 이미지에 포함
  • -m : 커밋 메시지, 이미지에 포함될 부가 설명

EX) 도커 이미지 생성 2

$ docker run -it --name commit_test2 my_repository:first
# root@5f5d27a84128:/# echo test_second! >> second

$ docker commit -a "mohadangKim" -m "commit message 2" commit_test2 my_repository:second
sha256:6440b177e3559abcbcf57272053d2babf202567b5298818a80e07a56fb6ae68e
$ docker images
REPOSITORY      TAG       IMAGE ID       CREATED              SIZE
my_repository   second    6440b177e355   About a minute ago   197MB
my_repository   first     81902ebfff82   12 minutes ago       197MB
ubuntu          14.04     13b66b487594   12 months ago        197MB

도커 이미지 구조

$ docker inspect ubuntu:14.04
            "Layers": [
                "sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
                "sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
                "sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d"
            ]

$ docker inspect my_repository:first
            "Layers": [
                "sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
                "sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
                "sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
                "sha256:e8eb21d48746fc1fd0599a874f94cf2e8c862236a083a34af050950c25c1547b"
            ]

$ docker inspect my_repository:second
            "Layers": [
                "sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
                "sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
                "sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
                "sha256:e8eb21d48746fc1fd0599a874f94cf2e8c862236a083a34af050950c25c1547b",
                "sha256:e5677df50a1055c895cbb3c5212bef49134c163ea299b3d7e3aa8a1fe75008b9"
            ]
  • 도커 이미지는 레이어로 구성되어 있으며 레이어마다 해쉬 값이 존재한다.
  • 기존 이미지에서 새로운 이미지를 생성할때마다 전체 복사가 아닌 같은 부분은 재사용하고 변경된 부분만 새로운 레이어가 추가된다.
  • 이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성하기 때문에 ubuntu:14.04, first, second 이미지의 실제 크기는 188 MB + first 파일의 크기 + second 파일의 크기가 된다.

EX) 도커 레이어 구조 상세 확인(history)

$ docker history my_repository:second
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
6440b177e355   8 minutes ago    /bin/bash                                       13B       commit message 2
81902ebfff82   19 minutes ago   /bin/bash                                       11B       commit message
13b66b487594   12 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      12 months ago    /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>      12 months ago    /bin/sh -c [ -z "$(apt-get indextargets)" ]     0B
<missing>      12 months ago    /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   195kB
<missing>      12 months ago    /bin/sh -c #(nop) ADD file:276b5d943a4d284f8…   196MB

도커 이미지 삭제(rmi)

$ docker rmi my_repository:first
Error response from daemon: conflict: unable to remove repository reference "my_repository:first" (must force) - container 5f5d27a84128 is using its referenced image 81902ebfff82
  • rmi 명령어로 도커 이미지 삭제 가능

위의 명령어는 에러를 발생하는데 에러 내용은 이미지를 사용 중인 컨테이너가 존재하므로 해당 이미지를 삭제할 수 없다는 내용이다. 따라서 사용중인 컨테이너를 삭제한 뒤 이미지를 삭제해야 한다.

단 docker rmi -f 로 강제 삭제 가능하지만 이렇게 하면 댕글링(dangling) 이미지가 된다.
댕글링 이미지는 docker images -f dangling=true 명령어를 사용해 별도로 확인 할 수 있다

  • REPOSITORY, TAG 부분이 <none>으로 되어 있다
  • 사용 중이지 않은 댕글링 이미지는 docker image prune 명령어로 한꺼번에 삭제 가능
// my_repository:first 이미지 사용중인 commit_test2 컨테이너
$ docker ps
CONTAINER ID   IMAGE                 COMMAND       CREATED          STATUS          PORTS     NAMES
5f5d27a84128   my_repository:first   "/bin/bash"   15 minutes ago   Up 15 minutes             commit_test2
09c628aa8248   ubuntu:14.04          "/bin/bash"   26 minutes ago   Up 26 minutes             commit_test
$ docker stop commit_test2
commit_test2
$ docker rm commit_test2
commit_test2
$ docker rmi my_repository:first
Untagged: my_repository:first
  • my_repository:first 이미지를 삭제했다고 해서 실제로 해당 이미지의 레이어 파일이 삭제되지 않는다.
    • my_repository:second 가 존재하기 때문이다.
    • Git으로 비유를 들면 현재 브랜치가 가리키는 Commit을 다른 브랜치에서 참조하면 삭제되지 않는다.
  • 실제 이미지 파일을 삭제하지 않고 레이어에 부여된 이름만 삭제를 한다.
    • Untagged: ... 는 이미지에 부여된 이름만 삭제한다는 것을 뜻한다.
    • Git으로 비유를 들면 Commit이 아닌 브랜치 이름이 삭제
$ docker rmi my_repository:second
Untagged: my_repository:second
Deleted: sha256:6440b177e3559abcbcf57272053d2babf202567b5298818a80e07a56fb6ae68e
Deleted: sha256:502f34130232e16675b92b55579883bfd6ceeb7bddf47a0d989b8243267ea09c
Deleted: sha256:81902ebfff826a0c0b34ff1057ded52484a624a0ae4f17b858acfff161004b58
Deleted: sha256:6d77f093e94a4cc795513d0ec71ad1913f5a1036ca936c76e977f94d03a6b66e
  • 삭제되는 이미지의 부모 이미지가 존재하지 않으면 이미지의 파일이 실제로 삭제된다.
    • Deleted: ... 는 이미지 레이어가 실제로 삭제됐음을 뜻한다.
profile
mohadang

0개의 댓글