DevOps/도커 (Docker)

[Docker] - 004. Multi Stage Build 와 Base 이미지 만들기

귀찮은 개발자 2024. 4. 19. 01:04

도커 이미지, 도커 컨테이너를 효율적으로 관리하려고 할 때 가 있다.

만약 여러 프로젝트에서 공용으로 사용할 Ubnutu 이미지를 만들어 Base 이미지로 활용될 수 있으며, CI/CD 시간을 줄이고자 Multi Stage Build 을 이용할 수 도 있다. 

멀티 스테이지 빌드

멀티 스테이지 빌드는 하나의 Dockerfile에서 스테이지를 여러 개로 나누어 빌드 프로세스를 만드는 것을 말한다.

각 스테이지는 이미지의 일부분을 생성하며, 이전 스테이지에서 생성된 파일을 다음 스테이지로 전달할 수 있다. 이 과정으로 최적화가 가능하다.

멀티 스테이지 빌드의 장점

  • 이미지 크기 감소
  • 빌드 프로세스 간소화
  • 의존성 관리 용이성
  • 이미지 크기 감소

사용 예시

CI/CD 과정에서 쓰이며 마지막 스테이지에는 최소한의 파일과 패키지만 존재한다. 

FROM docker.my-team.com/backend-team/ubuntu:22.04 AS baseOS

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY . .

RUN npm run build

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf

COPY --from=baseOS /app/build /usr/share/nginx/html

CMD ["nginx", "-g", "daemon off;"]

베이스 이미지

베이스 이미지는 다른 이미지의 기반이 되는 이미지로, 보통 운영체제나 미들웨어 등의 기본 환경을 제공하며 기존 이미지를 확장하는 방법등을 통해 베이스 이미지를 만들 수 있다. 

베이스 이미지의 장점

  • 원하는 OS, 미들웨어를 사전에 설정하여 개발 환경을 표준화
  • 보안 및 성능 향상을 위해 필요한 패키지와 환경변수 등을 사전 미리 포함

사용 예시

특정 언어나 프레임워크를 지원하는 베이스 이미지를 만들어 개발자들이 공통된 개발 환경을 사용할 수 있다.

보안 패치나 성능 향상을 위한 설정을 포함한 베이스 이미지를 만들어 여러 프로젝트에서 사용할 수 있다.

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

RUN sed -i 's/archive.ubuntu.com/kr.archive.ubuntu.com/g' /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
    curl \
    wget \
    nano \
    nodejs \
    npm \
    golang \
    php \
    python3 \
    python3-pip \
    build-essential \
    libssl-dev \
    libffi-dev \
    && rm -rf /var/lib/apt/lists/*

RUN ln -s /usr/bin/node /usr/bin/node2

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

COPY php.ini /etc/php/7.4/cli/php.ini

RUN pip3 install --upgrade pip \
    && pip3 install virtualenv


WORKDIR /app

CMD ["bash"]

결론으로

Docker 환경에서 개혹은 운영할 경우 멀티 스테이지 빌드와 베이스 이미지를 사용하여 개발/서비스의 일관성을 유지할 수 있다.  이러한 기능을 잘 활용해서 이미지 빌드 프로세스를 최적화하고 표준화된 개발 환경을 구축하는 것은 소프트웨어 개발과 배포의 효율성을 향상시키는 데 중요한 요소이니 적극 활용해야 한다.