여러 단계로 이미지 구축 시간 단축

Docker는 단일 엔클로저에 여러 어플리케이션을 배치하는 데 매우 용이합니다.Docker는 같은 도구의 다른 버전이든 버전 의존 관계가 다른 응용 프로그램이든 이미 소개했다.근데 공짜는 없어요.이러한 유연성은 디스크 사용률이 높고 이미지가 크다는 문제를 가져왔다.Docker를 사용하려면 이미지 크기를 줄이고 구축 시간을 단축하기 위해 Dockerfile을 조심스럽고 효율적으로 작성해야 합니다.
Docker는 이미지 크기를 작게 유지하기 위해 standard practices을 제공하며 여러 단계의 건설 요약도 포함합니다.
다단계 구축은 공작물, 바이너리 파일 또는 실행 가능한 파일을 구축하는 용례에 특히 유용하다.일반적으로 2진 파일을 구축하려면 GCC, Maven,build essentials 등 많은 의존 항목이 필요하지만, 실행 가능한 파일이 생기면 실행 가능한 파일을 실행할 필요가 없습니다.다단계 구축은 이미지 크기를 탐색하는 데 사용됩니다.개별 환경에서 실행 가능한 파일을 구축한 다음 실행 가능한 파일을 실행하는 데 필요한 실행 가능한 파일과 최소 의존 항목만 사용하여 최종 이미지를 구축할 수 있습니다.
예를 들어 여기에 바둑으로 쓴 simple application이 있다.그것이 하는 일은 바로 인쇄하는 것이다. "안녕하세요, 세상!!!"출력으로다단계 구축을 사용하지 않겠습니다.
Dockerfile
FROM golang
ADD . /app
WORKDIR /app
RUN go build # This will create a binary file named app
ENTRYPOINT /app/app
  • 이미지 구축 및 실행
  • docker build -t goapp .
    ~/g/helloworld ❯❯❯ docker run -it --rm goapp
    Hello World!!
    
  • 이제 이미지 크기를 확인하겠습니다.
  • ~/g/helloworld ❯❯❯ docker images | grep goapp
    goapp                                          latest              b4221e45dfa0        18 seconds ago      805MB
    
  • 새 Dockerfile
  • # Build executable stage
    FROM golang
    ADD . /app
    WORKDIR /app
    RUN go build
    ENTRYPOINT /app/app
    # Build final image
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    WORKDIR /root/
    COPY --from=0 /app/app .
    CMD ["./app"]
    
  • 이미지 재구성 및 실행
  • docker build -t goapp .
    ~/g/helloworld ❯❯❯ docker run -it --rm goapp
    Hello World!!
    
  • 이미지 다시 확인하기
  • ~/g/helloworld ❯❯❯ docker images | grep goapp
    goapp                                          latest              100f92d756da        8 seconds ago       8.15MB
    ~/g/helloworld ❯❯❯
    
    
    이미지 크기가 805MB에서 *8.15MB로 대폭 줄어드는 것을 볼 수 있습니다.이것은 주로 Golang 이미지에 많은 의존 항목이 있기 때문에 최종적으로 실행 가능한 파일은 심지어 이런 의존 항목을 실행할 필요가 없다.
    여기서 무슨 일이 일어났습니까?
    우리는 두 단계로 나누어 이미지를 형상화한다.우선, Golang 기반 이미지를 사용해서 코드를 복사하고 실행 가능한 파일 프로그램을 구축하고 있습니다.이제 다음 단계에서는 새 Alpine 기본 이미지를 사용하고 이전에 구축한 바이너리 파일을 새 단계로 복사합니다.여기서 주의해야 할 중요한 점은 각 단계에서 구축된 이미지가 완전히 독립적이라는 것이다.
  • 단계
  • # Build executable stage
    FROM golang
    ADD . /app
    WORKDIR /app
    RUN go build
    ENTRYPOINT /app/app
    
    * Stage 1
    
    # Build final image
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    WORKDIR /root/
    COPY --from=0 /app/app .
    CMD ["./app”]
    
    COPY —from=0 /app/app-> 에서는 이전 이미지에서 구축한 이미지 내부에서 데이터에 액세스할 수 있습니다.

    다단계 구축은 어떻게 작동합니까?


    이 과정을 자세히 살펴보면 다단계 구축은 실제 Docker 구축과 큰 차이가 없다.유일한 주요 차이점은 여러 개의 독립된 이미지 (단계당 1개) 를 구축하고 작업/파일을 한 이미지에서 다른 이미지로 쉽게 복사할 수 있다는 것입니다.다단계 구축은 현재 제공되는 기능을 스크립트를 통해 미리 보관합니다.사람들은 구축 이미지를 만드는 데 익숙하다. 수동으로 공작물을 복사한 다음에 다른 의존 항목이 필요 없이 새 이미지로 복사한다.위의 예시에서 우리는 단계 0에 이미지를 구축한 다음에 단계 1에 다른 이미지를 구축했다. 우리는 낡은 이미지의 파일을 이 이미지로 복사했다. 이것은 복잡하지 않다.

    참고: /app을 한 용기에서 다른 용기로 복사하는 것이 아니라 한 이미지에서 다른 이미지로 복사하는 중입니다.
    다양한 방식으로 배포를 가속화하고 비용을 절감할 수 있습니다.
  • 은 효율적인 경량급 이미지를 구축할 수 있기 때문에 배치 과정에서 보내는 데이터가 적고 비용과 시간을 절약할 수 있습니다.
  • 은 모든 단계에서 다단계 구축을 멈출 수 있기 때문에 다단계 구축의 생성기 모드를 피할 수 있습니다.개발, 임시 저장 및 배포를 위해 Dockerfile을 제공합니다.
  • 이상은 단지 작은 예일 뿐, 다단계 구축은 다른 언어로 작성된 응용 프로그램의 Docker 이미지를 개선하는 데도 사용할 수 있다.또한 다단계 구축은 여러 개의 Dockerfile (구축기 모드) 을 작성하는 것을 피하는 데 도움이 되고, 반대로 여러 단계의 단일 Dockerfile를 조정하여 개발 과정을 간소화할 수 있다.만약 네가 아직 탐색해 본 적이 없다면, 가서 해라.

    좋은 웹페이지 즐겨찾기