Python 으로 서버를 구축하거나 간단한 Application 을 dockerize하는 경우 python 이미지를 사용하여 배포를 하게 되는데, 이때 몇 가지 설정 만으로 배포속도를 향상시킬 수 있다. 이미지 자체를 가벼운 것을 쓴다거나, 빌드 과정에서 무거워 지는 명령어를 남발하는 경우 빌드가 느려질 수 있다.
Python 배포 시 docker Image 사용
Image 경량화가 무엇이고 왜 해야하는가?
Image 경량화란 docker build 단계에서 어떠한 변경과 설정을 통해 Image의 용량을 줄여주는 것이다.
그렇다면 왜 이미지를 경량화 해야할까?
- 빠른 배포: 이미지가 경량화 되면 용량이 작아서 배포 시간이 줄어들 것이다. 이는 배포 프로세스를 빠르게 만들어 애플리케이션을 더 빠르게 배포할 수 있도록 한다.
- 보안성 향상: 경량화된 이미지는 불필요한 패키지나 라이브러리가 제거되어 있기 때문에 보안성이 더욱 향상된다.
- 용량 절감: 경량화된 이미지는 용량이 작아서 저장소에서 더 적은 공간을 차지할 것이고, 이는 비용을 줄이는 데 도움이 될 것이다.
- 이식성 향상: 경량화된 이미지는 종속성이 적어서 이식성 역시 좋아질 것이다. 이는 서로 다른 환경에서도 애플리케이션을 실행하는데 용이하다고 볼 수 있을 것이다.
방법1)가볍게 만들어진 Python 이미지를 사용한다.
Dockerfile 내에 python 이미지를 사용하는 경우 일반적으로 다음과 같이 사용할 수 있다.
FROM python:3.10
이렇게 빌드하면
약 5개 정도의 서드파티 라이브러리를 install 했을 뿐인데, 152MB 로 빌드된다.
가장 일반적인 python 이미지를 사용한다면 다양한 Python 패키지와 라이브러리를 사용할 수 있다.
여기서 가볍게 만들어진 이미지를 사용하면 쉽게 경량화를 할 수 있다.
python 의 경우
From python:3.10-slim-buster
python:특정버전-slim 이라는 이름으로 빌드하면 가벼운 이미지로 빌드된다.
방법2)Multistage build
Multistage build는 Docker 이미지를 경량화 다른 방법이다.
이미지 크기가 큰 애플리케이션을 빌드하는 경우 유용한 방법인데, 여러 개의 스테이지를 이용하여 Docker 이미지를 만들게 된다.
각 스테이지에서 필요한 패키지와 파일만 복사해서 최종 이미지를 만들기 때문에 이미지 크기가 줄어든다.
Dockerfile 비교
기존에 작성한 Dockerfile은 명령어가 단순하게 순차적으로 동작한다.
FROM python:3.10-slim-buster
MAINTAINER hongreat95@gmail.com
RUN mkdir /slackbot
WORKDIR /slackbot
ADD . /slackbot
# Use Gitsecrets
ARG NOTION
ARG SLACK_APP_TOKEN
ARG SLACK_BOT_TOKEN
ARG SLACK_SIGNING_SECRET
ARG NOTION_reservation
ARG NOTION_lunch
RUN chmod +x setup_env.sh && ./setup_env.sh
RUN pip install --upgrade pip && pip install -r requirements.txt
ENTRYPOINT ["python","main.py"]
Multistage를 적용한 Dockerfile은 Build 와 Production, 2단계로 구분해서 작성할 수 있다.
첫 번째 단계에서는 애플리케이션을 빌드하고 필요한 라이브러리를 설치했고
두 번째 단계에서는
COPY —from=build
구문으로 첫 번째 단계에서 생성한 빌드 파일만 복사하는 이미지를 생성했다.
# Build stage
FROM python:3.10-slim-buster AS build
RUN mkdir /slackbot
WORKDIR /slackbot
ADD . /slackbot
ARG NOTION
ARG SLACK_APP_TOKEN
ARG SLACK_BOT_TOKEN
ARG SLACK_SIGNING_SECRET
ARG NOTION_reservation
ARG NOTION_lunch
RUN chmod +x setup_env.sh && ./setup_env.sh
RUN pip install --upgrade pip && \\
pip install --no-cache-dir --target=/install -r requirements.txt
# Production stage
FROM python:3.10-slim-buster AS production
RUN mkdir /slackbot
WORKDIR /slackbot
COPY --from=build /install /usr/local/lib/python3.10/site-packages/
COPY . /slackbot
ENTRYPOINT ["python","main.py"]
배포 결과 용량 확인
기존에 152MB 였던 용량이 136MB으로 줄었다.
Install 할 것이 많아지는 애플리케이션 일수록, 이 차이가 꽤나 크게 작용할 것이다.
참고하기 좋은 문서
https://docs.docker.com/build/building/multi-stage/
Multi-stage builds
docs.docker.com
Dockerfile을 작성하는 것이 조금 더 복잡해졌긴 했지만
애플리케이션 규모가 증가할수록 오히려 간단해지고 읽기 쉬워질 것이다.
다만, 우려되는 점이 있다면 여러 개의 스테이지를 사용하게 되었을 때 이미지 레이어 수가 늘어나므로 캐시가 불가능해질 수 있지 않을까?
관련된 정보가 부족해 조금 자세하게 알아봐야겠다.
'Develop' 카테고리의 다른 글
데이터베이스 샤딩 : Django[DRF]로 Shard_DB에 create, read 구현하기 (1) | 2023.05.14 |
---|---|
Pycurl Error : Celery와 SQS 구축 시 OpenSSL 이해하고 설정하기 [Celery, AWS SQS] (0) | 2023.04.23 |
[AWS] Root Account - IAM Account | 계정과 보안 개념 (0) | 2023.03.12 |
[DRF 게시판만들기] #4 GenericAPIView & Urls (0) | 2022.03.29 |
[DRF 게시판만들기] #3 Serializer, ModelSerializer 개념 및 역할 (0) | 2022.03.20 |