본문 바로가기
공부/개발자를 위한 쉬운 Docker

[Docker] 이미지 빌드

by 도리언 옐로우 2024. 11. 17.

1. 이미지의 생성

(1) 이미지 커밋

이미지 커밋(commit)은 실행 중인 컨테이너의 현재 상태를 새로운 이미지로 저장하는 것을 말한다. 애플리케이션 실행 중 변경된 컨테이너 상태를 이미지로 보존하여 재사용할때 유용한 기능이다. 도커 레이어 구조의 관점에서 보면 기존에 있던 레이어들의 맨 위에서 사용되던 컨테이너 레이어까지 포함해서 레이어 한장이 더 추가된 상태로 새로운 이미지로 만들어지는 것으로 볼 수 있다.

 

실습 명령어 정리

  • docker run -it --name [컨테이너명] [이미지명] bin/bash :it 옵션을 통해 커맨드창으로 컨테이너와 직접 상호작용이 가능하게 됨. bin/bash는 리눅스의 shell을 명령어로 지정한 것으로, cmd 대신 shell을 통해 사용자가 터미널로 접근할 수 있음. 디버깅 용으로 자주 사용됨.
  • docker commit -m "[커밋메세지]" [실행중인 컨테이너명] [생성할 이미지명] : 실행중인 컨테이너를 이미지로 생성. -c 옵션을 통해 새로운 이미지의 Dockerfile 명령 지정 가능.
    ex) docker commit -m "editted index.html" -c 'CMD ["nginx", "-g", "daemon off;"]' officialNginx dorianyellow/commitingnginx

(2) 이미지 빌드

도커 이미지 빌드는 컨테이너 기반 애플리케이션 개발에서 가장 핵심이 되는 기능 중 하나이다. 이를 통해 애플리케이션  실행 환경을 코드로 정의, 관리하고 일관된 이미지를 생성할 수 있다. 이하에서 자세히 알아보자.

 

https://jibinary.tistory.com/70

우선 도커 이미지를 생성하는 또다른 방법인 이미지 커밋과 비교해보자. 이미지 커밋 방식의 경우 1) 컨테이너를 실행한 후 명령어를 수동으로 입력하여 변경사항을 적용시켜야하고, 2) 여러 레이어를 추가하려면 여러 번의 커밋이 필요하며, 3) 이미지 생성 과정을 기록하기 어려워 동일한 이미지를 다시 생성하기 어렵다는 단점이 있다. 이러한 특징으로 이미지 커밋은 주로 디버깅 또는 긴급한 수정에 사용되고, 도커 이미지를 생성하는 경우에는 대부분 빌드 방식을 사용하게 된다.

 

이미지 빌드는 Dockerfile에 정의된 지시어를 기반으로 이미지를 생성하는 방식이다. 구체적으로는 도커데몬이 도커파일에 적힌 지시어를 기반으로 이미지를 만들어주는 방식으로, 빌드과정은 1) Dockerfile의 지시어를 실행하기 위해 임시 컨테이너를 생성, 2) 각 지시어를 실행한 결과를 새로운 레이어로 저장, 3) 사용한 임시컨테이너 삭제하고 최종적으로 이미지 생성 순으로 이루어진다.

 

IaC (Infrastructure as Code)는 인프라를 코드로 정의하고 관리하는 방법론인데, 이는 도커 이미지 빌드에도 적용된다. IaC는 인프라 상태를 코드로 정의하여 동일한 환경을 언제든지 자동으로 생성가능하고, 코드처럼 버전관리가 가능하여 변경 사항을 추적할 수 있다는 특징이 있다. 도커는 Dockerfile을 통해 인프라 상태를 정의하고, 이를 코드로 저장하여 이미지를 생성한다. 결국 Dockerfile은 도커에서 인프라를 코드로 관리하는 대표적인 IaC 도구라고 할 수 있다.

 

실습 명령어 정리

  • docker build -t [이미지명] [Dockerfile경로] : 도커 빌드 명령어 -> 도커파일이 있는 곳에서 해야 편함

2. Dockerfile

(1) 빌드 컨텍스트

빌드 컨텍스트는 도커 이미지 빌드에 필요한 파일들이 포함된 폴더이다. 도커 데몬은 빌드 컨텍스트를 통해 Dockerfile과 빌드에 필요한 모든 파일을 전달받는다.

 

빌드 컨텍스트의 구성요소는 다음과 같다.

  • Dockerfile : 이미지를 생성하기 위한 지시어를 담고 있음
  • 빌드에 사용되는 파일 : 애플리케이션 코드, 설정파일 등
  • .dockerignore 파일 : 빌드 컨텍스트에 포함하지 않을 파일 등을 지정

(2) Dockerfile 기본

Dockerfile은 도커 이미지 생성 과정을 정의하는 텍스트 파일로, 일련의 명령어로 작성되어 있어 도커가 이를 읽고 이미지를 빌드한다. 쉽게 말해 도커에게 어떤 작업을 수행할지를 코드로 작성해 놓은 것이라고 할 수 있다.

 

Dockerfile의 기본적인 모습을 아래의 간단한 Dockerfile 예제를 통해 살펴보자. 

# 1. 베이스 이미지 지정
FROM python:3.9-slim

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 애플리케이션 파일 복사
COPY . .

# 4. 의존성 설치
RUN pip install -r requirements.txt

# 5. 컨테이너 실행 시 실행될 명령어 설정
CMD ["python", "app.py"]

(3) Dockerfile 지시어

Dockerfile의 여러가지 지시어를 정리하고 넘어가기로 하자. 참고로 Dockerfile의 지시어에는 레이어를 추가하는 지시어와 그렇지 않은 지시어가 있는데, 파일시스템의 내용을 변경하게 되면 일반적으로 레이어를 추가하게 되고 메타데이터에만 영향을 주는 경우라면 레이어를 추가하지 않는다.

 

실습 명령어 정리

  • docker build -f [도커파일명] -t [이미지명] [Dockerfile경로] : -f 옵션은 도커파일명이 Dockerfile이 아닌 경우 별도 지정

3. Multi-Stage Build

멀티 스테이지 빌드는 여러 단계를 거쳐 이미지를 생성하여, 최종 이미지에 필요한 파일만 포함시킴으로써 이미지 크기를 최소화할 수 있는 빌드방법이다. 일반적으로 애플리케이션 빌드 과정에서 만들어지는 파일들은 용량을 많이 차지하는데 이 파일들은 실제로 애플리케이션 실행에 사용되지 않는다. 따라서 이미지를 빌드에 사용하는 이미지와 실행에 사용하는 이미지로 나누면 애플리케이션이 실행되는 이미지의 크기를 줄일 수 있게 되는 것이다.

 

멀티 스테이지 빌드의 예제를 살펴보는 것으로 포스팅을 마무리한다. 멀티 스테이지 빌드에서는 아래의 예제에서처럼 여러개의 베이스 이미지를 사용할 수 도 있다.

# 빌드 단계
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o main .

# 실행 단계
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
CMD ["./main"]

'공부 > 개발자를 위한 쉬운 Docker' 카테고리의 다른 글

[Docker] 도커 컴포즈  (0) 2024.11.22
[Docker] 도커 볼륨  (0) 2024.11.20
[Docker] 도커 네트워크  (0) 2024.11.19
[Docker] 도커 이미지  (0) 2024.11.17
[Docker] 가상화 기술과 도커  (0) 2024.11.11