Explanation
3가지를 학습할 예정
•
Building images
◦
Dockerfile 기반의 이미지를 빌드하는 과정
•
Tagging images
◦
이미지가 어디로 배포될 지도 결정 가능한, 이미지의 이름을 부여하는 과정
•
Publishing images
◦
container registry를 이용해 최신 컨테이너 이미지를 배포하고 공유하는 과정
Building images
대부분의 경우에, 이미지는 Dockerfile을 통해 만들어짐. 대부분의 기본 docker build 명령어는 다음과 같은 모습 :
docker build .
Docker
복사
빌드를 실행하면, 빌더는 base image를 pull 해옴. 만약 필요하다면, Dockerfile에 명시된 지침들(instructions)을 실행함
이전 내용으로 빌드를 수행하면, 이미지는 이름을 갖지 않지만 이미지의 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.1s
=> [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
복사
출력을 통해, 우리는 참조 image를 통해 컨테이너를 실행 가능함 :
docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00
Docker
복사
run 이후 내용이 이미지의 ID. ID를 통해 컨테이너를 실행 가능
이 이름은 기억하기가 어려움. 그렇기에 tagging은 매우 유용하게 됨
Tagging images
이미지 태깅은 이미지를 기억하기 쉬운 이름으로 설정하는 것. 그러나, 이미지 이름에는 구조(structure)가 존재. 전체 이미지 이름은 다음 구조를 가짐 :
# 반드시 기억해야할 구조
[HOST[:PORT_NUMBER]/]PATH[:TAG]
Docker
복사
•
Host
◦
선택사항(optional) : 이미지가 위치하는 registry hostname
◦
host를 명시하지 않으면, docker.io에 있는 Docker의 public registry를 기본으로 사용
•
PORT_NUMBER
◦
hostname을 제공하는 경우, registry의 포트 넘버
•
PATH
◦
“/”로 구분되는 요소들로 구성된 이미지 경로
◦
DockerHub의 경우, [NAMESPACE/]REPOSITORY 형식을 따름
◦
namespace를 명시하지 않으면, Docker Official image를 위한 namespace인 library를 기본으로 사용
•
TAG
◦
커스텀된, 사람이 읽기 편한, 다른 버전이나 변수들을 구분하기 위해 사용되는 식별자
◦
태그를 사용하지 않으면, lastest 를 기본으로 사용
간단 예시
빌드 중에 이미지를 태깅하려면, -t or —tag flag 사용 :
docker build -t my-username/my-image .
Docker
복사
library/my-username/my-image : 이미지 path
tag : lastest(default)
이미 이미지를 빌드한 경우, docker image tag 명령을 통해 또 다른 태그를 추가할 수 있음 :
# 태그 추가 과정 : 새로운 이미지 생성 X. 기존 이미지를 새로운 경로와 태그로 참조할 수 있게 링크를 만드는 역할
# 물론 기존 경로&태그로도 이미지 사용 가능
docker image tag my-username/my-image another-username/another-image:v1
Docker
복사
library/another-username/another-image : 이미지 path
tag : v1
Publishing images
이미지를 빌드 & 태그하고나면, 이제 registry에 push할 준비가 된 것. 이제 docker push 명령어를 통해 push하면 됨 :
docker push my-username/my-image
Docker
복사
몇 초 내에, 이미지의 모든 레이어들이 registry에 push됨
인증 필요
Try it out
제공되는 Dockerfile을 이용해 간단한 이미지를 생성하고 DockerHub에 이미지를 push해보기
1. Setup
1.
sample application 다운받기
•
Git을 이용해서 Clone
•
Docker Desktop 설치
•
Docker 계정 생성
2. Build an image
이제 DockerHub에 repository가 있으니, 이미지를 빌드하고 repository를 push할 차례
1.
다운받은 sample app의 root 위치에서 터미널을 이용해 다음 명령어를 입력. YOUR_DOCKER_USERNAME 를 자신의 DockerHub 유저 이름으로 변경할 것 :
# path : <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
# tag : lastest(default)
# build context : .
docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo .
Docker
복사
제 경우, docker build -t devnerdy/concepts-build-image-demo .
UserName 찾는법
2.
빌드가 완료되면, 다음 명령어를 통해 이미지 확인 가능 :
docker image ls
Docker
복사
3.
docker image history 명령어를 통해 history(어떻게 이미지가 만들어졌는지)를 확인 가능 :
docker image history <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
Docker
복사
base 이미지로부터 상속되고 추가된 이미지 레이어들을 강조하며 보여줌
3. Push the image
이미지가 빌드되었으니, 이제 registry에 해당 이미지를 push함
1.
docker push 명령어를 통해 이미지를 push
# path : <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
# tag : lastest(default)
docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
Docker
복사
만약 requested access to the resource is denied 메세지가 나오면, 로그인을 했는지 확인(docker login)하고 Docker username을 제대로 작성했는지 확인
조금 있으면, DockerHub에 성공적으로 push됨
DockerHub 사이트에서도 확인 가능
Next steps
이제 Docker build cache를 통해 빌드 프로세스 속도를 높이는 법을 학습할 차례!






