본문 바로가기
Docker

Docker 보안 및 최적화 / 성능 최적화: 리소스 관리, 이미지 최적화

by Maccrey Coding 2024. 9. 14.
반응형

 

Docker는 컨테이너 기반의 가상화 플랫폼으로, 애플리케이션을 신속하게 배포하고 실행할 수 있는 강력한 도구입니다.

그러나 Docker 컨테이너를 효과적으로 운영하기 위해서는 성능 최적화가 필수적입니다.

이 블로그에서는 리소스 관리이미지 최적화를 통해 Docker 컨테이너의 성능을 최적화하는 방법을 초보자도 이해할 수 있도록 자세히 설명하겠습니다.

1. 리소스 관리

컨테이너를 운영할 때, CPU와 메모리와 같은 리소스를 적절히 관리하는 것이 중요합니다. 리소스를 적절히 할당하고 제한하면 컨테이너의 성능을 최적화하고, 시스템 자원의 낭비를 줄일 수 있습니다.

1.1 CPU 리소스 관리

Docker는 컨테이너가 사용할 수 있는 CPU 자원을 제한하고 우선순위를 설정할 수 있는 다양한 방법을 제공합니다.

 

1. CPU 제한 설정예시

컨테이너가 사용할 수 있는 CPU의 비율을 설정하여 리소스를 제한할 수 있습니다. --cpus 옵션을 사용하여 CPU 사용량을 제한할 수 있습니다.

docker run --cpus="1.5" my_image

 

이 명령어는 컨테이너가 최대 1.5개의 CPU를 사용할 수 있도록 제한합니다.

 

2. CPU 공유

컨테이너의 CPU 우선순위를 설정하여 리소스 분배를 조정할 수 있습니다. --cpu-shares 옵션을 사용하여 CPU의 상대적 우선순위를 설정할 수 있습니다.

docker run --cpu-shares=512 my_image

 

 

기본값은 1024이며, 숫자가 낮을수록 CPU 우선순위가 낮아집니다.

 

3. CPU 제어 그룹

--cpuset-cpus 옵션을 사용하여 특정 CPU 코어에 컨테이너를 바인딩할 수 있습니다.

docker run --cpuset-cpus="0,1" my_image

 

이 명령어는 컨테이너가 CPU 0과 1만 사용하도록 제한합니다.

1.2 메모리 리소스 관리

컨테이너의 메모리 사용량을 관리하여 시스템의 메모리 자원을 효율적으로 활용할 수 있습니다.

 

1. 메모리 제한 설정

--memory 옵션을 사용하여 컨테이너의 메모리 사용량을 제한할 수 있습니다.

docker run --memory="512m" my_image

 

이 명령어는 컨테이너가 최대 512MB의 메모리만 사용하도록 제한합니다.

 

2. 스왑 메모리 제한

--memory-swap 옵션을 사용하여 컨테이너가 사용할 수 있는 스왑 메모리의 양을 제한할 수 있습니다.

docker run --memory="512m" --memory-swap="1g" my_image

 

 

이 명령어는 컨테이너가 최대 512MB의 메모리와 1GB의 스왑 메모리를 사용할 수 있도록 설정합니다.

 

3. OOM(Out-Of-Memory) 정책

--oom-kill-disable 옵션을 사용하여 메모리 부족 시 컨테이너가 자동으로 종료되지 않도록 할 수 있습니다.

docker run --oom-kill-disable my_image

 

2. 이미지 최적화

Docker 이미지를 최적화하면 빌드 시간을 줄이고, 이미지 크기를 줄이며, 컨테이너 성능을 향상시킬 수 있습니다. 이미지 최적화는 주로 Dockerfile을 수정하여 이루어집니다.

2.1 이미지 크기 줄이기

1. 불필요한 파일 제거

Dockerfile에서 불필요한 파일이나 패키지를 제거하여 이미지 크기를 줄일 수 있습니다.

FROM ubuntu:20.04

# 필수 패키지 설치
RUN apt-get update && apt-get install -y \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*  # 패키지 캐시 제거

COPY . /app
WORKDIR /app
RUN make /app

CMD ["./myapp"]

 

위 Dockerfile에서는 apt-get으로 설치한 패키지 캐시를 삭제하여 이미지 크기를 줄이고 있습니다.

 

2. 다단계 빌드 사용

다단계 빌드를 사용하면 빌드 과정에서 생성된 불필요한 파일을 최종 이미지에서 제거할 수 있습니다.

# 빌드 단계
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 실행 단계
FROM scratch
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

 

 

이 Dockerfile은 두 단계로 나누어져 있습니다. 첫 번째 단계에서는 Go 애플리케이션을 빌드하고, 두 번째 단계에서는 최소한의 scratch 이미지를 사용하여 최종 이미지를 생성합니다.

 

3. 최적화된 베이스 이미지 사용

가능한 경우, alpine과 같은 경량 베이스 이미지를 사용하여 이미지 크기를 줄일 수 있습니다.

FROM alpine:latest
RUN apk add --no-cache curl
COPY . /app
CMD ["/app/myapp"]

 

alpine 이미지는 매우 가벼워서 최종 이미지의 크기를 크게 줄일 수 있습니다.

2.2 이미지 캐시 활용

1. 캐시된 레이어 재사용

Docker는 이미지를 빌드할 때 각 명령어를 레이어로 분리하여 캐시합니다. Dockerfile에서 자주 변경되지 않는 명령어를 위쪽에 배치하여 캐시된 레이어를 재사용할 수 있습니다.

FROM node:14

# 종속성 설치
COPY package*.json ./
RUN npm install

# 애플리케이션 코드 복사
COPY . .

CMD ["npm", "start"]

 

package.json과 package-lock.json을 먼저 복사하고 종속성을 설치한 후, 애플리케이션 코드를 복사하면, 종속성이 변경되지 않는 한 npm install 단계가 캐시됩니다.

 

2. 캐시 무효화 전략

이미지 빌드를 자주 변경하는 경우, --no-cache 옵션을 사용하여 캐시를 무효화하고, 항상 최신 버전으로 이미지를 빌드할 수 있습니다.

docker build --no-cache -t my_image .

 

Docker 컨테이너의 성능을 최적화하려면, 리소스 관리와 이미지 최적화가 필수적입니다.

리소스 관리를 통해 CPU와 메모리 자원을 효율적으로 활용하고, 이미지 최적화를 통해 이미지 크기를 줄이며 성능을 향상시킬 수 있습니다.

이 블로그에서 소개한 방법을 적용하여 Docker 컨테이너의 성능을 효과적으로 개선해 보세요.

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

반응형