개발 ON
  • [Network | Docker] 이미지
    2024년 07월 04일 19시 56분 51초에 업로드 된 글입니다.
    작성자: 이주여이

    1. 실습용 컨테이너 생성

    [root@localhost ~]# docker run -it \
    > --name commit_test \
    > rockylinux/rockylinux
    
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
    c2fed75bfdf6   rockylinux/rockylinux   "/bin/bash"              50 minutes ago   Up 50 minutes                                                          commit_test
    
    [root@c2fed75bfdf6 /]# ls
    bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
    dev  home  lib64  media       opt  root  sbin  sys  usr
    
    [root@c2fed75bfdf6 /]# echo my_first_commit! >> first
    
    [root@c2fed75bfdf6 /]# ls
    bin  etc    home  lib64       media  opt   root  sbin  sys  usr
    dev  first  lib   lost+found  mnt    proc  run   srv   tmp  var
    
    [root@c2fed75bfdf6 /]# cat first
    my_first_commit!

    2. docker commit 명령어를 통한 이미지 생성

    [root@localhost ~]# docker commit \
    > -a "jy94" \
    > -m "my first commit!" \
    > commit_test \
    > commit_test:first
    
    [root@localhost ~]# docker images
    REPOSITORY              TAG       IMAGE ID       CREATED              SIZE
    commit_test             first     1437cb40ff5f   5 seconds ago        196MB
    • -a - author / 이미지 작성자를 나타내는 메타 데이터
    • -m - 커밋 메세지
    • commit_test - 컨테이너 이름
    • commit_test:first - 생성할 이미지(commit_test - 이미지 이름 / first - 태그 이름)

    docker commit 후 도커에 저장된 이미지를 확인하면 방금 커밋했던 이미지가 목록에 출력된 것을 확인할 수 있다.

    3. 직접 만든 이미지로 이미지 생성

    [root@localhost ~]# docker run -it \
    > --name commit_test2 \
    > commit_test:first
    
    [root@dd17230f0ed1 /]# echo test_second! >> second
    
    [root@dd17230f0ed1 /]# ls
    bin  etc    home  lib64       media  opt   root  sbin    srv  tmp  var
    dev  first  lib   lost+found  mnt    proc  run   second  sys  usr
    
    [root@dd17230f0ed1 /]# cat second
    test_second!

     

    [root@localhost ~]# docker commit \
    > -a "jy94" -m "my second commit!" \
    > commit_test2 \
    > commit_test:second
    
    [root@localhost ~]# docker images
    REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
    commit_test             second    77d22cf302fb   5 seconds ago   196MB
    commit_test             first     1437cb40ff5f   8 minutes ago   196MB

     

    docker commit 명령어를 통해 이미지를 만들었다. pull로 받은 이미지나 내가 만든 이미지를 확인하기 위해선 inspect 명령어를 사용하면 된다.

     

    [root@localhost ~]# docker inspect commit_test:first
    [
        {
            "Id": "sha256:1437cb40ff5f3b9f3c5701f4d7682ca653387c32621493eefd278817220e1aa4",
            "RepoTags": [
                "commit_test:first"
            ],
            "RepoDigests": [],
            "Parent": "sha256:523ffac7fb2e245e5e7c407b9f7377be9c6c3bf03d380981168311f49030da17",
            "Comment": "my first commit!",
            "Created": "2024-07-01T08:38:13.621284304Z",
            "DockerVersion": "27.0.2",
            "Author": "jy94",
            "Config": {
                "Hostname": "c2fed75bfdf6",
                "Domainname": "",
                "User": "",
                "AttachStdin": true,
                "AttachStdout": true,
                "AttachStderr": true,
                "Tty": true,
                "OpenStdin": true,
                "StdinOnce": true,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/bash"
                ],
                "Image": "rockylinux/rockylinux",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {
                    "io.buildah.version": "1.23.1"
                }
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 195598609,
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/86c4813fcc4481dce106bf1304158998369e06d7f6b06f7e5e6c4db76ebe0473/diff",
                    "MergedDir": "/var/lib/docker/overlay2/891461206d466413b0db77538e89a57e675bda73ffc242673c5b3885d43ab641/merged",
                    "UpperDir": "/var/lib/docker/overlay2/891461206d466413b0db77538e89a57e675bda73ffc242673c5b3885d43ab641/diff",
                    "WorkDir": "/var/lib/docker/overlay2/891461206d466413b0db77538e89a57e675bda73ffc242673c5b3885d43ab641/work"
                },
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:44e6e3eb06d8ec453315fb8767b27ef54f69ca5c5364b6251d6bb2b907cc14bc",
                    "sha256:8ac2a4d04b1579d008bbc70b38ce3cad4b12f02f2884237935caa8b78d2144cb"
                ]
            },
            "Metadata": {
                "LastTagTime": "2024-07-01T17:38:13.685229347+09:00"
            }
        }
    ]

    중요하게 봐야 할 부분은 Layers 부분이다. 나는 rocky linux 이미지를 땡겨와 commit_test:first로 이미지를 한번 만들고 만들어진 commit_test:first 이미지를 commit_test:second라는 이름으로 한번 더 만들었다.

     

    rocky linux, commit_test:first, commit_test:second 총 3개의 파일 크기가 188MB 일 때 188MB 크기의 이미지가 3개 존재하는 게 아니라 컨테이너에서 변경된 사항만 새로운 레이어로 저장되고 그 레이어를 포함해 새로운 이미지를 생성한다. 때문에 전체 이미지의 실제 크기는 188MB + first 파일 크기 + second 파일 크기가 되는 것이다.

    • first 파일 - commit_test:first 생성 시 사용했던 컨테이너가 변경된 사항
    • second 파일 - commit_test:second 생성 시 사용했던 컨테이너가 변경된 사항 …

     

    특정 이미지가 어떤 레이어로 생성됐는지 알고싶다면 docker history 명령어를 통해 알 수 있다.

     

    [root@localhost ~]# docker history commit_test:second
    IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
    77d22cf302fb   15 minutes ago   /bin/bash                                       13B       my second commit!
    1437cb40ff5f   23 minutes ago   /bin/bash                                       17B       my first commit!
    523ffac7fb2e   24 months ago    /bin/sh -c #(nop) CMD ["/bin/bash"]             0B
    <missing>      24 months ago    /bin/sh -c #(nop) ADD file:1fc0280b685c9dca1…   196MB

    4. 이미지 삭제

    이미지를 삭제할 때는 사용 중인 컨테이너는 삭제할 수 없으며 docker rm -f ${컨테이너 이름 } 처럼 강제로 삭제할 수 있지만 이는 이미지 레이어 파일을 실제로 삭제하지는 않으며 이미지 이름만 삭제시킨다. 따라서 이미지 삭제 시에는 사용 중인 컨테이너를 중지시키고 삭제해야 한다.

    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
    dd17230f0ed1   commit_test:first       "/bin/bash"              23 minutes ago   Up 23 minutes                                                          commit_test2
    c2fed75bfdf6   rockylinux/rockylinux   "/bin/bash"              35 minutes ago   Up 35 minutes                                                          commit_test
    b97d76ab0c2d   mysql:5.7               "docker-entrypoint.s…"   7 hours ago      Up 7 hours      33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql
    3d3ebab72926   rockylinux/rockylinux   "/usr/sbin/init"         24 hours ago     Up 16 hours     0.0.0.0:8081->80/tcp, :::8081->80/tcp                  rockylinux
    
    [root@localhost ~]# docker stop commit_test2 && docker rm commit_test2
    commit_test2
    commit_test2
    
    [root@localhost ~]# docker rmi commit_test:second
    Untagged: commit_test:second

     

    그리고 댕글링 이미지는 docker image prune 명령어를 통해 삭제가 가능하다.

    # <none> - 댕글링(dangling) 이미지로 이미지 이름이 <none>으로 출력된다.
    [root@localhost ~]# docker images -f dangling=true # 댕글링 이미지만 출력한다.
    REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
    <none>                  <none>    67ee4013357e   34 minutes ago   196MB
    
    [root@localhost ~]# docker image prune # 댕글링 이미지만 모두 삭제한다.
    
    [root@localhost ~]# docker images
    REPOSITORY              TAG       IMAGE ID       CREATED          SIZE

     

    추출, 배포는 다음에...🥹

    'Network > Docker' 카테고리의 다른 글

    [Network | Docker] jar 배포  (0) 2024.07.07
    [Network | Docker] Dockerfile  (0) 2024.07.05
    [Network | Docker] 네트워크  (0) 2024.07.03
    [Network | Docker] 데이터베이스 외부 원격 접속  (0) 2024.07.03
    [Network | Docker] 볼륨  (0) 2024.07.02
    댓글