Docker Desktop 환경에서 컨테이너의 리소스를 어떻게 설정하고 모니터링할 수 있는지, 그리고 이러한 설정이 실제로 어떻게 동작하는지 살펴보겠습니다.
Mac M2 Max, Docker desktop 환경에서 진행하였음

실행 중인 컨테이너에 대한 리소스 사용량 및 성능 정보를 수집, 집계, 출력하는 도구
cadvisor
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # 실행중인 모든 컨테이너 정보. 컨테이너 생성/시작/중지 등의 이벤트 모니터링
- /:/rootfs:ro # 호스트의 전체 파일 시스템 접근해 시스템 전반의 정보 수집
- /var/run:/var/run:ro # 실행중인 프로세스와 서비스에 대한 정보
- /sys:/sys:ro # 커널과 하드웨어 정보에 접근. CPU, memory, disk usage 등의 시스템 메트릭 수집
- /var/lib/docker/:/var/lib/docker:ro # docker 내부 저장소에 접근해 image, volume 등의 상세 정보
- /dev/disk/:/dev/disk:ro # disk usage, I/O statistics 등 저장 장치 관련 메트릭 수집
privileged: true
devices:
- /dev/kmsg:/dev/kmsg
ports:
- 8080:8080
command:
- -housekeeping_interval=5s # 데이터 수집 간격 설정(5 seconds)
테스트 대상 컨테이너
db:
image: mysql
...
localhost:8080으로 들어가면, 아래와 같이 컨테이너에서 사용할 수 있는 resource를 확인할 수 있습니다.

db:
image: mysql
...
deploy:
resources:
limits:
cpus: '0.5'
reservations:
cpus: '0.25'
ctop에서 CPU 100% = 1코어 기준 100%. 5코어면 최대 500%까지 사용ctop으로 실시간 컨테이너 사용 현황을 그래프로 볼 수 있습니다.
0.5 core

0.25 core

db:
image: mysql
...
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 128M
memswap_limit: 2G


DB Container 최초 기동 시 530MB 정도 사용하고 있는 것을 확인.
deploy.resources.limits.memory, memswap_limit 값을 각각 150MB로 설정하면 docker run 할 때 컨테이너가 죽는 것을 확인. (memory limit이 잘 동작하는 것을 확인)
deploy.resources.limits.memory, memswap_limit을 각각 300MB로 설정하면 컨테이너가 죽지 않고 살아있는 것을 확인.
이번 실험을 통해 Docker Desktop 설정을 통해 전체 Docker 환경에 할당할 리소스를 조절할 수 있고, docker-compose 파일 내 설정으로 개별 컨테이너 리소스 사용량을 세밀하게 제어할 수 있음을 확인했습니다.
CPU 코어 수와 메모리 제한이 실제로 잘 동작하는 것을 확인하였고, 이는 여러 컨테이너가 동시에 운영되는 환경에서 특정 컨테이너가 과도하게 리소스를 점유하는 것을 방지할 수 있을 것입니다.
또한 cAdvisor 및 ctop을 활용한 컨테이너 모니터링을 통해 실시간으로 컨테이너 리소스 사용 현황을 들여다보았습니다.