처음부터 100kB Docker 이미지 빌드

2983 단어 devopstutorialdocker
📓 The Gist

100mB 알파인 이미지가 작다고 생각할 수도 있지만 100kB는 어떻습니까? 이미지가 작을수록 더 빨리 배송되고 공격 벡터가 더 적습니다. 또한 이미지를 최적화하여 앱을 실행하는 데 필요한 것을 정확히 찾아 분리할 수 있습니다.

최적화하자.



스크래치 기반 도커 이미지에는 두 가지 주요 특징이 있습니다.
  • Dockerfile에는 두 가지 빌드 단계가 있습니다.
  • 빌더--소스, 라이브러리 및 도구를 포함한 모든 빌드 종속성을 포함하고..
  • 바이너리 및 런타임 종속성(구성 파일, 인증서 및 동적으로 연결된 라이브러리)을 포함하는 최종 이미지

  • 최종 이미지는 FROM scratch -- 빈 도커 이미지

  • 이 접근 방식을 사용하면 런타임 이미지에 앱을 실행하는 데 필요한 항목이 정확히 포함되며 잘못 구성되거나 악용될 수 있는 추가 구성 파일, 데몬 또는 라이브러리가 없습니다.

    기본적인 정적 Hello World 스크래치 이미지를 살펴보겠습니다. 가장 적은 종속성을 필요로 하고 작은 ELF 객체 바이너리를 생성하기 때문에 C를 사용할 것입니다.

    Hello World 만들기


    hello.c
    #include <stdio.h>
    int main(void){
        puts("Hello World\n");
    }
    
    Makefile
    hello: hello.c
        gcc -o $@  $< -static 
    
    

    도커파일


    .dockerignore
    # this prevents our host binary from sneaking into the build
    hello
    
    Dockerfile
    FROM alpine:latest as builder
    WORKDIR /build
    RUN apk update && \
        apk add gcc make libc-dev
    COPY .  ./
    RUN make
    
    FROM scratch
    WORKDIR /
    COPY --from=builder /build/hello .
    CMD ["/hello"]
    

    두 개의 FROM 가 있음을 주목하세요. 하나는 builder 입니다. 최종 이미지는 우리의 주자가 될 것입니다. COPY --from를 사용하여 스크래치 이미지에 들어갈 파일을 선택할 수 있습니다. 정적 ELF 바이너리를 사용하면 /build/hello만 필요합니다.

    빌드 및 실행



    $ docker build . -t hello-scratch|tail -n 1
    Successfully tagged hello-scratch:latest
    



    $ docker run hello-scratch                 
    Hello World
    

    최종 이미지는 82.7kB입니다.



    $ docker images |grep hello-scratch | egrep -o '[^ ]+$'
    82.7kB
    

    내부는 무엇입니까?


    docker save를 사용하여 이미지를 검사하고 layer.tar에 단일 파일만 포함되어 있음을 확인할 수 있습니다. hello
    
    $ mkdir hello-scratch && cd hello-scratch 
    $ docker save hello-scratch |tar -x
    $ ls
    3e69d91b5842be72dcd4175adcf218a03f78826504be6a46ed41c099e97520e8.json  e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954  manifest.json  repositories
    $ ✗ tar -tf e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954/layer.tar 
    hello
    
    

    다음 단계



    다음 포스트에서는 좀 더 정교한 예를 보여드리겠습니다. 이 프로세스는 C, C++, golang & rust와 같은 정적으로 컴파일된 앱에서 가장 쉽습니다. 그러나 적절한 도구를 사용하면 모든 런타임 종속성을 최종scratch 이미지로 수집한다고 가정하면 모든 이미지를 빌드할 수 있습니다.

    좋은 웹페이지 즐겨찾기