이미지 빌드, 태그 지정, 게시하기

이미지 빌드, 태그 지정, 게시하기

이 가이드에서는 Docker 이미지를 빌드하고, 이름을 붙이고(태그), 레지스트리에 게시하는 전체 흐름을 배워요. 이미지를 어떻게 만들고 공유하는지의 기본기를 탄탄하게 잡을 수 있어요.

출처: 문서

본문

설명

이 가이드에서 배울 내용은 다음과 같아요.

  • 이미지 빌드Dockerfile을 기반으로 이미지를 만드는 과정
  • 이미지 태그 지정 — 이미지에 이름을 부여하는 과정. 이름을 어떻게 짓느냐에 따라 이미지를 어디에 배포할 수 있는지도 정해져요.
  • 이미지 게시 — 컨테이너 레지스트리를 이용해 새로 만든 이미지를 배포하거나 공유하는 과정

이미지 빌드

대부분의 경우 이미지는 Dockerfile을 사용해 빌드해요. 가장 기본적인 docker build 명령은 다음과 같이 생겼어요.

docker build .

명령 끝에 붙은 .은 빌드 컨텍스트의 경로(또는 URL)를 의미해요. 빌더는 바로 이 위치에서 Dockerfile과 그 밖에 참조되는 파일들을 찾아요.

빌드를 실행하면 빌더는 필요하다면 베이스 이미지를 가져온 다음, Dockerfile에 적힌 지시문들을 순서대로 실행해요.

위 명령만으로는 이미지에 이름이 없지만, 출력 결과에서 이미지의 ID를 확인할 수 있어요. 예를 들어 위 명령은 다음과 같은 출력을 만들어 낼 수 있어요.

$ docker build .
[+] Building 3.5s (11/11) FINISHED                                              docker:desktop-linux
 => [internal] load build definition from Dockerfile                                            0.0s
 => => transferring dockerfile: 308B                                                            0.0s
 => [internal] load metadata for docker.io/library/python:3.12                                  0.0s
 => [internal] load .dockerignore                                                               0.0s
 => => transferring context: 2B                                                                 0.0s
 => [1/6] FROM docker.io/library/python:3.12                                                    0.0s
 => [internal] load build context                                                               0.0s
 => => transferring context: 123B                                                               0.0s
 => [2/6] WORKDIR /usr/local/app                                                                0.0s
 => [3/6] RUN useradd app                                                                       0.0s
 => [4/6] COPY ./requirements.txt ./requirements.txt                                            0.0s
 => [5/6] RUN pip install --no-cache-dir --upgrade -r requirements.txt                          3.2s
 => [6/6] COPY ./app ./app                                                                      0.0s
 => exporting to image                                                                          0.1s
 => => exporting layers                                                                         0.1s
 => => writing image sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00    0.0s

이 출력에서 확인된 이미지를 참조해 컨테이너를 시작할 수도 있어요.

docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00

이런 이름은 외우기 어렵죠. 그래서 태그 지정이 유용하게 쓰여요.

이미지 태그 지정

태그 지정은 이미지에 기억하기 쉬운 이름을 부여하는 방법이에요. 다만 이미지 이름에는 정해진 구조가 있어요. 완전한 이미지 이름은 다음과 같은 구조를 가져요.

[HOST[:PORT_NUMBER]/]PATH[:TAG]
  • HOST: 이미지가 위치한 레지스트리 호스트 이름(선택 사항). 호스트를 지정하지 않으면 기본적으로 Docker의 공개 레지스트리인 docker.io가 사용돼요.
  • PORT_NUMBER: 호스트 이름을 지정했을 때 사용하는 레지스트리 포트 번호
  • PATH: 슬래시로 구분된 구성 요소로 이루어진 이미지 경로. Docker Hub에서는 [NAMESPACE/]REPOSITORY 형식을 따르는데, 여기서 네임스페이스는 사용자 이름이나 조직 이름이에요. 네임스페이스를 지정하지 않으면 library가 사용되며, 이는 Docker 공식 이미지(Docker Official Images)의 네임스페이스예요.
  • TAG: 사람이 읽을 수 있는 사용자 지정 식별자로, 보통 이미지의 서로 다른 버전이나 변형을 구분하는 데 사용돼요. 태그를 지정하지 않으면 기본적으로 latest가 사용돼요.

이미지 이름의 몇 가지 예는 다음과 같아요.

  • nginxdocker.io/library/nginx:latest와 동일해요. docker.io 레지스트리의 library 네임스페이스, nginx 이미지 저장소, latest 태그에서 이미지를 가져와요.
  • docker/welcome-to-dockerdocker.io/docker/welcome-to-docker:latest와 동일해요. docker.io 레지스트리의 docker 네임스페이스, welcome-to-docker 이미지 저장소, latest 태그에서 이미지를 가져와요.
  • ghcr.io/dockersamples/example-voting-app-vote:pr-311은 GitHub Container Registry의 dockersamples 네임스페이스, example-voting-app-vote 이미지 저장소, pr-311 태그에서 이미지를 가져와요.

빌드 중에 이미지에 태그를 붙이려면 -t(또는 --tag) 플래그를 추가하면 돼요.

docker build -t my-username/my-image .

이미 빌드된 이미지가 있다면 docker image tag 명령으로 태그를 하나 더 추가할 수 있어요.

docker image tag my-username/my-image another-username/another-image:v1

이미지 게시

이미지를 빌드하고 태그까지 붙였다면, 이제 레지스트리로 푸시할 준비가 된 거예요. 그러려면 docker push 명령을 사용해요.

docker push my-username/my-image

몇 초 안에 이미지의 모든 레이어가 레지스트리로 푸시돼요.

인증 필요

이미지를 저장소로 푸시하려면 먼저 인증을 받아야 해요. docker login 명령을 사용하면 되요.

직접 해보기

이 실습 가이드에서는 제공된 Dockerfile을 사용해 간단한 이미지를 빌드하고 Docker Hub에 푸시해 봐요.

준비

  • 샘플 애플리케이션을 받아요. Git이 있다면 샘플 애플리케이션 저장소를 클론할 수 있고, 아니면 샘플 애플리케이션을 다운로드할 수 있어요. 다음 옵션 중 하나를 선택하세요. 터미널에서 다음 명령을 사용해 샘플 애플리케이션 저장소를 클론해요.
    $ git clone https://github.com/docker/getting-started-todo-app
    
    소스를 다운로드해서 압축을 풀어요. 소스 다운로드
  • Docker Desktop을 다운로드하고 설치해요.
  • 아직 Docker 계정이 없다면 지금 하나 만들어요. 만든 뒤 그 계정으로 Docker Desktop에 로그인해요.

이미지 빌드

이제 Docker Hub에 저장소가 생겼으니, 이미지를 빌드해 저장소로 푸시할 차례예요.

  • 샘플 앱 저장소의 루트에서 터미널을 열고 다음 명령을 실행해요. YOUR_DOCKER_USERNAME은 여러분의 Docker Hub 사용자 이름으로 바꾸세요.
    $ docker build -t /concepts-build-image-demo .
    
    예를 들어 사용자 이름이 mobywhale이라면 다음과 같이 실행하면 돼요.
    $ docker build -t mobywhale/concepts-build-image-demo .
    
  • 빌드가 완료되면 다음 명령으로 이미지를 확인할 수 있어요.
    $ docker image ls
    
    이 명령은 다음과 비슷한 출력을 만들어요.
    REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
    mobywhale/concepts-build-image-demo    latest    746c7e06537f   24 seconds ago   354MB
    
  • docker image history 명령으로 이미지의 히스토리(즉, 이미지가 어떻게 만들어졌는지)를 볼 수도 있어요.
    $ docker image history mobywhale/concepts-build-image-demo
    
    그러면 다음과 비슷한 출력이 보여요.
    IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
    f279389d5f01   8 seconds ago   CMD ["node" "./src/index.js"]                   0B        buildkit.dockerfile.v0
          8 seconds ago   EXPOSE map[3000/tcp:{}]                         0B        buildkit.dockerfile.v0 
          8 seconds ago   WORKDIR /app                                    8.19kB    buildkit.dockerfile.v0
          4 days ago      /bin/sh -c #(nop)  CMD ["node"]                 0B
          4 days ago      /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
          4 days ago      /bin/sh -c #(nop) COPY file:4d192565a7220e13…   20.5kB
          4 days ago      /bin/sh -c apk add --no-cache --virtual .bui…   7.92MB
          4 days ago      /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.19     0B
          4 days ago      /bin/sh -c addgroup -g 1000 node     && addu…   126MB
          4 days ago      /bin/sh -c #(nop)  ENV NODE_VERSION=20.12.0     0B
          2 months ago    /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
          2 months ago    /bin/sh -c #(nop)  ADD file:d0764a717d1e9d0af…   8.42MB
    
    이 출력은 이미지의 레이어를 보여주며, 여러분이 추가한 레이어와 베이스 이미지에서 물려받은 레이어를 구분해 줘요.

이미지 푸시

이미지가 빌드됐으니 이제 레지스트리로 푸시할 차례예요.

  • docker push 명령으로 이미지를 푸시해요.
    $ docker push /concepts-build-image-demo
    
    requested access to the resource is denied 오류가 나면 로그인 여부와 이미지 태그의 Docker 사용자 이름이 올바른지 확인해 보세요. 잠시 후 이미지가 Docker Hub에 푸시되는 걸 확인할 수 있어요.

추가 자료

빌드, 태그 지정, 게시에 대해 더 알아보려면 다음 자료를 참고하세요.

다음 단계

이미지 빌드와 게시에 대해 배웠으니, 이제 Docker 빌드 캐시를 이용해 빌드 과정을 더 빠르게 만드는 방법을 배워 볼 차례예요. 빌드 캐시 사용하기

더 알아보기 (Learn more)