티스토리 뷰

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에 등록되어 있는 것을 확인 할 수 있다.



해당 이미지는 다른 도커 호스트/머신에서 실행 시킬 수 있다.
아래는 CentOS 호스트에서 만들어서 업로드한 도커 허브 이미지를 맥북에서 실행시킨 내용이다.

docker pull whchoi98/cisko_centos:v0.1


❯ docker pull whchoi98/cisko_centos:v0.1
v0.1: Pulling from whchoi98/cisko_centos
729ec3a6ada3: Already exists
af0fff5f8285: Pull complete
Digest: sha256:1d569a806e2ae7d706a6d6ebbe5a4a6255bd32bed617493e412f74a59b7e64bd
Status: Downloaded newer image for whchoi98/cisko_centos:v0.1
docker.io/whchoi98/cisko_centos:v0.1


docker images | grep "cisko"
whchoi98/cisko_centos        v0.1                8f77c6412d84        21 hours ago        293MB

도커허브에는 official 하게 안전한 이미지들이 상당히 많이 존재하므로, offical한 이미지 외에 다른 파일을 받는 것은 보안성 그렇게 좋은 것은 아니다.
다음 포스팅에서는 이러한 위험을 제거하기 위해 , Dockerfile을 이용해서 Docker Image를 만드는 방법을 알아보겠다. 


공지사항