생산을 위해 Docker 이미지를 최적화하는 속성 클래스 정보


면책 성명: Zeet 다음 달에 이 블로그를 협찬할 것입니다.며칠 전에 해봤어요.서버가 없는 것과 유사하지만 전체 백엔드를 실행하는 데 사용됩니다.너는 자동으로 응용 프로그램을 위탁 관리하고 확장할 수 있다.아주 깔끔해요.
응용 프로그램을 배치하는 데 시간이 오래 걸리는데, 싫지 않습니까?단일 컨테이너 이미지에서 1GB를 초과하는 것은 Best Practice가 아닙니다.매번 새로운 버전을 배치할 때마다 수십억 바이트의 데이터를 전송해야 하는데, 이것은 나에게 그다지 적합하지 않다.

TL;박사


본고는 Docker 이미지를 더욱 작고 빠르며 생산에 적합하게 최적화하는 몇 가지 간단한 절차를 보여 드리겠습니다.
기본 노드 간의 크기와 성능 차이를 보여 주는 것이 목표입니다.js 이미지 및 최적화 대응.이것은 의사일정이다.
  • 노드를 선택한 이유.js?
  • 기본 노드를 사용합니다.js 이미지
  • 노드를 사용합니다.js Alpine image
  • 개발 의존 제외
  • 기본 알프스 이미지 사용
  • 다단계 구축 사용
  • 우리 뛰어들자.

    왜 노드를 선택했는지js?


    노드js는 현재 가장 통용되고 초보자에게 가장 우호적인 백엔드 입문 환경입니다. 저는 그것을 제 주요 언어로 쓰기 때문에 당신은 그것을 참아야 합니다.고소하는 거 맞죠?😙
    해석 언어로서 JavaScript는 Go와 같은 컴파일된 대상이 없습니다.노드의 크기를 없애려면 당신이 할 수 있는 일이 많지 않습니다.js 이미지.아니면 있어요?
    나는 이것이 틀렸다는 것을 증명하러 왔다.작업을 위해 정확한 기초 이미지를 선택하고 생산 이미지에만 생산 의존항을 설치한다. 물론 다단계 구축을 사용하는 것은 이미지의 무게를 대폭 줄일 수 있는 방법이다.
    다음 예에서 나는 내가 얼마 전에 쓴 간단한 것Node.js API을 사용했다.

    기본 노드를 사용합니다.js 이미지


    물론, 처음부터 나는 기본 노드를 사용했다.js 이미지는 the Docker hub 에서 추출됩니다.오, 내가 얼마나 무식한가.
    FROM node
    WORKDIR /usr/src/app
    COPY package.json package-lock.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    사이즈 맞히고 싶어요?나는 깜짝 놀랐다.간단한 API를 위한 727MB!?

    그러지 마세요.너는 이렇게 할 필요가 없다. 솔직히 말하면 싫다.

    노드를 사용합니다.js Alpine 이미지


    이미지 크기를 대폭 줄이는 가장 간단하고 빠른 방법은 훨씬 작은 기초 이미지를 선택하는 것이다.Alpine는 소형 Linux 발행판으로 이 작업을 완성할 수 있다.노드의 Alpine 버전만 선택하면 됩니다.js는 커다란 개선을 보일 것입니다.
    FROM node:alpine # adding the alpine tag
    WORKDIR /usr/src/app
    COPY package.json package-lock.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    꼬박 6배 작아!123.1MB로 낮춥니다.더 그런 것 같아.

    개발 의존 항목 제외


    응.. 하지만 우리는 다른 일을 해야 해.좋습니다. 최종 이미지의 생산 의존항만 필요하더라도 모든 의존항을 설치하고 있습니다.우리 한번 바꿔볼까요?
    FROM node:alpine
    WORKDIR /usr/src/app
    COPY package.json package-lock.json ./
    RUN npm install --production # Only install prod deps
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    시작할게요.저희가 또 30MB 줄었어요!현재 91.6MB로 낮아졌습니다.우리는 지금 진전을 거두고 있다.

    이것은 나로 하여금 자신을 자랑스럽게 한다. 나는 이것으로 끝내려고 한다.갑자기 생각났어요.만약 내가 원시적인 알프스 산 이미지부터 시작한다면?기본 Alpine 이미지를 캡처하고 노드를 설치하면 더 작아질 수 있습니다.나 혼자.내가 맞았어!

    기본 Alpine 이미지 사용


    너는 이런 행동이 거의 다르지 않다고 생각할 수도 있지만, 그것은 이전 버전보다 20MB 감소했다.
    FROM alpine # base alpine
    WORKDIR /usr/src/app
    RUN apk add --no-cache --update nodejs nodejs-npm # install Node.js and npm
    COPY package.json package-lock.json ./
    RUN npm install --production
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    이제 70.4MB 로 내려갑니다.저희가 시작한 곳보다 10배나 작아요!

    우리는 지금 더 이상 할 수 없다, 그렇지?그렇지...?

    다단계 구축 사용


    응, 사실은 있어.우리 차원을 이야기합시다.
    각 Docker 이미지는 레이어에서 작성됩니다.각 레이어는 Dockerfile의 명령입니다.이것은 위의 파일입니다.
    FROM alpine # base alpine
    WORKDIR /usr/src/app
    RUN apk add --no-cache --update nodejs nodejs-npm # install Node.js and npm
    COPY package.json package-lock.json ./
    RUN npm install --production
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    FROM 명령은 레이어를 만들고, WORKDIR와 RUN 등도 레이어를 만듭니다. 마지막 쓰기 가능 레이어 CMD를 제외한 모든 레이어는 읽기 전용입니다.읽기 전용 레이어는 용기 사이에서 공유할 수 있으며, 이것은 하나의 이미지가 용기 사이에서 공유될 수 있다는 것을 의미한다.
    Docker는 스토리지 드라이버를 사용하여 읽기 전용 및 쓰기 가능 컨테이너 레이어를 관리합니다.이것은 용기가 삭제되면 삭제되는 임시 층이다.정말 멋있어요.그런데 왜 이게 중요해?
    층수를 최소화함으로써 우리는 더욱 작은 그림을 얻을 수 있다.이것이 바로 다단계 구축 절차를 사용하는 곳이다.
    FROM alpine AS multistage
    WORKDIR /usr/src/app
    RUN apk add --no-cache --update nodejs nodejs-npm
    COPY package.json package-lock.json ./
    RUN npm install --production
    ​
    #
    ​
    FROM alpine
    WORKDIR /usr/src/app
    RUN apk add --no-cache --update nodejs
    COPY --from=multistage /usr/src/app/node\_modules ./node\_modules
    COPY . .
    EXPOSE 3000
    CMD ["node", "app.js"]
    
    우리는 첫 번째 이미지로만 의존항을 설치한 다음 마지막 이미지에서 모든 node\u 모듈을 복사합니다. 어떤 내용도 구축하거나 설치하지 않습니다.최종 이미지에 npm 설치를 건너뛸 수도 있습니다!
    마지막 사이즈 맞히고 싶어요?착수

    나는 우리가 그것을 48.6MB로 낮추는 것을 잘했다고 말할 것이다. 이것은 15배의 진보이며 자랑스럽다.

    판결문


    천진난만하지 마라. 생산 과정에서 천메가바이트 크기의 이미지를 사용할 이유가 절대 없다.첫 번째 단계는 아주 작은 기초 이미지를 사용하는 것이다.어릴 때부터 비틀거리며 걷는 것이 좋다.
    최적화된 기초 이미지를 선택하면 갈 길이 멀어진다.배포 속도를 높이고 CI/CD 파이프 속도가 느린 경우 multistage builds 를 참조하십시오.너는 앞으로 어떤 다른 방식으로도 이 일을 하고 싶지 않을 것이다.
    주의: 저는 생산 환경에 배치하기 전에 테스트를 실행할 때 개발 의존항을 포함하는 예시를 빠뜨렸습니다. 왜냐하면 이것은 생산 환경에서 실행할 때의 최종 크기 감소와 무관하기 때문입니다.물론, 이것은 효과적인 용례이다!언제든지 아래 댓글에 당신의 생각을 추가하세요.나는 너의 생각을 매우 듣고 싶다.
    Docker와 Kubernetes에 대한 DevOps 관련 기사를 보려면 언제든지 방문하십시오.
    내가 글을 쓰는 것을 좋아하는 것처럼 너희들이 이 글을 즐겨 읽기를 바란다.당신은 이 강좌가 다른 사람에게 도움이 된다고 생각합니까?공유를 망설이지 마라.만약 네가 그것을 좋아한다면, 아래의 딱정벌레를 깨뜨려라. 그러면 다른 사람들이 DEV.to에서 볼 수 있을 것이다.

    좋은 웹페이지 즐겨찾기