Docker는 컨테이너 기술을 통해 애플리케이션을 가볍고 빠르게 배포할 수 있는 장점을 제공합니다. 그러나 서버의 리소스를 효율적으로 관리하지 않으면 컨테이너가 과도한 자원을 사용하여 다른 애플리케이션에 영향을 줄 수 있습니다. 이를 방지하기 위해 Docker 컨테이너의 CPU와 메모리 자원을 제약하는 방법을 알아보겠습니다. 이 글에서는 Docker의 --memory--cpus 옵션을 사용하여 컨테이너 자원을 제한하는 방법에 대해 설명합니다.

Docker 컨테이너의 메모리 제한

Docker는 --memory 옵션을 통해 컨테이너가 사용할 수 있는 메모리 양을 제한할 수 있습니다. 이 옵션을 사용하면 컨테이너가 지정된 메모리를 초과하여 사용하지 않도록 제어할 수 있습니다.

docker run --memory="512m" my_container

위 명령어는 my_container 컨테이너가 최대 512MB의 메모리만 사용하도록 설정합니다. 메모리 양은 m(MB) 또는 g(GB) 단위로 지정할 수 있습니다.

또한, --memory-swap 옵션을 사용하여 메모리와 스왑 메모리의 총합을 제한할 수 있습니다. 예를 들어, 다음과 같이 설정하면 최대 1GB의 메모리와 1GB의 스왑 메모리를 사용하도록 제한할 수 있습니다.

docker run --memory="1g" --memory-swap="2g" my_container

메모리 스왑 (--memory-swap)

--memory-swap는 스왑 메모리를 포함한 총 메모리 사용량을 설정하는 옵션입니다. 설정하지 않으면 기본적으로 컨테이너는 물리 메모리와 스왑 메모리를 모두 사용 가능하며, 제한을 설정하면 과도한 스왑 사용을 방지할 수 있습니다.

메모리 예약 (--memory-reservation)

Docker에서는 --memory-reservation 옵션을 사용하여 컨테이너가 항상 보장받아야 하는 최소 메모리 양을 설정할 수 있습니다. 이 값은 --memory보다 낮아야 하며, 메모리 경쟁 상황이나 호스트 시스템의 리소스가 부족할 때 컨테이너의 안정성을 높이는 데 유용합니다.

docker run --memory="512m" --memory-reservation="256m" my_container

이렇게 설정하면, 컨테이너는 최소 256MB의 메모리를 항상 보장받으며, 최대 512MB까지 사용할 수 있습니다.

메모리 스와피니스 (--memory-swappiness)

--memory-swappiness 옵션을 사용하면 컨테이너의 스왑 사용 비율을 설정할 수 있습니다. 값은 0에서 100 사이이며, 낮은 값은 스왑 사용을 제한하고 높은 값은 적극적으로 스왑을 사용하는 것을 의미합니다.

Docker 컨테이너의 CPU 사용량 제한

CPU 사용량을 제한하려면 --cpus 옵션을 사용할 수 있습니다. 이 옵션은 컨테이너가 사용할 수 있는 CPU의 양을 지정합니다. 예를 들어, 컨테이너가 최대 1.5개의 CPU만 사용하도록 설정하려면 다음과 같이 명령어를 실행합니다.

docker run --cpus="1.5" my_container

이렇게 하면 해당 컨테이너는 호스트 시스템의 CPU 1.5개만 사용할 수 있습니다. 이 옵션은 CPU 사용량을 효율적으로 관리하고, 특정 컨테이너가 다른 애플리케이션의 성능에 영향을 미치는 것을 방지하는 데 유용합니다.

CPU 제한 세분화 (--cpu-period--cpu-quota)

좀 더 세밀하게 CPU 사용을 제한하려면 --cpu-period--cpu-quota를 조합하여 사용할 수 있습니다. 예를 들어, 다음 명령어는 컨테이너가 20%의 CPU만 사용하도록 설정합니다.

docker run --cpu-period=100000 --cpu-quota=20000 my_container

--cpu-period는 CPU 주기의 길이를 정의하며, --cpu-quota는 해당 주기 동안 사용할 수 있는 CPU 시간을 제한합니다. 이 조합은 CPU 사용률을 더 정밀하게 제어할 수 있습니다.

CPU 쉐어(CPU Shares) 설정

Docker는 --cpu-shares 옵션을 통해 컨테이너 간의 CPU 우선순위를 설정할 수 있습니다. 기본값은 1024이며, 숫자가 클수록 높은 우선순위를 갖습니다. 예를 들어, 두 개의 컨테이너가 실행 중일 때, 하나는 1024, 다른 하나는 512로 설정하면, 1024로 설정된 컨테이너가 CPU를 두 배 더 많이 사용할 수 있게 됩니다.

docker run --cpu-shares=1024 my_container_1
docker run --cpu-shares=512 my_container_2

이렇게 설정함으로써 CPU 리소스 사용량을 조절하여 컨테이너 간에 자원을 더 유연하게 배분할 수 있습니다.

Docker Compose 파일에서 리소스 제약 설정

다중 컨테이너를 동시에 관리할 때 Docker Compose 파일에서 리소스 제한을 설정하는 것이 유용합니다. 아래는 Docker Compose 파일에서 리소스를 제약하는 방법입니다.

version: '3.8'
services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: '256M'
        reservations:
          cpus: '0.25'
          memory: '128M'

이 예제에서는 웹 컨테이너에 대해 CPU와 메모리의 최대 사용량과 예약을 설정했습니다. Compose 파일에서 설정함으로써 관리의 일관성을 유지하고 여러 컨테이너 간의 자원 할당을 명확히 할 수 있습니다.

실시간 스케줄러 설정 (--cpu-rt-runtime)

실시간 태스크를 위한 CPU 사용량을 설정할 수 있습니다. 이는 실시간 애플리케이션에서 사용되며, 컨테이너의 실시간 태스크 사용을 제한합니다.

실제 활용 예시

서버에서 여러 개의 Docker 컨테이너를 운영할 때 특정 컨테이너가 다른 컨테이너에 비해 더 많은 리소스를 소모하면 성능 저하가 발생할 수 있습니다. 이 경우 CPU와 메모리 제한을 적용하여 각 컨테이너가 적절한 리소스만 사용하도록 설정하면 서버의 안정성을 높일 수 있습니다. 예를 들어, 데이터베이스 컨테이너에는 높은 CPU와 메모리 자원을 할당하고, 단순 웹 서버에는 낮은 자원을 할당하는 방식으로 최적화할 수 있습니다.

docker run --name web_server --cpus="0.5" --memory="256m" web_image
docker run --name db_server --cpus="2" --memory="2g" db_image

위와 같이 웹 서버는 CPU 0.5개와 256MB 메모리를 사용하고, 데이터베이스 서버는 CPU 2개와 2GB 메모리를 사용하도록 설정하여 자원을 효율적으로 관리할 수 있습니다.

결론

Docker 컨테이너에 CPU와 메모리 자원을 제한하는 것은 서버의 안정적인 운영을 위해 매우 중요합니다. --memory, --cpus, --cpu-shares, --memory-reservation, --memory-swappiness 등의 옵션을 활용하면 각 컨테이너가 과도한 리소스를 사용하는 것을 방지하고, 서버의 성능을 최적화할 수 있습니다. 이러한 자원 제약을 통해 컨테이너 환경에서 더 안정적이고 예측 가능한 애플리케이션을 운영할 수 있습니다. 초기 설정 이후에도 운영 환경에 맞추어 지속적인 모니터링과 튜닝이 필요합니다.

참고자료

댓글남기기