AWS 인스턴스 스토어(ephemeral0)로 EBS 용량 한계 극복하기
지난 글에서 "이 모델이 진짜 8GB 디스크 환경에서 돌아갈 수 있을까"에 대한 실험을 진했했습니다.
결론은 Stable Diffusion API 컨테이너를 돌리려면 최소 20~30GB 이상 여유가 필요하다는 점이었습니다.
문제는 EBS를 크게 잡으면 비용이 올라간다는 것이죠.
그런데 AWS에서 이미 무료로 제공하는 디스크 공간이 있다는 사실, 알고 계셨나요?
바로 인스턴스 스토어(Instance Store), 여기서는 ephemeral0라는 이름으로 나타납니다.
이 디스크 공간을 사용해서 8GB 환경에서 Stable Diffusion 모델을 결국 돌릴 수 있었습니다!
인스턴스 스토어란?
- EC2 호스트 물리 서버에 직접 연결된 로컬 NVMe/SSD 디스크
- EBS보다 I/O 속도가 빠르지만, 인스턴스 Stop/Terminate 시 데이터가 모두 삭제
- 주 용도: 캐시, 임시 파일, 대규모 빌드/데이터 처리의 작업공간
- 일부 인스턴스 타입(GPU 포함)에서 기본 제공, 우리 환경에선 125GB 크기로 할당
즉, “영구 보관할 필요 없는 데이터”를 담기에 최적입니다.
Docker 이미지/캐시가 딱 이런 케이스죠.
그리고 직전 게시글에서 EBS 볼륨을 늘려야했던 이유가 Docker 이미지/캐시 때문이었는데, 인스턴스 스토어를 사용하면 그럴필요가 없었던 겁니다...😓
이번 작업
그래서 비용이 발생하는 루트 EBS 용량 부족 문제를 해결하기 위해,
Docker의 data-root를 EBS에서 ephemeral0로 이전했습니다.
EBS(루트): OS, 영구 데이터만.
인스턴스 스토어(ephemeral0): /mnt/ephemeral0/docker에 Docker data-root 전체.
작업 요약
- /dev/nvme0n1(ephemeral0) → ext4 포맷 및 /mnt/ephemeral0 마운트
- /etc/fstab에 등록해 재부팅 시 자동 마운트
- docker.service 중지 및 docker.socket 비활성화 (작업 중 자동 재시작 방지)
- /var/lib/docker → /mnt/ephemeral0/docker로 데이터 이관
- Docker 설정(daemon.json)에서 data-root 경로 변경
- Docker 재시작 후 이미지 pull 및 컨테이너 실행 테스트
0) 사전 확인 (디스크 매핑)
lsblk
# 예시: nvme0n1=ephemeral0(약 116~125G), nvme1n1=EBS(루트, 20~40G)
sudo file -s /dev/nvme0n1 # 'data'면 FS 없음, ext4/xfs 나오면 기존 FS 존재
sudo mkdir -p /mnt/tmpdisk && sudo mount /dev/nvme0n1 /mnt/tmpdisk || true
ls -al /mnt/tmpdisk || true
sudo umount /mnt/tmpdisk || true
1) ephemeral0 포맷 & 마운트(영구화)
⚠️ 포맷하면 해당 디스크의 기존 데이터는 모두 삭제됩니다.
# ext4 포맷
sudo mkfs.ext4 -F /dev/nvme0n1
# 마운트 지점 생성 및 마운트
sudo mkdir -p /mnt/ephemeral0
sudo mount /dev/nvme0n1 /mnt/ephemeral0
# (권장) UUID로 fstab 등록해 재부팅 시 자동 마운트
UUID=$(sudo blkid -s UUID -o value /dev/nvme0n1)
echo "UUID=$UUID /mnt/ephemeral0 ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab
# 확인
df -h | grep ephemeral0
2) Docker 서비스 일시 중지 (소켓 활성화도 잠깐 끄기)
sudo systemctl stop docker
sudo systemctl disable docker.socket # docker 명령으로 자동 기동되는 것 방지
systemctl is-active docker || true
systemctl is-enabled docker.socket || true
3) Docker 데이터 이관 (/var/lib/docker → /mnt/ephemeral0/docker)
# 대상 디렉터리 준비
sudo mkdir -p /mnt/ephemeral0/docker
# rsync로 권한/하드링크 유지하며 복사 (진행률 포함)
sudo rsync -aH --numeric-ids --info=progress2 --delete /var/lib/docker/ /mnt/ephemeral0/docker/
팁: 데이터가 크면 시간이 꽤 걸릴 수 있습니다. --info=progress2로 감 잡기.
4) Docker data-root 변경
기존 /etc/docker/daemon.json에 키가 더 있다면 병합해서 반영하세요. (백업 권장)
# 백업
sudo cp -a /etc/docker/daemon.json /etc/docker/daemon.json.bak 2>/dev/null || true
# 최소 설정: data-root만 지정 (다른 설정이 있었다면 병합 필요)
echo '{ "data-root": "/mnt/ephemeral0/docker" }' | sudo tee /etc/docker/daemon.json
# 적용
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker.socket # 필요시 재활성화
검증:
docker info | grep "Docker Root Dir"
# => Docker Root Dir: /mnt/ephemeral0/docker
5) 동작 검증 (GPU 컨테이너 & 서비스 컨테이너)
GPU 인식 확인:
docker run --rm --gpus all nvidia/cuda:12.3.2-base-ubuntu22.04 nvidia-smi
서비스 컨테이너 실행(백그라운드):
docker run -d --gpus all \
-v /mnt/efs/saved_sd15:/mnt/efs/saved_sd15 \
-e CUDA_VISIBLE_DEVICES=0 \
-p 8000:8000 \
eunsunhub/stable-diffusion-api:efs
docker ps
docker system df -v
6) 운영 팁 / 트러블슈팅
- 데이터 소멸 주의: 인스턴스 Stop/Terminate 시 /mnt/ephemeral0 내용은 사라집니다.
→ 재시작 전략: 컨테이너 이미지만 재pull하거나(속도 빠름), 필요한 경우 스크립트로 자동 세팅. - fstab는 UUID로: 디바이스 이름보다 안전.
- 용량 모니터링: df -h /mnt/ephemeral0, docker system df -v 명령어 사용
- 캐시 정리:
docker system prune -a --volumes -f
- 롤백(원복):
sudo systemctl stop docker
sudo systemctl disable docker.socket
sudo rsync -aH --delete /mnt/ephemeral0/docker/ /var/lib/docker/
echo '{ "data-root": "/var/lib/docker" }' | sudo tee /etc/docker/daemon.json
sudo systemctl start docker
sudo systemctl enable docker.socket
docker info | grep "Docker Root Dir"
결과 분석 — ephemeral0로 Docker 데이터 이전 후
| 구분 | 내용 |
| 도커 이미지 용량 | eunsunhub/stable-diffusion-api:efs → 12.5 GB Stable Diffusion 실행 환경(베이스 이미지 + Python + 실행 스크립트) 포함 |
| ephemeral0 사용량 | 약 12 GB → 이미지 1개(12.5 GB) + 미미한 컨테이너 메타데이터 → 모델 데이터(/mnt/efs/saved_sd15)는 EFS로 분리 저장 |
| 루트 EBS 사용률 | 14% (39 GB 중 5.3 GB 사용) → OS·필수 설정만 차지, 도커 데이터는 전부 ephemeral0로 이동 |
| 성능 효과 | NVMe 로컬 스토리지로 이미지 pull·압축 해제·컨테이너 기동 속도 향상 |
| 운영 안정성 | EBS 용량 부족으로 인한 컨테이너 실행 실패 위험 제거 |
디스크 사용 현황 조회 명령어
df -h

도커 이미지 상세 용량
docker system df -v
왜 사용량이 12GB일까?
- ephemeral0는 /var/lib/docker 전체를 저장하는 전용 스토리지로 설정됨.
- 테스트 환경에서는 Stable Diffusion API 이미지 1개만 pull.
- 실행 시 생성되는 Read-Write Layer와 로그는 매우 작음.
- 모델 데이터는 EFS 마운트를 사용해 ephemeral0 용량을 소모하지 않음.
💡 꿀팁
EBS에는 OS와 필수 설정만, Docker 데이터는 ephemeral0로 분리
→ 루트 디스크 여유 공간이 안정적으로 유지되고, 이미지 pull 속도도 빨라짐.
이제 다음번 포스팅에서는 Stop/Start 이후 ephemeral0 초기화 자동 설정 스크립트 및 데이터가 정말 삭제되는지 확인 그리고 data-root가 저장하는 데이터의 종류까지 확실히 정리하려고 합니다!
그 이후에는 실제로 운영하고 있는 서버를 대상으로 도커 패키징을 해야하기 때문에 다음 작업이 마지막 포스팅일 수도 있겠네요😳