3 minute read

도커 이미지 다루기 : 이미지 경량화 전략

  • 도커 이미지 경량화 -> 많은 컨테이너를 띄울 수 있게 하기 위함
  • 도커를 사용하는 주된 이유가 가상화 보다 뛰어난 성능기반에 많은 컨테이너를 띄우기 위함
  • 이미지가 가벼울 수록 더 많은 컨테이너를 띄울수 있다.
  • 즉 도커 사용자의 능력을 평가하는 주요 항목

1. 꼭 필요한 패키지 및 파일만 추가

  • 최신 버전의 이미지를 그대로 받게 되는 경우 실제 서비스에 필요하지 않은 이미지도 같이 올라가게 되어 이미지의 용량이 더 커지게 됨

2. 컨테이너 레어어 수 줄이기

  • ..\fastcampus-devops\3-docker-kubernetes\3-dockerfile\slacktee\Dockerfile

    #
    # slacktee
    #
    # build:
    #   docker build --force-rm -t slacktee .
    # run:
    #   docker run --rm -it --name slacktee slacktee
    #

    FROM alpine:3.14
    LABEL maintainer="FastCampus Park <fastcampus@fastcampus.com>"
    LABEL description="Simple utility to send slack message easily."

    # Install needed packages
    
    ## RUN 이라는 명령어를 여러번 사용하는 것보다
    ## && 로 묶어서 한 문장의 명령어로 묶어서 사용하는 것이 좋다.
    ## (이유) RUN을 여러번 사용하는 경우 사용할 때마다 레이어가 추가 된다. 
    RUN \
    apk add --no-cache bash curl git && \
    git clone https://github.com/course-hero/slacktee /slacktee && \
    ## 캐쉬를 남기지 않게 설정
    apk del --no-cache git 

    RUN chmod 755 /slacktee/slacktee.sh

    # Run
    WORKDIR /slacktee
    ENTRYPOINT ["/bin/bash", "-c", "./slacktee.sh"]

3. 경량 베이스 이미지 선택

  • ..\fastcampus-devops\3-docker-kubernetes\3-dockerfile\slacktee\Dockerfile\Dockerfile.slim
  • docker build –force-rm -t nodejs-server:slim -f Dockerfile.slim .
  • -f : 파일 지정 옵션
  • . : 빌드 소스 위치

    #
    # nodejs-server
    #
    # build:
    #   docker build --force-rm -t nodejs-server .
    # run:
    #   docker run --rm -it --name nodejs-server nodejs-server
    #

    FROM node:16-slim
    LABEL maintainer="FastCampus Park <fastcampus@fastcampus.com>"
    LABEL description="Simple server with Node.js"

    # Create app directory
    WORKDIR /app

    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./

    RUN npm install
    # If you are building your code for production
    # RUN npm ci --only=production

    # Bundle app source
    COPY . .

    EXPOSE 8080
    CMD [ "node", "server.js" ]

  • Dockerfile.slim 빌드 결과

    REPOSITORY                    TAG        IMAGE ID       CREATED              SIZE
    nodejs-server                 slim       cceb8f246b83   About a minute ago   186MB
    nodejs-server                 latest     1950cd836e97   2 days ago           917MB

  • ..\fastcampus-devops\3-docker-kubernetes\3-dockerfile\slacktee\Dockerfile\Dockerfile.alpine
  • docker build –force-rm -t nodejs-server:alpine -f Dockerfile.alpine .

    #
    # nodejs-server
    #
    # build:
    #   docker build --force-rm -t nodejs-server .
    # run:
    #   docker run --rm -it --name nodejs-server nodejs-server
    #

    FROM node:16-alpine
    LABEL maintainer="FastCampus Park <fastcampus@fastcampus.com>"
    LABEL description="Simple server with Node.js"

    # Create app directory
    WORKDIR /app

    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./

    RUN npm install
    # If you are building your code for production
    # RUN npm ci --only=production

    # Bundle app source
    COPY . .

    EXPOSE 8080
    CMD [ "node", "server.js" ]

4. 멀티 스테이지 빌드 사용

  • 멀티 스테이지 파이프 라인
  • ..\fastcampus-devops\3-docker-kubernetes\3-dockerfile\slacktee\Dockerfile\Dockerfile.alpine-multi
  • docker build –force-rm -t nodejs-server:multi -f Dockerfile.alpine-multi .

  • 각 단계별 스테이지를 구성하여 각 단계별 라이브러리 의존성을 줄임, 이미지의 경량화 최대로 올린 상테

    #
    # nodejs-server
    #
    # build:
    #   docker build --force-rm -t nodejs-server .
    # run:
    #   docker run --rm -it --name nodejs-server nodejs-server
    #

    ######### AS base stage : START
    FROM node:16-alpine AS base
    LABEL maintainer="FastCampus Park <fastcampus@fastcampus.com>"
    LABEL description="Simple server with Node.js"

    # Create app directory
    WORKDIR /app

    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./
    ######### AS base : END


    ######### AS build stage : START
    FROM base AS build
    RUN npm install
    # If you are building your code for production
    # RUN npm ci --only=production
    ######### AS build : END

    ######### AS release stage : START
    FROM base AS release
    COPY --from=build /app/node_modules ./node_modules
    # Bundle app source
    COPY . .

    EXPOSE 8080
    CMD [ "node", "server.js" ]
    ######### AS release : END

Categories:

Updated:

Comments