티스토리 뷰

Docker Images



docker registry에서 필요한 docker image를 검색할 수 있다.

[root@cent154 ~]# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5620                [OK]
ansible/centos7-ansible            Ansible on Centos7                              125                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   99                                      [OK]

docker registry는 다양한 image들이 등록되어 있으므로, official 한 이미지를 찾기 어려울 수도 있다. 
-- filter 옵션을 통해서 official 이미지를 검색할 수 있다.

[root@cent154 ~]# docker search --filter "is-official=true" centos
NAME                DESCRIPTION                     STARS               OFFICIAL            AUTOMATED
centos              The official build of CentOS.   5620                [OK]

docker pull은 local, Docker Hub등에서 docker image를 가져오는 역할을 수행한다.
이미지 고유의 ID가 존재하며, 이것은 이름과 태그 기반으로 Annotation 된다.

[root@cent154 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

신규 다운로드된 CentOS 이미지는 아래와 같이 Local Repo 이름과 Tag, Image ID 등으로 식별 및 기타 정보들을 확인 할 수 있다.

[root@cent154 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        3 weeks ago         220MB

해당 이미지를 통해서 새롭게 Docker를 생성할 수 있다.
기본 이미지를 기반으로 docker를 생성하고, docker를 구동하고 접속한다.
여기에 새로운 tool을 설치하게 되면 , 기본 이미지 레이어에 새로운 레이어가 추가하게 된다.
하지만 이것은 이미지가 새로 생성되는 개념은 아니며, 기존 레이어를 참조하는 방식이다.

[root@cent154 ~]# docker run --name centos01 -it centos:latest
[root@467e3d5acf71 /]# yum -y install net-tools

만약 신규 패키지가 설치된 컨테이너를 새로운 이미지로 만든다면, 현재 구동 중인 컨테이너 ID를 기반으로 Image를 신규 생성한다.

[root@cent154 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
467e3d5acf71        centos:latest       "/bin/bash"         About a minute ago   Up About a minute                      centos01

새로운 image생성은 commit 명령을 통해 수행하며, docker 컨테이너 ID와 신규 생성된 이미지의 이름과 Tag를 추가해서 생성할 수 있다.

[root@cent154 ~]# docker commit -a “by whchoi" 467e3d5acf71 centos01:v0.1
sha256:15266765308270bbf11cddfb89593d3c7070fc0616c6cbc93e24ce30d6cd25bb

신규 생성된 이미지는 기존 기본 이미지에 40MB가 추가된 형태로 이미지가 생성된 것을 확인 할 수 있다.

[root@cent154 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos01            v0.1                152667653082        6 seconds ago       260MB
centos              latest              0f3e07c0138f        3 weeks ago         220MB

신규 생성된 이미지가 어떤 이미지 레이어로 구성되었는지를 확인하기 위해서는 “history” 명령을 통해 확인 할 수 있다.

[root@cent154 ~]# docker history centos01:v0.1
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
152667653082        About a minute ago   /bin/bash                                       40.8MB
0f3e07c0138f        3 weeks ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 weeks ago          /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           3 weeks ago          /bin/sh -c #(nop) ADD file:d6fdacc1972df524a…   220MB

신규 생성된 이미지를 통해 , 컨테이너를 생성하고 새로운 패키지를 추가 설치해서 이미지의 참조 과정을 살펴보면 조금 더 깊은 이해를 할 수 있다.

[root@cent154 ~]# docker run --name centos02 -it centos01:v0.1
[root@fe742ebc24ef /]# yum -y install bind-utils

[root@cent154 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
fe742ebc24ef        centos01:v0.1       "/bin/bash"         About a minute ago   Up About a minute                      centos02
467e3d5acf71        centos:latest       "/bin/bash"         9 minutes ago        Up 9 minutes                           centos01

기본 이미지가 아닌 새롭게 생성된 이미지를 기반으로 다른 이미지를 생성한다.

[root@cent154 ~]# docker commit -a “by whchoi" fe742ebc24ef centos02:v0.1
sha256:b887edfb932b5a7c82f112979af2acfc457c2cce2dedf411486fe9375f63b3aa

이제 생성된 이미지의 내역을 살펴보자.
신규 생성된 이미지는 이미 생생되었던 이미지의 구조를 그대로 승계하므로, CentOS 기본이미지 - 신규생성 이미지(CentOS01 이미지) - 신규생성 이미지 (CentOS02 이미지)로 연계가 되어 있는 것을 확인할 수 있다.

[root@cent154 ~]# docker history centos02:v0.1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
b887edfb932b        2 minutes ago       /bin/bash                                       33.6MB
152667653082        8 minutes ago       /bin/bash                                       40.8MB
0f3e07c0138f        3 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:d6fdacc1972df524a…   220MB

CentOS 기본이미지 - 신규생성 이미지(CentOS01 이미지) - 신규생성 이미지 (CentOS02 이미지) 로 연계된 이미지 구조에서 만약 CentOS01 이미지를 삭제하면 에러가 발생한다.
이미 다른 컨테이너들이 참조하기 때문에 삭제가 불가능하기 때문이다.

[root@cent154 ~]# docker rmi centos01:v0.1
Error response from daemon: conflict: unable to remove repository reference "centos01:v0.1" (must force) - container fe742ebc24ef is using its referenced image 152667653082

[root@cent154 ~]# docker rmi centos02:v0.1
[root@cent154 ~]# docker rmi centos01:v0.1

위의 내용들을 전체적으로 도식화 하면 아래와 같은 플로우로 이해할 수 있다.






docker 이미지 추출/로딩/배포

도커의 이미지는  “Save” 명령을 통해 압축하여 별도로 저장할 수 있다.

[root@cent154 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cisko_centos        v0.1                8f77c6412d84        7 minutes ago       293MB
centos              latest              0f3e07c0138f        3 weeks ago         220MB


[root@cent154 ~]# docker save -o whchoi.tar cisko_centos:v0.1
[root@cent154 ~]# ls -al
-rw-------.  1 root root 302731264 Oct 25 21:49 whchoi.tar

기존에 있던 이미지를 삭제하고 추출한 이미지를 로딩한다.

[root@cent154 ~]# docker rmi cisko_centos:v0.1
[root@cent154 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        3 weeks ago         220MB


[root@cent154 ~]# docker load -i whchoi.tar
[root@cent154 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cisko_centos        v0.1                8f77c6412d84        20 minutes ago      293MB
centos              latest              0f3e07c0138f        3 weeks ago         220MB

추출한 이미지를 기반으로 컨테이너를 생성하여 정상적으로 동작하는지 확인해 본다.

[root@cent154 ~]# docker run -it --name whchoi-os cisko_centos
Unable to find image 'cisko_centos:latest' locally
docker: Error response from daemon: pull access denied for cisko_centos, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
[root@cent154 ~]# docker run -it --name whchoi-os cisko_centos:v0.1

Docker 이미지는 로컬에 저장할 수도 있지만 , Docker Hub Repository에 넣어두고 활용할 수도 있다.
아래는 docker Hub에 미리 계정을 만들어 두고, 해당 계정에 docker image를 넣는 방법을 예제로 만든 것이다.
우선 새로운 Repo를 만들거나, 또는 직접 업로딩 할 수도 있다.






직접 업로딩 하는 방법은 아래와 같다.
우선 docker machine/host에서 docker hub 계정에 로그인 한다.

[root@cent154 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: whchoi98
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

현재 도커 이미지는 2개가 있는 것을 아래에서 확인 할 수 있다.

[root@cent154 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
cisko_centos            v0.1                8f77c6412d84        20 hours ago        293MB
centos                  latest              0f3e07c0138f        3 weeks ago         220MB

기존 있는 이미지에 새로운 Tag를 부여해서 , Docker Hub에 로딩 시킬 준비를 한다.
이미지를 확인해 보면 기존 로컬에 만들어진 Docker Image를 복제해서 Docker Hub 계정에 로그인 할 이미지를 생성하였다.

[root@cent154 ~]# docker tag cisko_centos:v0.1 whchoi98/cisko_centos:v0.1


[root@cent154 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
cisko_centos            v0.1                8f77c6412d84        20 hours ago        293MB
whchoi98/cisko_centos   v0.1                8f77c6412d84        20 hours ago        293MB
centos                  latest              0f3e07c0138f        3 weeks ago         220MB

만들어진 도커 이미지를 Docker Hub에 업로드 한다.

[root@cent154 ~]# docker push whchoi98/cisko_centos
The push refers to repository [docker.io/whchoi98/cisko_centos]
15947f00fe32: Pushed
9e607bb861a7: Mounted from library/centos
v0.1: digest: sha256:1d569a806e2ae7d706a6d6ebbe5a4a6255bd32bed617493e412f74a59b7e64bd size: 741


Docker Hub에 로그인해서 자신의 계정에서 확인해 보면 정상적으로 Repo에 등록되어 있는 것을 확인 할 수 있다.