영상을 불러오지 못했습니다

Docker Desktop WSL2 VHDX 용량 부족 복구

687 단어
3 분
Docker Desktop WSL2 VHDX 용량 부족 복구

Docker Desktop의 WSL2 backend에서 운영하던 서비스의 PostgreSQL과 Elasticsearch가 No space left on device로 중단됐다. host drive에는 여유 공간이 있었지만 Linux filesystem이 들어 있는 VHDX의 한계에 도달한 상태였다.

문제 현상#

container를 재시작해도 회복되지 않았고 database write와 index allocation은 계속 실패했다. Windows 탐색기의 여유 공간만 봐서는 원인을 놓치기 쉽다.

Docker Desktop 데이터 VHDX가 용량 한계에 도달한 화면
Docker Desktop 데이터 VHDX가 용량 한계에 도달한 화면

적용 범위#

Docker Desktop이 WSL2 distribution의 virtual disk에 container data를 저장하는 Windows 환경을 다룬다. 처음 문제를 발견한 곳은 JetBrains Space On-Premises였지만 다른 Docker workload도 원리는 같다.

원인#

Windows host volume의 남은 공간과 WSL2 ext4 filesystem의 크기는 별개다. 오래된 환경에서는 virtual disk의 최대 크기 또는 partition/filesystem 크기가 먼저 한계에 닿기도 한다. 이미지, volume, database WAL과 search index가 계속 늘면서 Linux 쪽 사용률이 100%가 됐다.

재현 및 진단#

PowerShell과 WSL에서 각기 다른 층을 확인한다.

Terminal window
wsl --list --verbose
wsl --system -d <distribution> df -h

Docker가 사용하는 distribution 이름과 data location은 Docker Desktop 버전에 따라 달라지기도 한다. VHDX 경로를 추측해 수정하지 말고 Docker Desktop 설정과 wsl --list로 먼저 식별한다.

해결 방법#

최근 WSL에서는 지원되는 resize 명령부터 사용한다.

Terminal window
wsl --shutdown
wsl --manage <distribution> --resize 1536GB

명령이 지원되지 않는 구버전은 WSL을 업데이트하는 편이 우선이다. 불가피하게 수동으로 처리할 때는 backup을 만든 뒤 VHDX를 확장하고 내부 partition과 ext4 filesystem까지 별도로 늘려야 한다.

Hyper-V 도구에서 VHDX 확장 단계를 연 화면
Hyper-V 도구에서 VHDX 확장 단계를 연 화면

Docker Desktop의 WSL integration 설정
Docker Desktop의 WSL integration 설정

WSL에서 Docker data block device를 확인한 화면
WSL에서 Docker data block device를 확인한 화면

디스크를 늘린 다음에는 사용하지 않는 image·build cache·volume을 찾아 보존 정책에 맞게 정리한다. database volume은 서비스 backup을 확보하기 전에 삭제하지 않는다.

검증 방법#

  • WSL의 df -h와 block device 크기가 모두 늘었는지 확인해 본다.
  • Docker Desktop과 대상 container를 시작해 database recovery log를 점검한다.
  • 쓰기·index 생성과 backup 복구 시험을 수행해 본다.
  • 며칠간 disk growth와 alert threshold를 모니터링한다.

주의점#

VHDX 확장은 host filesystem, virtual disk, partition과 ext4 filesystem을 함께 다루는 작업이다. 중간에 전원을 끄거나 잘못된 distribution의 disk를 수정하면 데이터가 손상될 위험이 있다. 확장만 반복하지 말고 log·artifact·volume retention도 함께 고친다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

Docker Desktop WSL2 VHDX 용량 부족 복구
https://hon454.github.io/posts/jetbrains-space-docker-wsl2-vhdx-disk-full/
작성자
Jihoon Jeon
게시일
2023-09-26
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
Hermes Agent로 중고 판매글 끌어올리고 판매 완료까지 마무리하기
개발 이야기중고 판매글을 올린 뒤에는 에이전트 없이 도는 크론으로 매일 한 번 끌어올리고, 번개장터에서 22만원에 판매가 끝난 뒤에는 같은 물건의 중고나라 글을 이중 판매 전에 정리하게 만든 과정이다. 플랫폼별 끌어올리기 규칙, 글마다 시각을 흩뜨리는 방식, 판매 후 장부 정리 순서를 PS4 Pro 판매 한 건으로 정리한다.
2
Firefly 업스트림 반영: 6.16.9
블로그Firefly 6.16.9와 이후 af8e98f까지의 모바일 메뉴 드로어, 날짜 타임존 처리, 음악 플레이어, MDX 이미지 그리드 변경과 의존성 업데이트.
3
Hermes Agent로 중고 판매글 작성부터 등록까지 자동화하기
개발 이야기사진과 한 줄 요청을 Slack 스레드에 올리면 Hermes Agent의 Merchant 프로필이 시세를 조사해 제목·가격·본문 초안을 쓰고, 승인한 뒤에만 중고나라와 번개장터 폼을 채워 등록하게 만든 과정이다. 승인 게이트, 본문 사실의 출처 구분, 플랫폼별 스킬 분리를 PS4 Pro 판매 한 건으로 정리한다.
4
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
5
게임잡 공고 알림에 즐겨찾기 추가하기
개발 이야기매일 Slack으로 받는 게임잡 공고 목록에 즐겨찾기를 붙인 과정이다. 저장 위치와 표시 규칙, 대충 말한 공고를 에이전트가 찾아 등록하는 역할 분담, 신규 표시를 건드리지 않는 재전송 크론을 정리하고, 같은 날 점검에서 찾은 필터 오탐 수정을 적는다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
73
카테고리
10
태그
143
총 단어 수
133,527
운영 일수
0일
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.9
라이선스
CC BY-NC-SA 4.0
목차