[Docker] 도커 이미지 다루기 : 이미지 경량화 전략
도커 이미지 다루기 : 이미지 경량화 전략
- 도커 이미지 경량화 -> 많은 컨테이너를 띄울 수 있게 하기 위함
- 도커를 사용하는 주된 이유가 가상화 보다 뛰어난 성능기반에 많은 컨테이너를 띄우기 위함
- 이미지가 가벼울 수록 더 많은 컨테이너를 띄울수 있다.
- 즉 도커 사용자의 능력을 평가하는 주요 항목
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
Comments