INFRA/Doker

Docker image 경량화

sshhhh 2024. 7. 29. 00:17

이미지 경량화

  • 이미지 크기가 커지면 컨테이너 크기도 커지기 때문에 경량화가 중요 → 빠른 배포를 위해 이미지 크기를 작게 해야함

 

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

  • 필요한 파일 및 패키지를 제외하여 이미지 크기 최소화

 

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

  • &&으로 run 개수==레이어 개수를 줄어야 한다. 
  • 강제적으로 임시 이미지, 컨테이너 제거
docker build --force-rm -t nodejs-server .
  • Node.js 서버의 예시 Dockerfile : 이미지 크기를 줄이기 위해 최적화된 방법을 사용
root@docker:~/01.docker-file/nodejs-server# ls
Dockerfile  Dockerfile.alpine  Dockerfile.alpine-multi  Dockerfile.slim  package.json  server.js

root@docker:~/01.docker-file/nodejs-server# vi Dockerfile
#
# nodejs-server
#
# build:
#   docker build --force-rm -t nodejs-server .
# run:
#   docker run --rm -it --name nodejs-server nodejs-server
#

FROM node:16
LABEL maintainer="a"
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" ]

 

  • 그냥 빌드하면 용량이 900MB 넘음
--docker build -t [이미지명] -f [도커파일경로] .
root@docker:~/01.docker-file/nodejs-server# docker build --force-rm -t nodejs-server .

root@docker:~/01.docker-file/nodejs-server# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
nodejs-server   latest    7ed31cd65e58   9 seconds ago   916MB



 

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

 

3-1. slim

  • 이미지 빌드
--이미지 빌드
--빌드 완료 후 중간 컨테이너를 강제 제거
--생성된 이미지를 'nodejs-server:slim' 태그 지정
--'Dockerfile.slim' 파일을 사용하여 이미지를 빌드
-- . 현재 디렉토리를 빌드 컨텍스트로 사용
docker build --force-rm -t nodejs-server:slim -f Dockerfile.slim .
  • Dockerfile.slim 확인
root@docker:~/01.docker-file/nodejs-server# vi Dockerfile.slim
FROM node:16-slim
LABEL maintainer="a"
LABEL description="Simple server with Node.js"

--위와 같음

CMD [ "node", "server.js" ]
  • slim 표시로 인해 경량화되었음
root@docker:~/01.docker-file/nodejs-server# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
nodejs-server   slim      7abc4e7cce10   9 seconds ago   186MB
nodejs-server   latest    7ed31cd65e58   7 minutes ago   916MB

 

 

3-2 alpine

  • 이미지 빌드
docker build --force-rm -t nodejs-server:alpine -f Dockerfile.alpine .
  • Dockerfile.alpine 확인
FROM node:16-alpine

--이하 내용 같음--
  • alpine 표시로 인해 경량화되었음
root@docker:~/01.docker-file/nodejs-server# docker build --force-rm -t nodejs-server:alpine -f Dockerfile.alpine .

root@docker:~/01.docker-file/nodejs-server# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
nodejs-server   alpine    3c0cfe00fb98   21 seconds ago   124MB
nodejs-server   slim      7abc4e7cce10   2 minutes ago    186MB
nodejs-server   latest    7ed31cd65e58   9 minutes ago    916MB

 

 

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

  • 이미지 빌드
docker build --force-rm -t nodejs-server:alpine-multi -f Dockerfile.alpine-multi .
  • Dockerfile.alpine-multi 확인
--base라는 이름을 밑에서  재사용할수있음
FROM node:16-alpine AS base
LABEL maintainer=""
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 ./

------------

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

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

EXPOSE 8080
CMD [ "node", "server.js" ]
  • 경량화 완료
root@docker:~/01.docker-file/nodejs-server# docker images
REPOSITORY      TAG            IMAGE ID       CREATED          SIZE
nodejs-server   alpine-multi   9ddb751f98ee   3 seconds ago    120MB