욱'S 노트

Docker - Build your own images 본문

Programming/Docker

Docker - Build your own images

devsun 2016. 3. 11. 16:08

Build your own images


도커 이미지는 컨테이너의 기반이다. docker run을 실행할때마다 어떠한 이미지를 원하는지 기술해야 된다. 이전 섹션에서는 이미 존재하는 이미지를 사용하는 방법에 대해서 알아봤다.


우리는 또한 도커 호스트에 다운로드된 이미지가 저장된다는 것도 알고 있다. 만약 호스트에 이미지에 존재한다면 레지스트리로 부터 다운로드 받지 않는다 : 기본적으로 Docker Hub 레지스트리이다.


이번 섹션에서는 도커 이미지에 대해서 더 많은 것을 알아 볼 것이다.

  • 도커 호스트의 이미지 관리하고 사용하기
  • 기본 이미지 생성
  • 도커허브 레지스트리로 이미지 업로드하기


Listing images on the host


호스트에 있는 이미지를 리스팅하는 걸로 시작해보자. 커맨드는 다음과 같다.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

docker-whale        latest              e6181174002b        5 weeks ago         274.3 MB

ubuntu              latest              8693db7e8a00        7 weeks ago         187.9 MB

hello-world         latest              af340544ed62        7 months ago        960 B

devsun98/whalesay   latest              fb434121fc77        9 months ago        247 MB

docker/whalesay     latest              fb434121fc77        9 months ago        247 MB

training/webapp     latest              02a8815912ca        10 months ago       348.8 MB


리스트에서 우리는 다음과 같은 정보를 얻을 수 있다.

  • 어느 리파지토리부터 다운로드 되었는지
  • 각 이미지의 태그
  • 각 이미지의 이미지 아이디


리파지토리는 이미지의 다양한 버젼을 포함하고 있다. 이 경우 우분투 이미지는 다양한 Ubuntu 10.04, 12.04, 12.10, 13.04, 13.10 and 14.0를 커버한다. 각 종류는 태그에 의해 식별되며 이미지 태그는 다음과 같이 언급할 수 있다.


ubuntu:14.04


그래서 특정한 태그의 이미지로 컨테이너를 생성할려면 다음과 같다.

$ docker run -t -i ubuntu:14.04 /bin/bash


만약 대신에 12.04 이미지를 사용한다면 다음과 같이 명령하면 된다.

$ docker run -t -i ubuntu:12.04 /bin/bash


만약 태그를 명시하지 않으면 기본적으로 ubuntu:default 이미지를 사용한다.


Tip: 정확한 이미지의 종류를 사용하기 위해선 이미지 태그를 반드시 명시하자. 이것이 트러블슈팅과 디버깅에 유용하다.


Getting a new image


어떻게 새로운 이미지를 가지냐고? 도커는 도커 호스트에 사용할 이미지가 존재하지 않는다면  자동으로 다운로드를 받는다. 그러나 컨테이너를 나중에 띄우고 이미지를 먼저 저장하고 싶을때는 docker pull 커맨드를 사용하면 된다. 만약 centos 이미지를 다운로드 받고 싶다고 가정해보자.

$ docker pull centos

Using default tag: latest

latest: Pulling from library/centos

47d44cb6f252: Pull complete

6fdebd7b0eb5: Pull complete

a63aae4d216f: Pull complete

bb3d629a7cbc: Pull complete

library/centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Digest: sha256:381f21e4c7b3724c6f420b2bcfa6e13e47ed155192869a2a04fa10f944c78476

Status: Downloaded newer image for centos:latest


이미지의 각 레이어가 다운로드 괸 것을 알 수 있고 이제 우리는 이미지로부터 컨테이너를 실행할 수 있다. 

$ docker run -t -i centos /bin/bash

bash-4.1#


Finding images


도커의 하나의 특징은 수 많은 사람들이 다양한 목적으로 만든 이미지를 가지고 있다는 것이다. 이들중 많은 이미지들이 도커허브에 업로드되어 있다. 우리는 이러한 이미지들을 도커 허브 웹사이트에서 검색할 수 있다. 





또한 docker search 커맨드로 이미지를 찾을 수도 있다. 만약 팀이 ruby와 sinatra가 설치된 이미지를 원한다고 가정해보자. 다음과 같은 커맨드로 sinatra라는 단어가 들어가 모든 이미지를 검색할 수 있다.


$ docker search sinatra

NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

erikap/ruby-sinatra                    Docker for hosting Sinatra apps                 5                    [OK]

semtech/mu-sinatra-template            Template for running Sinatra microservices      1                    [OK]

lucymhdavies/sinatra-boilerplate       Docker image with my boilerplate for Sinat...   1                    [OK]

zyio/sinatra                           Tiny-ish Sinatra Dockerfile                     1                    [OK]

tdiary/rpaproxy-sinatra                                                                1                    [OK]

sashaegorov/docker-alpine-sinatra      Alpine Sinatra is project for running a Si...   0                    [OK]

. . .


sinatra라는 단어를 사용하는 많은 이미지가 조회된다. 우리는 다양한 정보를 얻을 수 있는데 이름, 설명, 별점, 공식, 자동화된 빌드 상태이다. 공식 리파지토리는 도커 회사에 의해 세심하게 관리된다. 자동화된 리파지토리는 이미지의 소스와 내용을 검증하기 위해 자동화된 빌드가 허용된다.


우리는 training/sinatra 이미지를 사용하도록 결정했다. 현재까지 우리는 두가지 타입의 이미지를 보았다. 하나는 ubuntu와 같이 베이스 혹은 루트라고 불리는 이미지이다. 베이스 이미지는 도커 Inc로부터 제공되고 빌드되고, 검증되고 지원된다. 이러한 이미지들은 하나의 단어로 된 이름을 가지고 있다.


우리는 이미 유저 이미지를 보았다. 유저 이미지는 도커 커뮤니티의 유저에 의해서 관리되고 빌드되고 유지된다.  유저 이미지는 유저이름이 접두어로 사용된다. 여기서 training은 해당 이미지를 만든 유저의 명이다.


Pulling our image


적당한 이미지를 찾았다면 docker pull 커맨드로 다운로드를 받아보자.

$ docker pull training/sinatra


우리는 이제 컨테이너를 실행할 때 이 이미지를 사용할 수 있다.


Creating our own images


우리 팀은 training/sinatra 이미지가 꽤 유용하다는 걸 알았다 그러나 약간의 변경이 필요하다는 사실도 알게되었다. 이럴경우 우리는 이미지를 업데이트하거나 생성할 수 있다.

  • 우리는 해당 이미지로 부터 생성된 컨테이너를 업데이트 하고 그 결과를 이미지에 커밋할 수 있다.
  • 우리는 Dockerfile을 사용하여 이미지를 생성하기 위한 명시적인 지시를 할 수 있다.


Updating and committing an image


이미지를 업데이트하기 위해 먼저 이미지로부터 컨테이너를 생성할 필요가 있다.

$ docker run -t -i training/sinatra /bin/bash

root@c30555556930:/#


Note: 컨테이너 ID는 c30555556930으로 생성되었고 곧 그것을 사용해야 할 것이다.


실행중인 컨테이너에 json gem을 추가해보자.

root@c30555556930:/# gem install json

Fetching: json-1.8.3.gem (100%)

Building native extensions.  This could take a while...

Successfully installed json-1.8.3

1 gem installed

Installing ri documentation for json-1.8.3...

Installing RDoc documentation for json-1.8.3...


그런 다음 exit 커맨드로 컨테이너로부터 빠져나오자.


이제 컨테이너는 변경되었다. 이제 docker commit 커맨드로 이미지에 커밋해보자.

docker commit -m "Added json gem" -a "Kate Smith" c30555556930 ouruser/sinatra:v2

04fb55e5da9f4ab45e13c5243fb5f75c5de835ca953f713d743bb94acedb8738


여기 docker commit 명령을 사용하였다. 우리는 두가지 플래그를 명시하였는데 -m과 -a이다. -m 플래그는 특정한 커밋 메시지를 남기는 것이고, -a 플래그는 업데이트를 한 저자를 명시한 것이다.


우리는 또한 특정한 컨테이너(c30555556930)로부터 새로운 이미지가 생성되었음을 명시하고 이미지를 위한 타겟을 명시하였다.

ouruser/sinatra:v2


이것을 분석해 보면 새로운 유저 ouruser를 명시하였고, 또한 새로운 이미지명도 명시한 것을 알 수 있다. 여기서는 오리지널 이미지명을 그대로 사용하였다. 그리고 이미지를 위한 태그를 명시하였는데 v2가 그것이다.


우리는 docker images 커맨드로 새로운 이미지가 생성되었음을 알 수 있다.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

ouruser/sinatra     v2                  04fb55e5da9f        7 minutes ago       452.4 MB

centos              latest              bb3d629a7cbc        6 days ago          196.6 MB

docker-whale        latest              e6181174002b        5 weeks ago         274.3 MB

ubuntu              latest              8693db7e8a00        7 weeks ago         187.9 MB

hello-world         latest              af340544ed62        7 months ago        960 B

devsun98/whalesay   latest              fb434121fc77        9 months ago        247 MB

docker/whalesay     latest              fb434121fc77        9 months ago        247 MB

training/webapp     latest              02a8815912ca        10 months ago       348.8 MB

training/sinatra    latest              f0f4ab557f95        21 months ago       447 MB


Building an image from a Dockerfile


docker commit 커맨드를 사용하는 것은 이미지를 확장하기 위한 매우 단순한 방법이다. 그러나 이 방법은 팀간의 이미지를 공유하기에는 쉽지 않은 방법이다. 대신에 새로운 커맨드 docker build를 통해 새로운 이미지를 생성하는 방법을 알아보자.


Dockerfile은 새로운 이미지를 빌드하기 위한 일련의 지시를 포함하고 있는 것이다.


먼저 디렉토리를 만들고 Dockerfile을 생성해보자.

$ mkdir sinatra

$ cd sinatra

$ touch Dockerfile


그리고 도커 파일에 다음과 같은 내용을 채우자.

# This is a comment

FROM ubuntu:14.04

MAINTAINER Kate Smith <ksmith@example.com>

RUN apt-get update && apt-get install -y ruby ruby-dev

RUN gem install sinatra


도커파일을 자세히 살펴보면 각 지시에 대문자로 접두어가 붙어있는 것을 알 수 있다.

INSTRUCTION statement


Note: 코멘트를 하기 위해 #을 이용할 수 있다.


첫번째 FROM 지시어는 도커에게 이미지의 소스가 무엇인지 이 경우 새로운 이미지의 베이스는 Ubuntu 14.04이다. MAINTAINER는 새로운 이미지를 유지하는 관리자를 의미한다.


마지막으로 두개의 RUN 지시자가 있다. RUN 지시자는 이미지 내부에서 커맨드를 수행한다. 여기서는 APT 캐쉬를 업데이트하고 Ruby와 RubyGems을 설치하고 Sinatra gem을 설치한다.


이제 도커파일과 docker build 커맨드를 이용해 새로운 이미지를 빌드해보자.

$ docker build -t ouruser/sinatra:v2 .

Sending build context to Docker daemon 2.048 kB

Sending build context to Docker daemon

Step 1 : FROM ubuntu:14.04

 ---> e54ca5efa2e9

Step 2 : MAINTAINER Kate Smith <ksmith@example.com>

 ---> Using cache

 ---> 851baf55332b

Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev

 ---> Running in 3a2558904e9b

Selecting previously unselected package libasan0:amd64.

(Reading database ... 11518 files and directories currently installed.)

Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libasan0:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libatomic1:amd64.

Preparing to unpack .../libatomic1_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libatomic1:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libgmp10:amd64.

Preparing to unpack .../libgmp10_2%3a5.1.3+dfsg-1ubuntu1_amd64.deb ...

Unpacking libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...

Selecting previously unselected package libisl10:amd64.

Preparing to unpack .../libisl10_0.12.2-1_amd64.deb ...

Unpacking libisl10:amd64 (0.12.2-1) ...

Selecting previously unselected package libcloog-isl4:amd64.

Preparing to unpack .../libcloog-isl4_0.18.2-1_amd64.deb ...

Unpacking libcloog-isl4:amd64 (0.18.2-1) ...

Selecting previously unselected package libgomp1:amd64.

Preparing to unpack .../libgomp1_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libgomp1:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libitm1:amd64.

Preparing to unpack .../libitm1_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libitm1:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libmpfr4:amd64.

Preparing to unpack .../libmpfr4_3.1.2-1_amd64.deb ...

Unpacking libmpfr4:amd64 (3.1.2-1) ...

Selecting previously unselected package libquadmath0:amd64.

Preparing to unpack .../libquadmath0_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libquadmath0:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libtsan0:amd64.

Preparing to unpack .../libtsan0_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libtsan0:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package libyaml-0-2:amd64.

Preparing to unpack .../libyaml-0-2_0.1.4-3ubuntu3_amd64.deb ...

Unpacking libyaml-0-2:amd64 (0.1.4-3ubuntu3) ...

Selecting previously unselected package libmpc3:amd64.

Preparing to unpack .../libmpc3_1.0.1-1ubuntu1_amd64.deb ...

Unpacking libmpc3:amd64 (1.0.1-1ubuntu1) ...

Selecting previously unselected package openssl.

Preparing to unpack .../openssl_1.0.1f-1ubuntu2.4_amd64.deb ...

Unpacking openssl (1.0.1f-1ubuntu2.4) ...

Selecting previously unselected package ca-certificates.

Preparing to unpack .../ca-certificates_20130906ubuntu2_all.deb ...

Unpacking ca-certificates (20130906ubuntu2) ...

Selecting previously unselected package manpages.

Preparing to unpack .../manpages_3.54-1ubuntu1_all.deb ...

Unpacking manpages (3.54-1ubuntu1) ...

Selecting previously unselected package binutils.

Preparing to unpack .../binutils_2.24-5ubuntu3_amd64.deb ...

Unpacking binutils (2.24-5ubuntu3) ...

Selecting previously unselected package cpp-4.8.

Preparing to unpack .../cpp-4.8_4.8.2-19ubuntu1_amd64.deb ...

Unpacking cpp-4.8 (4.8.2-19ubuntu1) ...

Selecting previously unselected package cpp.

Preparing to unpack .../cpp_4%3a4.8.2-1ubuntu6_amd64.deb ...

Unpacking cpp (4:4.8.2-1ubuntu6) ...

Selecting previously unselected package libgcc-4.8-dev:amd64.

Preparing to unpack .../libgcc-4.8-dev_4.8.2-19ubuntu1_amd64.deb ...

Unpacking libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...

Selecting previously unselected package gcc-4.8.

Preparing to unpack .../gcc-4.8_4.8.2-19ubuntu1_amd64.deb ...

Unpacking gcc-4.8 (4.8.2-19ubuntu1) ...

Selecting previously unselected package gcc.

Preparing to unpack .../gcc_4%3a4.8.2-1ubuntu6_amd64.deb ...

Unpacking gcc (4:4.8.2-1ubuntu6) ...

Selecting previously unselected package libc-dev-bin.

Preparing to unpack .../libc-dev-bin_2.19-0ubuntu6_amd64.deb ...

Unpacking libc-dev-bin (2.19-0ubuntu6) ...

Selecting previously unselected package linux-libc-dev:amd64.

Preparing to unpack .../linux-libc-dev_3.13.0-30.55_amd64.deb ...

Unpacking linux-libc-dev:amd64 (3.13.0-30.55) ...

Selecting previously unselected package libc6-dev:amd64.

Preparing to unpack .../libc6-dev_2.19-0ubuntu6_amd64.deb ...

Unpacking libc6-dev:amd64 (2.19-0ubuntu6) ...

Selecting previously unselected package ruby.

Preparing to unpack .../ruby_1%3a1.9.3.4_all.deb ...

Unpacking ruby (1:1.9.3.4) ...

Selecting previously unselected package ruby1.9.1.

Preparing to unpack .../ruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ...

Unpacking ruby1.9.1 (1.9.3.484-2ubuntu1) ...

Selecting previously unselected package libruby1.9.1.

Preparing to unpack .../libruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ...

Unpacking libruby1.9.1 (1.9.3.484-2ubuntu1) ...

Selecting previously unselected package manpages-dev.

Preparing to unpack .../manpages-dev_3.54-1ubuntu1_all.deb ...

Unpacking manpages-dev (3.54-1ubuntu1) ...

Selecting previously unselected package ruby1.9.1-dev.

Preparing to unpack .../ruby1.9.1-dev_1.9.3.484-2ubuntu1_amd64.deb ...

Unpacking ruby1.9.1-dev (1.9.3.484-2ubuntu1) ...

Selecting previously unselected package ruby-dev.

Preparing to unpack .../ruby-dev_1%3a1.9.3.4_all.deb ...

Unpacking ruby-dev (1:1.9.3.4) ...

Setting up libasan0:amd64 (4.8.2-19ubuntu1) ...

Setting up libatomic1:amd64 (4.8.2-19ubuntu1) ...

Setting up libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...

Setting up libisl10:amd64 (0.12.2-1) ...

Setting up libcloog-isl4:amd64 (0.18.2-1) ...

Setting up libgomp1:amd64 (4.8.2-19ubuntu1) ...

Setting up libitm1:amd64 (4.8.2-19ubuntu1) ...

Setting up libmpfr4:amd64 (3.1.2-1) ...

Setting up libquadmath0:amd64 (4.8.2-19ubuntu1) ...

Setting up libtsan0:amd64 (4.8.2-19ubuntu1) ...

Setting up libyaml-0-2:amd64 (0.1.4-3ubuntu3) ...

Setting up libmpc3:amd64 (1.0.1-1ubuntu1) ...

Setting up openssl (1.0.1f-1ubuntu2.4) ...

Setting up ca-certificates (20130906ubuntu2) ...

debconf: unable to initialize frontend: Dialog

debconf: (TERM is not set, so the dialog frontend is not usable.)

debconf: falling back to frontend: Readline

debconf: unable to initialize frontend: Readline

debconf: (This frontend requires a controlling tty.)

debconf: falling back to frontend: Teletype

Setting up manpages (3.54-1ubuntu1) ...

Setting up binutils (2.24-5ubuntu3) ...

Setting up cpp-4.8 (4.8.2-19ubuntu1) ...

Setting up cpp (4:4.8.2-1ubuntu6) ...

Setting up libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...

Setting up gcc-4.8 (4.8.2-19ubuntu1) ...

Setting up gcc (4:4.8.2-1ubuntu6) ...

Setting up libc-dev-bin (2.19-0ubuntu6) ...

Setting up linux-libc-dev:amd64 (3.13.0-30.55) ...

Setting up libc6-dev:amd64 (2.19-0ubuntu6) ...

Setting up manpages-dev (3.54-1ubuntu1) ...

Setting up libruby1.9.1 (1.9.3.484-2ubuntu1) ...

Setting up ruby1.9.1-dev (1.9.3.484-2ubuntu1) ...

Setting up ruby-dev (1:1.9.3.4) ...

Setting up ruby (1:1.9.3.4) ...

Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ...

Processing triggers for libc-bin (2.19-0ubuntu6) ...

Processing triggers for ca-certificates (20130906ubuntu2) ...

Updating certificates in /etc/ssl/certs... 164 added, 0 removed; done.

Running hooks in /etc/ca-certificates/update.d....done.

 ---> c55c31703134

Removing intermediate container 3a2558904e9b

Step 4 : RUN gem install sinatra

 ---> Running in 6b81cb6313e5

unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping

unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping

Successfully installed rack-1.5.2

Successfully installed tilt-1.4.1

Successfully installed rack-protection-1.5.3

Successfully installed sinatra-1.4.5

4 gems installed

Installing ri documentation for rack-1.5.2...

Installing ri documentation for tilt-1.4.1...

Installing ri documentation for rack-protection-1.5.3...

Installing ri documentation for sinatra-1.4.5...

Installing RDoc documentation for rack-1.5.2...

Installing RDoc documentation for tilt-1.4.1...

Installing RDoc documentation for rack-protection-1.5.3...

Installing RDoc documentation for sinatra-1.4.5...

 ---> 97feabe5d2ed

Removing intermediate container 6b81cb6313e5

Successfully built 97feabe5d2ed

You’ve specified our docker build command and used the -t flag to identify our new image as belonging to the user ouruser, the repository name sinatra and given it the tag v2.


도커 파일의 위치를 명시하기 위해 .을 사용하였고, 이것은 현재 디렉토리를 의미한다.


작업시 빌드 프로세스를 보면 먼저 도커는 빌드 컨텍스트를 업로드 한다. 기본적으로 우리가 빌드하는 디렉토리의 컨텐츠이다. 여기서는 도커 데몬이 이미지의 실제 빌드를 수행하기 때문에 로컬 컨텍스트가 필요하다.


다음 도커파일의 각 지시들이 순서대로 수행되는 것을 알 수 있다. 그리고 모든 지시가 수행되면 97feabe5d2ed 이미지를 남기고 모든 중간 이미지를 지우는 것을 알 수 있다.


Note: 이미지는 127개 이상의 레이어를 가질 수 없다. 이 제약은 이미지의 전체 사이즈를 적정하게 유지하기 위해 글로벌하게 설정되었다.


이제 우리는 새로운 이미지로부터 컨테이너를 생성할 수 있다.

$ docker run -t -i ouruser/sinatra:v2 /bin/bash

root@8196968dac35:/#


Note: 이 가이드는 이미지를 생성하기 위한 간략한 소개이다. 자세한 내용은 Dockerfile Best Practices guide를 참조하자.


Setting tags on an image


우리는 또한 존재하는 이미지에 커밋 또한 빌드를 한 다음 태그를 추가할 수 있다. 이제 ouruser/sinatra에 새로운 태그를 추가해보자.

$ docker tag 5db5f8471261 ouruser/sinatra:devel


The docker tag command takes the ID of the image, here 5db5f8471261, and our user name, the repository name and the new tag.


이제 docker images 커맨드로 새로운 태그를 확인해보자.

$ docker images ouruser/sinatra

REPOSITORY          TAG     IMAGE ID      CREATED        SIZE

ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB

ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB

ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB


Image Digests


이미지는 v2 또는 later 포맷을 이용하여 다이제스트라고 불리는 content-addressable 식별자를 가질 수 있다. 다이제스트 값을 출력하기 위해 --digest 플래그 를 명시하면 된다.


$ docker images --digests | head

REPOSITORY        TAG      DIGEST                                                                     IMAGE ID      CREATED       SIZE

ouruser/sinatra   latest   sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf    5db5f8471261  11 hours ago  446.7 MB


2.0 레지스트리에 다운로드 업로드 할때 push 또는 pull 커맨드는 이미지 다이제스트 값을 포함할 수 있다. 다이제스트값을 이용해 이미지를 다운로드할 수 있다.

$ docker pull ouruser/sinatra@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf


또한 다이제스틑 create, run, rmi 커맨드와도 같이 사용될 수 있고 도커파일에서 참조할 수도 있다.


Push an image to Docker Hub


새로운 이미지를 생성하였으면 docker push 명령으로 도커허브에 이미지를 업로들 할 수 있다.

$ docker push ouruser/sinatra

The push refers to a repository [ouruser/sinatra] (len: 1)


Sending image list


Pushing repository ouruser/sinatra (3 tags)

. . .


Remove an image from the host


docker rmi 명령으로 호스트의 이미지를 삭제할 수도 있다.

$ docker rmi training/sinatra

Untagged: training/sinatra:latest

Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d

Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f

Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0


Note: 이미지를 삭제하기 전에 이미지를 베이스로한 컨테이너가 존재하는지 먼저 확인하자.

Comments