본문 바로가기
Infrastructure/Docker

[Docker] Docker Image와 Image 생성하기, Tag 붙이기, 점진적 빌드하기

by 곰민 2023. 4. 9.

Docker Image는 코드, 런타임, 시스템 도구, 라이브러리, 설정 등 소프트웨어를 실행하는 데 필요한 모든 것을 포함하는 경량의 독립 실행형 소프트웨어 패키지입니다.

Docker 이미지를 효율적으로 생성하고 관리하는 방법을 알아봅니다.
Base Image, Layers, Dependencies, Hexadecimal IDs, Dockerfile 작성법과 Image 관리등을 살펴봅시다!!.

 

ㄴ(0)ㄱ ???

 

Docker Image


Base Image

Base Image는 Docker 이미지를 만들기 위한 시작점입니다.

Base Image는 특정 소프트웨어 패키지가 설치된 최소한의 pre-configured os입니다.

Base Image는 소프트웨어 공급업체에서 제공하는 official 이미지 또는 커뮤니티에서 유지 관리하는 이미지일 수 있습니다.

예를 들어 우분투, 알파인 또는 Node.js Base Image가 있습니다.

Base Image는 FROM 명령어를 사용하여 Dockerfile에 지정합니다.

 

 

Layers

Docker파일의 각 명령어는 이미지에 새 레이어를 생성합니다.

레이어는 서로 겹쳐서 쌓이고 각 레이어는 이전 레이어와의 차이점을 나타냅니다.

이러한 계층 구조는 변경된 레이어만 전송하거나 저장하면 되기 때문에 이미지를 효율적으로 저장하고 공유할 수 있습니다.

즉 Image를 통째로 생성하지 않고 부모 이미지를 계속 참조하는 방식으로 레이어를 쌓아 나가는 식으로 생성합니다.

 

 

출처:Coffee Chat: Layers inside Docker Image! | Sachin Jha (sachcode.com)

 

Dependencies

Dependencies는 애플리케이션을 실행하는 데 필요한 필수 라이브러리, 프레임워크 및 기타 소프트웨어 구성 요소입니다.

Dependencies는 일반적으로 apt, yum 또는 npm과 같은 패키지 관리자를 사용하여 기본 이미지 위에 설치됩니다.

설치된 각 종속 요소는 Docker 이미지에 새 레이어를 생성합니다.

Dependencies이 업데이트되면 변경된 종속성이 있는 레이어만 업데이트하면 되므로, 저장 및 배포 측면에서 Docker 이미지가 효율적인 이유 중 하나입니다.

 

Hexadecimal IDs

Docker 이미지의 각 레이어는 고유한 16진수 ID로 식별됩니다.

이 ID는 레이어의 콘텐츠와 메타데이터의 해시입니다.

이미지를 가져오거나 내보낼 때 Docker는 이러한 ID를 사용하여 어떤 레이어를 전송해야 하는지 결정합니다.

이렇게 하면 필요한 레이어만 전송되므로 전송되는 데이터의 양이 줄어들고 프로세스 속도가 빨라집니다.

 

Creating a Docker image

Docker 이미지를 만들려면 이미지 빌드에 대한 일련의 지침이 포함된 Docker파일을 작성해야 합니다.

Docker파일은 기본 이미지, 종속성, 구성 설정은 물론 애플리케이션 코드를 이미지에 추가하는 방법도 지정합니다.

Docker파일이 준비되면 docker build 명령을 사용하여 이미지를 빌드할 수 있습니다.

Docker는 Docker파일의 명령어를 읽고 순서대로 실행하여 각 명령어에 대해 새 레이어를 생성합니다.

 

Managing Docker images

Docker 이미지는 Docker CLI 또는 Docker 데스크톱과 같은 GUI 도구를 사용하여 관리할 수 있습니다.

몇 가지 일반적인 관리 작업은 다음과 같습니다.

 

Image Command


Image build 하기

 

$ docker build -t image-name .

 

 

-t 또는 --tag : 이미지의 이름과 태그를 지정합니다.

마지막에 . 을 사용하여 해당 경로에서 dockerfile을 찾아야 한다고 알려줍니다.

 

Listing images

 

docker images

 

image 들의 list를 보여줍니다.

 

Removing images

 

docker rmi

docker image 명을 입력하면 되지만 tag로 version 정보를 기입한 경우

 

docker rmi testname:testversion

version 정보까지 기입해줘야 합니다

 

 

Tagging images

 

docker tag SourceImage TaggingImage:your-tag

 

docker build -t test-linux . 명령을 사용하여 이미지를 빌드하면 test-linux이라는 이름의 이미지가 생성됩니다.
이 시점에서 태그가 없으면 Docker는 자동으로 latest 태그를 사용합니다.
따라서 이미지의 전체 이름은 test-linux:latest가 됩니다.

 

그다음 docker tag test-linux test-linux:v1.0.1 명령을 사용하여 새 태그를 추가하면, 도커는 기존 이미지에 대한 참조를 새로운 태그와 함께 저장합니다.
이렇게 하면 test-linux:latesttest-linux:v1.0.1 두 개의 이미지가 나열되지만, 실제로는 동일한 이미지 ID를 공유하고 있으며 동일한 이미지를 참조합니다.

docker images -a 명령을 실행하면 모든 이미지와 태그가 나열되며, test-linux:latesttest-linux:v1.0.1 두 이미지가 나타납니다.
각 태그는 동일한 이미지에 대한 alias입니다.

 

 

Pushing images to a registry

 

docker push image-name:your-tag

 

Pulling images from a registry

 

docker pull image-name:your-tag

 

예제로 보는 Image 관리


아래 예제에서는 각 단계에서 이전 단계의 이미지를 기반으로 새로운 이미지를 생성하는 방식으로 점진적으로 발전하는 이미지 구조를 만듭니다.

이 과정에서 각 단계마다 이미지 버전도 업데이트됩니다.

 

리눅스만 설치된 이미지

먼저 리눅스만 설치된 기본 이미지를 생성하려면, 다음과 같은 Dockerfile을 작성합니다.

 

# 기본 이미지로 Ubuntu를 사용
FROM ubuntu:20.04

# 업데이트 및 필요한 패키지 설치
RUN apt-get update && \\
    apt-get upgrade -y

 

이 Dockerfile을 사용하여 이미지를 빌드하고 태그를 지정합니다.

 

docker build -t test-linux:1.0.1 .

 

리눅스에 nginx 설치

다음으로, nginx을 설치하는 베이스 이미지를 생성하려면, 이전 단계에서 생성한 이미지를 기반으로 Dockerfile을 작성합니다.

 

# 기본 이미지로 이전 단계에서 생성한 이미지를 사용
FROM test-linux:1.0.1

# Nginx 설치
RUN apt-get update && \
    apt-get install -y nginx

# Nginx 서비스 시작
CMD ["nginx", "-g", "daemon off;"]

 

이 Dockerfile을 사용하여 이미지를 빌드하고 새로운 태그를 지정합니다.

 

docker build -t test-linux:1.0.2 .

 

curl, git, wget등을 사용한다고 가정한다면 추가적으로 다운로드 받은뒤 다시 DockerImage로 만들 수 있습니다.

 

Docker FIle

 

# 기본 이미지로 이전 단계에서 생성한 이미지를 사용
FROM test-linux:1.0.2

# curl, git, wget 설치
RUN apt-get update && \
    apt-get install -y curl git wget

 

이 Dockerfile을 사용하여 이미지를 빌드하고 새로운 태그를 지정합니다.

 

docker build -t test-linux:1.0.3 .

 

이렇게 하면 각 단계에서 이전 단계의 이미지를 기반으로 새로운 이미지를 생성하는 점진적으로 발전하는 이미지 구조가 완성됩니다.

 

반응형

댓글