| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- 파이썬 장고
- 에어플로우 기초강의
- 예제프로젝트
- mlops
- 장고 튜토리얼
- 프로그래밍
- 웹개발
- flask
- c++
- docker
- airflow
- 장고 기초 강의
- 기초강의
- 파이썬강의
- Python
- 플라스크
- 도커
- 인공지능
- 도커 컴포즈
- 개발언어
- ADP
- 장고
- c
- 파이썬
- 개발자취업
- C언어
- cpp
- 쇼핑몰예제
- Django
- 개발자
- Today
- Total
TITEDIOS Dev Note
[Docker]#24 도커 이미지 - 최적화 및 빌드 속도 향상하는 법 본문
도커 이미지는 애플리케이션을 배포하고 실행하기 위한 기본 단위로, 이미지의 크기와 빌드 속도는 배포 효율성 및 자원 관리에 영향을 미칩니다. 특히 배포에 있어 이미지가 매우 중요하기 때문에 이미지를 작게 관리하는 것은 매우 중요한 요소 중 하나입니다. 이 포스팅에서는 도커 이미지의 크기를 최적화하고 빌드 속도를 향상하는 방법을 알아보겠습니다.
목차
- 도커 이미지 최적화의 필요성
- 이미지 크기 최적화 방법
2.1 경량 베이스 이미지 사용
2.2 멀티스테이지 빌드 활용
2.3 불필요한 파일 및 레이어 제거
2.4 캐싱 활용
2.5 이미지 압축 - 빌드 속도 향상 방법
3.1 빌드 캐시 활용
3.2 병렬 빌드 및 단계적 빌드
3.3 컨텍스트 크기 최소화
3.4 도커 빌드킷 사용 - 결론 및 최종 팁
1. 도커 이미지 최적화의 필요성
도커 이미지는 기본적으로 파일 시스템의 스냅샷과 같습니다. 크기가 큰 이미지일수록 전송, 배포, 실행에 필요한 시간과 리소스가 증가하며, 이는 시스템 성능 저하로 이어질 수 있습니다. 또한, 도커 이미지 빌드 시간이 길어지면 개발 주기가 느려지고, CI/CD 파이프라인에서도 병목 현상이 발생할 수 있습니다. 따라서 이미지의 크기를 줄이고 빌드 속도를 향상하는 것은 매우 중요합니다.
- 빠른 빌드: 작은 이미지는 빌드 시간을 단축하여 개발 생산성을 높입니다.
- 빠른 배포: 작은 이미지는 네트워크 전송 시간을 줄여 배포 시간을 단축합니다.
- 적은 디스크 공간: 작은 이미지는 저장 공간을 절약합니다.
- 강화된 보안: 불필요한 파일을 제거하여 공격 표면을 줄입니다.
2. 이미지 크기 최적화 방법
2.1 경량 베이스 이미지 사용
도커 이미지는 베이스 이미지를 기반으로 빌드됩니다. 따라서 가능한 작은 베이스 이미지를 선택하는 것이 중요합니다. 예를 들어, alpine 이미지는 매우 작고 최소한의 라이브러리만 포함하고 있어 일반적으로 ubuntu나 debian보다 훨씬 가볍습니다.
FROM alpine:latest
alpine 이미지의 크기는 약 5MB 정도로, ubuntu의 약 80MB에 비해 훨씬 작습니다. 그러나 경량 이미지를 사용하려면 필요한 패키지를 추가로 설치해야 할 수도 있으므로, 사용 사례에 맞는 베이스 이미지를 선택하는 것이 중요합니다.
2.2 멀티스테이지 빌드 활용
멀티스테이지 빌드는 빌드 단계와 최종 단계(런타임 단계)를 분리하여 불필요한 파일과 빌드 종속성을 최종 이미지에 포함하지 않도록 합니다. 이를 통해 최종 이미지의 크기를 줄일 수 있습니다. 도커 보안 모범 사례에도 나왔지만 멜티스테이지 빌드의 이점이 많으므로 잘 활용하시기 바랍니다.
# 빌드 단계
FROM golang:alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 최종 이미지
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp . # builder 이미지의 /app/myapp 위치를 현재 컨테이너 . 위치(현재위치)에 복사
CMD ["./myapp"]
위 예시에서는 빌드에 필요한 golang 이미지를 최종 이미지에 포함하지 않고, 오직 빌드된 바이너리 파일만 alpine 기반 최종 이미지에 포함시킵니다.
2.3 불필요한 파일 및 레이어 제거
이미지 크기를 줄이기 위해 불필요한 파일을 .dockerignore 파일에 추가하여 빌드 콘텍스트에서 제외합니다. 또한, 도커 파일의 각 명령어는 레이어를 생성하므로, 가능한 한 명령어를 결합하여 레이어 수를 줄이는 것이 좋습니다.
# .dockerignore 파일에 추가
node_modules
*.log
.dockerignore 에 등록하면 해당 파일은 도커 이미지에 포함되지 않기 때문에 이미지 경량화에 도움이 됩니다.
# 레이어 결합 예시
RUN apt-get update && apt-get install -y curl wget && rm -rf /var/lib/apt/lists/*
이렇게 하면 불필요한 레이어 생성을 방지하고, 이미지 크기를 줄일 수 있습니다.
2.4 캐싱 활용
도커는 기본적으로 각 단계에서 캐시를 사용하여 빌드 속도를 높이고, 이미지를 최적화합니다. 캐시를 잘 활용하기 위해 도커 파일에서 자주 변경되지 않는 부분을 상단에 배치하고, 자주 변경되는 부분을 하단에 배치합니다.
# 자주 변경되지 않는 종속성 설치
RUN apt-get update && apt-get install -y python3
# 자주 변경되는 소스 코드 복사
COPY . /app
이렇게 하면 종속성 설치와 같은 시간이 오래 걸리는 작업은 캐시를 통해 재사용되고, 소스 코드 변경 시에만 다시 빌드됩니다.
2.5 이미지 압축
도커 이미지를 푸시하거나 전송할 때 이미지 크기를 줄이기 위해 압축할 수 있습니다. 도커 이미지는 기본적으로 레이어 단위로 압축되지만, 추가로 docker save 명령어와 gzip을 사용해 이미지를 압축하여 전송할 수 있습니다. 도커 이미지를 압축하는 방식으로 저장하지만 실제로는 잘 활용이 되지 않을 것 같습니다(개인적인 의견입니다).
docker save my_image | gzip > my_image.tar.gz
3. 빌드 속도 향상 방법
3.1 빌드 캐시 활용
앞서 언급한 것처럼 도커는 빌드 캐시를 사용하여 빌드 속도를 향상합니다. 빌드 캐시를 최대한 활용하려면 자주 변경되지 않는 작업을 먼저 실행하고, 자주 변경되는 작업을 나중에 실행하는 것이 중요합니다. 또한, 동일한 캐시를 사용하기 위해 docker build 명령어에 --cache-from 옵션을 사용할 수 있습니다.
docker build --cache-from=my_previous_image -t my_image .
이렇게 하면 my_previous_image를 기반으로 변경이 있는 부분만 빌드가 진행되게 됩니다.
3.2 병렬 빌드 및 단계적 빌드
병렬 빌드를 통해 빌드 시간을 단축할 수 있습니다. 예를 들어, 멀티스테이지 빌드에서 서로 다른 스테이지에서 독립적인 작업을 병렬로 수행할 수 있습니다. 또한, 빌드 중에 필요하지 않은 파일은 가능한 한 늦게 추가하여 빌드 속도를 높일 수 있습니다.
3.3 컨텍스트 크기 최소화
빌드 컨텍스트에 포함된 파일이 많을수록 도커 빌드 시간이 길어집니다. .dockerignore 파일을 사용하여 빌드에 필요하지 않은 파일을 제외하면 콘텍스트 크기를 줄일 수 있습니다. 이는 특히 대규모 프로젝트에서 빌드 속도에 큰 영향을 미칩니다.
사실 이러한 빌드 속도나 이미지 경량화 등은 대규모 프로젝트 등 시스템 안정성이 매우 중요한 환경이나 프로젝트에서 수행하게 됩니다. 하드웨어 자원이 충분한 환경 또는 중소규모의 프로젝트에서는 오히려 이러한 것이 과도하게 생각될 수도 있고 일정이 늦어질 수도 있기 때문에 주의하시기 바랍니다.
3.4 도커 빌드킷 사용
도커 빌드킷(BuildKit)은 도커의 새로운 빌드 엔진으로, 빌드 속도와 효율성을 크게 향상시킬 수 있습니다. 빌드킷을 사용하려면 환경 변수를 설정하거나 도커 CLI에서 직접 활성화할 수 있습니다.
export DOCKER_BUILDKIT=1
docker build -t my_image .
빌드킷은 캐시를 더 효율적으로 사용하고, 빌드 로그를 더 잘 관리하며, 병렬 빌드를 최적화하는 등의 기능을 제공합니다.
결론
도커 이미지 최적화와 빌드 속도 향상은 애플리케이션 배포와 운영의 효율성을 크게 향상할 수 있습니다. 경량 베이스 이미지 사용, 멀티스테이지 빌드 활용, 불필요한 파일 제거, 캐시 활용 등 다양한 방법을 조합하여 이미지를 최적화하면 여러분의 환경과 상황에 맞는 이미지를 만들 수 있습니다. 또한, 빌드킷과 같은 최신 도구를 활용해 빌드 속도를 최적화하는 것도 좋은 방법입니다.
최적화된 도커 이미지는 빠른 배포와 효율적인 리소스 사용을 가능하게 하며, 이는 결국 애플리케이션의 전반적인 성능과 안정성에 긍정적인 영향을 미칩니다. 꾸준한 모니터링과 최적화를 통해 도커 환경을 점진적으로 더 발전되도록 운영해 보세요.
도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.
감사합니다!
'Docker' 카테고리의 다른 글
| [Docker]#23 도커 리소스 관리 - 기초 사용법 및 관리 방법 (0) | 2024.09.06 |
|---|---|
| [Docker]#22 도커 보안 - 이미지 스캔 및 취약점 발견하는 방법 (0) | 2024.09.05 |
| [Docker]#21 도커 보안 - 보안 모범 사례 (5) | 2024.09.04 |
| [Docker]#20 도커 컴포즈(docker compose) - docker-compose.yml 파일 작성법 (2) | 2024.09.03 |
| [Docker]#19 도커 컴포즈(docker compose) - 개념 정리 (1) | 2024.09.02 |