도커 이미지의 최적화는 배포 속도 개선, 보안 강화 및 유지 관리의 용이성에 큰 영향을 미칩니다. 다음은 몇 가지 주요 도커 이미지 최적화 전략과 예제 코드입니다.
.dockerignore
파일을 사용하면 빌드 컨텍스트에서 제외할 파일이나 디렉토리를 지정할 수 있습니다. 이를 통해 이미지 크기를 줄이고 빌드 속도를 높일 수 있습니다.
.dockerignore 예시:
*.log
*.tmp
node_modules/
rm -rf
명령어 사용빌드 과정에서 필요하지 않은 파일이나 디렉토리를 삭제합니다.
Dockerfile 예시:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y package-name \
&& rm -rf /var/lib/apt/lists/*
이를 통해 최종적으로 이미지의 크기를 줄임과 동시에 불필요한 라이브러리나 파일들을 제거함으로써 보안적인 측면에서도 효과를 볼 수 있습니다.
경량화된 베이스 이미지를 사용하면 전체 이미지 크기를 상당히 줄일 수 있습니다.
Alpine을 사용한 Dockerfile 예시:
FROM python:3.8-alpine
RUN pip install flask
CMD ["python", "app.py"]
단, 위 이미지의 경우 최소한의 필요 파일들만을 갖기에 의존성 문제가 발생할 수 있습니다. 자신에게 맞는 이미지를 선택하는 것이 중요합니다.
Multi-Stage Build를 사용하면 최종 이미지에서 빌드 도구나 중간 파일을 제거할 수 있어 이미지 크기를 최소화합니다.
Multi-Stage Build 예시:
# 빌드 스테이지
FROM node:12 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 실행 스테이지
FROM nginx:alpine
COPY --from=build-stage /app/build /usr/share/nginx/html
빌드 스테이지를 통해 필요한 파일들을 생성(빌드)하고 해당 파일들만을 최종 이미지에 가져옴으로써 이미지의 크기를 줄일 수 있습니다.
레이어 수를 최소화하면 이미지 크기와 레이어 관리의 복잡성을 줄일 수 있습니다.
레이어 최소화 예시:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
FROM, RUN 등의 명령어들은 하나의 레이어를 구축하게 되는데, 여러 개의 레이어로 나누는 것보다는 하나의 레이어로 묶음으로써 관리를 더욱 용이하게 할 수 있습니다.
도커파일의 경우 동일한 명령어의 경우 캐싱을 통해 재사용을 하게 됩니다
그러므로 변경이 적은 명령어들을 상단에 배치하게 된다면 캐시의 효과를 크게 볼 수 있습니다.
Dockerfile 예시:
FROM python:3.8-slim
COPY requirements.txt /app/
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app
CMD ["python", "app.py"]
위와 같은 상황에서 COPY requirements.txt /app/
라는 명령어가 변경되면 해당 명령줄 아래의 명령들은 모두 다시 빌드되어야 합니다. 따라서 변경이 잦은 부분은 아래로 내려 주는 것이 좋습니다.
위 방법들을 통해 효율적인 도커 이미지를 구축하여 더 빠른 배포, 간소화된 관리등을 할 수 있습니다.