Docker 이미지 단순화

6092 단어 GoDockerRails
오랜만에 리그 축구 경기에 참가한 것은 근육통 스트림팩의 타나다.

개요


나는 응용 프로그램의 용기에 대응할 때 이런 경험이 비교적 많다고 생각한다.

Docker 이미지 크기가 커지면 Docker Hub, Amazon ECR 등의 기본 저장소에서
push/pull은 시간이 오래 걸리고 서비스 반영은 시간이 오래 걸리거나 기다리기 때문에 스트레스를 받을 수 있습니다.
따라서 사이즈를 최대한 줄이고 경량화하며 안전 위험을 줄이기 위한 방법이다.
경량화해야 한다
  • Multi-stage builds
  • Alpine Linux
  • 필요하지 않은 패키지와 파일을 삭제합니다
  • 관건이 될 것 같습니다.
    예를 들어 공식 버전과 알파인에 비해 1/10 정도의 사이즈가 다르다.
    node 시
    - node:8 -> 670MB
    - node:8-alpine -> 65MB
    루비의 경우
    - ruby:2.4 -> 684MB
    - ruby:2.4-alpine -> 61.7MB

    Rails의 Dockerfile 예


    그러면 Dockerfile을 한 걸음 한 걸음 살펴보겠습니다.
    우선 Ruby on Rails의 경우 Gem install을 통해 패키지 등을 설치해야 합니다.
    그리고 apk를 사용하여 필요한 패키지를 설치합니다.
    이번 상황에서 yarn을 사용했다고 가정하고 node가 설치된 루비-2.6를 지정합니다.필요하면gem 설치에 필요한 패키지를 추가하십시오.예를 들어 mysql-dev 등이다.

    1단계

    FROM ruby:2.5.0-alpine as Builder
    
    RUN apk add --update --no-cache \
        build-base \
        openssl \
        git
    
    다음은 bundle install입니다.
    -j4는 4개를 동시에 다운로드하고 설치할 수 있기 때문에 시간을 조금 줄이고 싶은 상황에서 편리하다.또한 종료 후 필요하지 않은cache, 컴파일용 파일 삭제
    RUN gem install --no-document bundler
    RUN bundle install -j4 --retry 3 \
          && rm -rf /usr/local/bundle/cache/*.gem \
          && find /usr/local/bundle/gems/ -name "*.c" -delete \
          && find /usr/local/bundle/gems/ -name "*.o" -delete
    
    이후 yarn install 등을 실시하여 첫 번째 단계로 끝낸다.
    rails assets::precompile 등은 시간이 필요하기 때문에 Dockerfile에서 지정하지 말고 다른 작업으로 미리 실행하는 것을 권장합니다.
    # Install yarn packages
    COPY package.json yarn.lock /app/
    RUN yarn install
    
    # Add the Rails app
    ADD . /app
    

    마지막 단계


    From에서 실제 응용 프로그램을 실행하는 데 필요한 버전을 지정합니다.
    또 이곳의 특징은 최소한의 소프트웨어 패키지만 설치하는 것이다.
    여분의 포장을 넣으면 사이즈가 커지고 안전 위험도 높아진다.
    # -----ファイナルステージ -----
    FROM ruby:2.4.1-alpine
    
    RUN apk add --update --no-cache \
        tzdata && \
        cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
    테스터라는 사용자를 임시로 만듭니다.
    모바일 응용 프로그램은 루트 권한이 필요하지 않기 때문이다.
    # Add user
    RUN addgroup -g 1000 -S tester \
     && adduser -u 1000 -S tester -G tester
    
    1단계에 설치된 Gem 라이브러리와 Rails 소스 코드를 복사합니다.
    권한도 chown으로 다시 쓰는 것을 잊지 마세요.
    COPY --from=Builder /usr/local/bundle/ /usr/local/bundle/
    COPY --from=Builder --chown=tester:tester /app /app
    
    마지막으로 Rails(puma 서버)를 시작하여 종료합니다.
    USER tester
    WORKDIR /app
    
    CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
    
    어플리케이션에 필요하지 않은 것이 없으므로 Rails console 등이 움직이지 않는다는 점에 유의해야 합니다.

    경품


    Golang이면 더 쉬워요.
    # --- ビルドステージ ---
    FROM golang:alpine AS Builder
    RUN apk update && apk add ca-certificates git
    
    WORKDIF /app
    ADD . /app
    
    # mod を使った場合のパッケージダウンロード
    COPY ./go.mod ./go.sum ./
    RUN go mod download
    RUN cd /app && go build -o goapp
    
    # --- ファイナルステージ ---
    FROM alpine
    RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
    
    WORKDIR /app
    COPY --from=Builder /app/goapp /app
    ENTRYPOINT ./goapp
    

    결론


    이전 1G 정도의 이미지 크기는 400MB 정도로 바뀌었고 ECR에서의pull/push는 이전보다 일찍 편안해졌다.Golang의 경우 20MB 정도라서 더 편해요.간단하고 가볍고 빠르다... 컨테이너에 더 적합하다.
    멀티스테이지builders를 배울 때 이곳의 유튜브는 사람들에게 인상을 남기기 쉬우니 참고할 만하다.
    https://www.youtube.com/watch?v=wGz_cbtCiEA
    그럼, 좋은 컨테이너 생활을 하세요.

    좋은 웹페이지 즐겨찾기