가이드/Docker 메모리 과다 사용

Mac에서 Docker가 메모리를 너무 많이 쓸 때: 원인 컨테이너 찾기와 제한하는 방법

Atta 🐬

Vitals 창립자

게시일

간단한 답

Mac에서 Docker는 모든 컨테이너를 Linux 가상 머신 하나 안에서 실행하므로, 활성 상태 보기에는 컨테이너가 아니라 큰 프로세스 하나(대개 Virtual Machine Service for Docker)만 보입니다. 어떤 컨테이너가 메모리를 쓰는지 보려면 docker stats 명령을 실행하세요. 전체를 제한하려면 Docker Desktop의 Settings → Resources → Advanced에서 Memory limit을 낮추세요. 기본값은 Mac 메모리의 절반입니다. 같은 곳의 Resource Saver는 Docker Desktop이 유휴 상태일 때 가상 머신을 끕니다. Mac용 시스템 모니터인 Vitals는 컨테이너 탭에서 모든 컨테이너의 메모리, CPU, 네트워크, 포트를 보여 주고, 메뉴 막대에서 컨테이너를 중단할 수 있습니다.

Docker 메모리 찾기와 제한하는 방법

  1. 01 활성 상태 보기를 열고 메모리를 클릭한 다음 검색 필드에 Docker를 입력합니다. 가장 큰 행이 컨테이너를 실행하는 가상 머신이며, Apple의 Virtualization 프레임워크를 쓰는 경우 이름은 Virtual Machine Service for Docker입니다. com.docker.backend는 Docker Desktop 자체입니다.
  2. 02 터미널에서 docker stats --no-stream 명령을 실행합니다. 각 행이 실행 중인 컨테이너이며, MEM USAGE / LIMIT에 사용량과 사용할 수 있는 최대치가 나옵니다.
  3. 03 쓰지 않는 것을 중단합니다. docker stop 뒤에 컨테이너 이름을 붙이거나, Compose 프로젝트 폴더에서 docker compose down 명령을 실행합니다.
  4. 04 Docker Desktop의 Settings → Resources → Advanced를 열고 Memory limit을 가장 바쁠 때 docker stats에 나오는 값보다 조금 높은 수준까지 낮춥니다. 변경 사항을 적용하면 Docker Desktop이 가상 머신을 재시작합니다.
  5. 05 같은 섹션에서 Resource Saver를 켜서, 실행 중인 컨테이너가 없을 때 가상 머신이 종료되게 합니다.

OrbStack, Colima, Rancher Desktop, Podman도 가상 머신 안에서 컨테이너를 실행하며, 각각 자체 메모리 설정이 있습니다. Colima에서는 colima start --memory 4 명령으로 가상 머신에 4 GB를 할당합니다.

컨테이너는 Linux 기능이므로, Mac에서는 모든 엔진이 작은 Linux 가상 머신 안에서 컨테이너를 실행합니다. macOS는 그 가상 머신을 프로세스 하나로 보며, 그 안의 어떤 컨테이너가 무엇을 쓰는지 전혀 모릅니다. 그래서 활성 상태 보기에는 몇 GB짜리 프로세스 하나만 보이고 컨테이너는 하나도 보이지 않으며, 답은 Docker 자체 도구에 있습니다. 아래 표는 눈에 보이는 것이 무엇이고 어떻게 해야 하는지 짝지어 보여 줍니다.

Docker의 메모리가 쓰이는 곳

보이는 것무엇인지할 일
Virtual Machine Service for Docker, 몇 GB 모든 컨테이너를 실행하는 Linux 가상 머신 Settings → Resources → Advanced에서 Memory limit 낮추기
com.docker.backend Docker Desktop 자체 프로세스 대개 작음. 계속 커지면 Docker Desktop 재시작
실행 중인 컨테이너가 없는데도 메모리가 높음 가상 머신이 사용했던 메모리를 아직 붙잡고 있음 Resource Saver를 켜거나 Docker Desktop 종료
한도에 가까운 컨테이너 하나 메모리가 더 필요하거나, 누수가 있음 docker stats, 그리고 컨테이너별 한도
이미지를 빌드하는 동안 메모리가 늘어남 빌드가 같은 가상 머신에서 실행됨 정상. 빌드가 끝나면 줄어듦

활성 상태 보기에 큰 Docker 프로세스 하나만 보이는 이유

가상 머신은 다른 앱처럼 macOS에서 메모리를 받으며, 설정한 Memory limit까지 받습니다. 그 안에서 Linux가 메모리를 컨테이너들에 나눠 주고, 남은 것은 macOS처럼 파일 캐시에 씁니다. 밖에서 보면 모두 똑같이, 메모리를 많이 붙잡고 있는 프로세스 하나로 보입니다.

어떻게 나뉘는지는 엔진만 알고 있으며, docker stats가 바로 그것을 엔진에 묻는 명령입니다. 거기서 CPU % 열은 가상 머신 CPU에 대한 비율이고, MEM %는 컨테이너 한도에 대한 비율이며, 컨테이너에 한도가 없으면 가상 머신 전체에 대한 비율입니다.

Docker에 메모리를 얼마나 할당할까

Docker Desktop은 기본적으로 Mac 메모리의 절반을 가져갑니다. 16 GB Mac이라면 8 GB입니다. 앱 서버, 데이터베이스, 캐시로 이루어진 일반적인 개발 스택은 대개 그보다 훨씬 적게 필요합니다. 평소처럼 스택을 실행하고, 가장 바쁠 때 docker stats의 합계를 지켜본 다음, Memory limit을 그보다 조금 높게 설정하세요.

너무 낮게 설정하면 가상 머신 안의 Linux가 메모리가 바닥난 컨테이너를 강제로 끝냅니다. docker inspect --format '{{.State.OOMKilled}}' 뒤에 컨테이너 이름을 붙여 실행하면, 그런 일이 있었을 때 true가 출력됩니다. 한도를 높이거나, 그 컨테이너에 따로 한도를 주어 다른 컨테이너까지 함께 쓰러뜨리지 않게 하세요.

컨테이너별 메모리 한도 설정하기

컨테이너 하나에 한도를 걸면 누수가 있는 서비스가 가상 머신을 가득 채우지 못합니다. docker run 명령에는 --memory 512m 옵션을 추가하세요. Compose 파일에서는 해당 서비스에 mem_limit: 512m 설정을 추가합니다. 한도를 넘으면 컨테이너가 중단되며, docker stats에서 사용량 옆에 한도가 표시됩니다.

Docker가 메모리를 돌려주지 않는 이유

컨테이너를 중단하면 가상 머신 안의 메모리는 비워지지만, 가상 머신이 그 메모리를 항상 바로 macOS에 돌려주지는 않아서 활성 상태 보기의 수치가 높게 남아 있을 수 있습니다. Resource Saver는 Docker Desktop이 유휴 상태일 때 가상 머신을 꺼서 전부 돌려주며, 컨테이너가 필요하면 몇 초 만에 다시 시작합니다. Docker Desktop을 종료해도 마찬가지입니다.

Docker와 디스크 공간

이미지, 중단된 컨테이너, 볼륨, 빌드 캐시는 작업할수록 커지는 디스크 이미지 하나에 들어 있으며, Mac에서는 시스템 데이터에 포함됩니다. docker system df는 종류별로 얼마나 차지하는지 보여 줍니다. docker system prune 명령은 중단된 컨테이너, 사용하지 않는 네트워크, 태그 없는(dangling) 이미지, 빌드 캐시를 제거합니다. --volumes 옵션은 필요한 데이터가 담긴 볼륨이 없다고 확신할 때만 추가하세요. Docker Desktop 설정에서 Memory limit 옆에 있는 Disk usage limit으로 크기를 제한할 수 있습니다.

Vitals가 더해 주는 것

Vitals는 가상 머신이 macOS에 알려 주지 않는 것, 즉 모든 컨테이너의 메모리를 보여 줍니다.

  • 모든 컨테이너의 메모리, CPU, 네트워크, 디스크, 게시된 포트를 보여 주는 컨테이너 탭. Compose 프로젝트는 함께 묶어 표시
  • 가장 큰 컨테이너와 한도에 가장 가까운 컨테이너를 보여 주는 카드, 그리고 컨테이너별 메모리 차트
  • Docker Desktop은 가상 머신까지 합산해 앱 목록에서 한 행으로 표시되며, 클릭하면 안에 있는 컨테이너를 볼 수 있음
  • 메뉴 막대 드롭다운에도 컨테이너가 표시되며, 클릭 한 번으로 확인 후 컨테이너를 중단. Docker 컨테이너 중단하는 방법 참고
  • Docker Desktop, OrbStack, Colima, Rancher Desktop, Podman

알아 두면 좋은 점

  • Vitals는 엔진에서 컨테이너 수치를 읽을 뿐, 컨테이너를 시작하거나 제거하지 않습니다. Vitals가 하는 유일한 변경은 중단이며, 그것도 요청할 때만 합니다.
  • 이 탭은 엔진이 실행 중일 때 나타납니다.
Vitals 구입 $9 출시 할인 기간 $9, 이후 $29. 14일 이내 환불.

자주 묻는 질문

Mac에서 Docker가 메모리를 그렇게 많이 쓰는 이유는?

Docker는 Linux 가상 머신에서 컨테이너를 실행하는데, 이 가상 머신은 Memory limit(기본값은 Mac 메모리의 절반)까지 메모리를 가져갑니다. Settings → Resources → Advanced에서 Memory limit을 낮추고, docker stats 명령을 실행해 어떤 컨테이너가 가장 많이 쓰는지 확인하세요.

Virtual Machine Service for Docker는 무엇인가요?

Docker Desktop이 Apple의 Virtualization 프레임워크를 쓸 때 컨테이너를 실행하는 가상 머신입니다. 이 프로세스의 메모리는 그 안의 컨테이너와 Linux가 쓰는 모든 것이며, Docker Desktop의 Memory limit까지 커집니다.

Mac에서 Docker의 메모리를 제한하려면 어떻게 하나요?

Docker Desktop에서 Settings → Resources → Advanced를 열고 Memory limit을 낮추세요. 컨테이너 하나에만 적용하려면 docker run --memory 512m 명령을 쓰거나, Compose 파일에서 mem_limit: 512m 설정을 쓰세요.

컨테이너를 중단해도 Docker가 메모리를 돌려주지 않는 이유는?

가상 머신은 컨테이너가 멈춘 뒤에도 사용했던 메모리 일부를 붙잡고 있습니다. Docker Desktop이 유휴 상태일 때 가상 머신을 끄는 Resource Saver를 켜거나, Docker Desktop을 종료하세요.

Virtual Machine Service for Docker가 CPU를 많이 쓰는 이유는?

대개 컨테이너가 바쁘기 때문이며, docker stats로 어느 것인지 볼 수 있습니다. 실행 중인 컨테이너가 없는데도 CPU가 계속 높다면 Docker Desktop을 종료했다가 다시 열고 업데이트하세요. 아무것도 실행하지 않는데 CPU가 높은 현상은 일부 Docker Desktop 버전의 버그로 보고된 바 있습니다.

Mac에서 Docker에 메모리를 얼마나 할당해야 하나요?

컨테이너가 가장 바쁠 때 쓰는 양보다 조금 더 주면 되며, 그 양은 docker stats로 볼 수 있습니다. 일반적인 개발 스택이라면 2~4 GB인 경우가 많아서, 기본값인 Mac 메모리의 절반보다 훨씬 적습니다.

Mac에서 Docker 컨테이너의 메모리를 보여 주는 앱이 있나요?

Vitals의 컨테이너 탭은 Docker Desktop, OrbStack, Colima, Rancher Desktop, Podman의 컨테이너별 메모리, CPU, 네트워크, 디스크, 포트를 보여 줍니다. 메뉴 막대에서 확인 후 컨테이너를 중단할 수도 있습니다.

용어집에서 보기

다른 가이드