Security
[Docker] 도커 컨테이너 자원 제한(보안 관점에서의 최적화)
min8282
2025. 4. 14. 14:44
도커 컨테이너를 운영할 때, 시스템 자원을 적절히 제한하는 것은 리소스 낭비를 방지하고, 보안성을 높이며, 전체 시스템의 안정성을 유지하는 데 매우 중요합니다. 이번 포스트에서는 CPU, 메모리, 프로세스 수를 제한하는 방법과 그 의미를 보안과 연계하여 설명하고, 실제 부하 테스트 방법까지 실습해 보겠습니다.
1. 자원 제한을 위한 Docker 실행 예시
sudo docker run -itd --name nginx-8001 -p 8001:80 --cpus="0.5" --memory="256m" --pids-limit=100 nginx:latest
sudo docker run -itd --name nginx-8002 -p 8002:80 --cpus="0.5" --memory="256m" --pids-limit=100 nginx:latest
sudo docker run -itd --name nginx-8003 -p 8003:80 --cpus="0.5" --memory="256m" --pids-limit=100 nginx:latest
명령어 실행 설명
- -cpus="0.5": CPU 사용량을 0.5 코어로 제한
- -memory="256m": 메모리 사용량을 256MB로 제한
- -pids-limit=100: 컨테이너 내 프로세스 수를 100개로 제한 (포크 폭탄 방지)
- nginx:latest: 최신 Nginx 도커 이미지 사용
2. 리소스 사용량 실시간 모니터링
컨테이너가 실제로 어느 정도의 자원을 사용하는지 확인하려면 docker stats 명령어를 사용합니다.
sudo docker stats
실행 중인 모든 컨테이너의 CPU, 메모리, 네트워크 사용량 등이 실시간으로 출력됩니다.
3. 리소스 제한과 보안의 관계
CPU 제한
- 하나의 컨테이너가 과도하게 CPU를 점유하더라도, 시스템 전체나 다른 컨테이너에 영향을 주지 않도록 보호합니다.
- 예기치 않은 무한 루프 등의 공격성 코드로부터 시스템 자원을 방어할 수 있습니다.
메모리 제한
- 메모리 누수 또는 의도적인 메모리 과다 사용을 방지합니다.
- 제한된 메모리를 초과하면 컨테이너가 종료되므로, 전체 시스템이 다운되는 사태를 예방할 수 있습니다.
프로세스 수 제한 (pids-limit)
- 포크 폭탄(fork bomb) 등 무한 프로세스 생성 공격을 효과적으로 차단합니다.
격리 효과
- 각 컨테이너는 이름과 포트로 구분되어 독립적으로 동작합니다.
- 네트워크 격리와 함께 적용하면 보안 수준을 더욱 강화할 수 있습니다.
4. 부하 테스트 (stress 도구 사용)
부하 테스트 도구 설치
- 리소스 제한이 실제로 효과적인지 확인하기 위해, 컨테이너 내부에서 stress 도구를 이용한 부하 테스트를 진행합니다.
① 컨테이너 내부에 진입
sudo docker exec -it nginx-8001 bash
② stress 설치
apt update && apt install -y stress
CPU 부하 테스트
stress --cpu 4 --timeout 30
- 4개의 CPU 작업을 시도하지만, --cpus="0.5" 설정 덕분에 컨테이너는 약 50% CPU까지만 사용할 수 있습니다.
- 호스트에서 docker stats를 통해 확인 가능
메모리 부하 테스트
stress --vm 1 --vm-bytes 300M --timeout 30
- 300MB의 메모리를 사용하려 하지만, --memory="256m" 설정 때문에 사용량을 초과하면 해당 작업이 실패하거나 종료됩니다.
- 메모리 제한이 효과적으로 적용된 것을 확인할 수 있습니다.
마무리
도커 컨테이너는 매우 유연하지만, 적절한 자원 제한 설정 없이 사용하면 시스템 전체에 악영향을 줄 수 있습니다.
CPU, 메모리, 프로세스 수를 제한하면 단순한 성능 관리뿐 아니라 보안적인 측면에서도 리스크를 줄이는 데 큰 도움이 됩니다.