Docker 이미지·볼륨·네트워크 관리 — 디스크 절약과 정리 자동화

Docker 이미지·볼륨·네트워크 관리 — 디스크 절약과 정리 자동화

"No space left on device" — Docker 운영자라면 한 번쯤 만나는 공포의 에러 메시지.

서버가 갑자기 뻗어서 들어가 보니 디스크 사용량이 100%다. 범인을 찾아보면 열에 아홉은 도커(Docker)다. 오래된 이미지, 중지된 컨테이너, 그리고 연결이 끊긴 볼륨들이 기가바이트(GB) 단위의 디스크를 소리 없이 갉아먹고 있기 때문이다.

이번 편에서는 도커 환경에서 디스크 용량을 확보하고, 데이터를 안전하게 관리하며, 네트워크를 구성하는 방법을 알아본다. 이것만 알아도 새벽에 디스크 꽉 찼다고 알람 울릴 일은 확 줄어들 것이다.

docker system df — 지금 디스크를 얼마나 먹고 있나?

무작정 지우기 전에 상황 파악부터 하자. 리눅스의 df 명령어처럼, 도커가 쓰고 있는 디스크 용량을 카테고리별로 보여준다.

docker system df

결과를 보면 이미지, 컨테이너, 로컬 볼륨, 빌드 캐시가 각각 얼마를 차지하고 있는지, 그중에서 안 쓰고 있는(Reclaimable) 용량이 얼마인지 한눈에 보인다. 더 자세히, 어떤 녀석이 구체적으로 많이 먹고 있는지 보려면 -v (verbose) 옵션을 붙인다.

docker system df -v

docker system prune — 한 방 정리

상황 파악이 끝났다면 대청소를 할 시간이다. prune은 도커 관리에서 가장 속 시원한 명령어다.

기본 정리 (안전함)

docker system prune

이 명령어는 다음 항목들을 일괄 삭제한다.

  • 중지된 모든 컨테이너
  • 하나 이상의 컨테이너에서 사용되지 않는 모든 네트워크
  • 댕글링(Dangling) 이미지 (이름도 태그도 없는 <none>:<none> 상태의 이미지)
  • 사용하지 않는 빌드 캐시

볼륨(데이터)은 지우지 않기 때문에 비교적 안전하게 칠 수 있다.

⚠️ 전체 정리 (운영 서버에서 주의)

docker system prune -a --volumes
  • -a (all): 댕글링 이미지뿐만 아니라, 현재 실행 중인 컨테이너가 쓰고 있지 않은 모든 이미지를 지운다. 롤백용으로 남겨둔 이전 버전 이미지도 다 날아간다.
  • --volumes: 연결되지 않은 모든 볼륨을 날려버린다. 중요 데이터가 들어있는 볼륨이 컨테이너와 잠시 연결이 끊어진 상태였다면 대참사가 일어날 수 있다.

💡 실무 팁: 운영 서버에서 -a --volumes 옵션은 정말 디스크가 99% 꽉 차서 아무것도 안 될 때 최후의 보루로만 사용하자.

이미지 관리 명령어

새로운 버전을 배포할 때마다 이미지가 쌓인다. 이미지 하나가 1GB를 넘기도 하니 관리가 필수다.

docker images / rmi

# 전체 이미지 목록 보기
docker images

# 특정 이미지 삭제하기
docker rmi my-app:v1.0

컨테이너가 사용 중인 이미지는 지워지지 않는다. 지우려면 컨테이너를 먼저 지우거나 -f (강제) 옵션을 줘야 한다. 하지만 강제 삭제는 이미지 태그만 날리고 실제 용량은 반환하지 않는 경우가 있으므로 권장하지 않는다.

docker image prune

system prune은 전체를 건드리지만, 이미지만 딱 꼬집어서 정리하고 싶을 때 쓴다.

# 댕글링 이미지만 삭제
docker image prune

# 안 쓰는 이미지 전부 삭제 (롤백용 이미지도 날아감)
docker image prune -a

볼륨 관리 명령어

데이터베이스(DB)나 유저가 업로드한 파일처럼, 컨테이너가 지워져도 살아남아야 하는 데이터는 볼륨(Volume)에 저장한다. 볼륨 관리는 곧 데이터 백업과 직결된다.

볼륨 생성과 정리

# 볼륨 목록 확인
docker volume ls

# 이름 없는 쓰레기 볼륨들(dangling) 싹 비우기
docker volume prune

볼륨 백업·복원 실전 패턴 (1-liner)

운영 중인 DB 볼륨(my-db-data)을 backup.tar 파일로 백업하고 싶을 때 쓰는 마법의 한 줄 명령어다.

# 백업하기
docker run --rm \
  -v my-db-data:/data \
  -v $(pwd):/backup \
  ubuntu \
  tar cvf /backup/backup.tar /data

# 복원하기 (새 볼륨 new-db-data에)
docker run --rm \
  -v new-db-data:/data \
  -v $(pwd):/backup \
  ubuntu \
  tar xvf /backup/backup.tar -C /

원리는 간단하다. 일회용(--rm) Ubuntu 컨테이너를 띄워서, 기존 볼륨과 현재 폴더를 둘 다 마운트한 다음, 컨테이너 안에서 tar로 압축해 밖으로 던져주는 것이다.

네트워크 관리 명령어

여러 개의 컨테이너(예: Web 서버와 DB 서버)가 서로 통신하려면 도커 네트워크로 묶어줘야 한다.

# 네트워크 생성
docker network create my-network

# 컨테이너 띄울 때 네트워크 연결하기
docker run -d --name my-db --network my-network redis
docker run -d --name my-web --network my-network my-app

이렇게 같은 my-network에 묶인 컨테이너들은, 복잡한 IP 주소를 외울 필요 없이 서로의 컨테이너 이름(my-db)을 호스트네임으로 사용해서 통신할 수 있다. (Docker 내부의 내장 DNS가 알아서 찾아준다.)

네트워크 충돌 해결 (prune)

"네트워크 이름이 이미 존재합니다" 류의 에러가 나면 찌꺼기를 정리해주면 된다.

docker network prune

🤖 정리 자동화 — Cron + prune 조합

서버에 들어갈 때마다 수동으로 prune을 치는 건 귀찮다. 보통 리눅스의 cron을 이용해 새벽에 자동으로 청소하도록 세팅해둔다.

# crontab 편집기 열기
crontab -e
# 매일 새벽 3시에 댕글링 이미지와 중지된 컨테이너만 안전하게 정리
0 3 * * * /usr/bin/docker system prune -f > /dev/null 2>&1

# 매주 일요일 새벽 4시에는 안 쓰는 이미지까지 전부 정리 (볼륨은 건드리지 않음)
0 4 * * 0 /usr/bin/docker system prune -a -f > /dev/null 2>&1

-f 옵션은 "정말 지우시겠습니까? (y/N)" 묻는 프롬프트를 무시하고 바로 지우게 만든다. 스크립트나 크론탭에 넣을 때는 필수다.

📝 정리

운영 서버의 수명을 연장하고 데이터를 지키는 핵심 명령어들을 살펴보았다.

  • [x] docker system df: 지우기 전에 지금 디스크 상태 진단하기
  • [x] docker system prune: 중지된 찌꺼기들 한 방에 안전하게 날리기
  • [x] 볼륨 백업: 일회용 컨테이너(--rm) + tar 조합으로 데이터 압축해서 빼오기
  • [x] 네트워크 구성: docker network create로 컨테이너 이름끼리 통신하게 만들기
  • [x] 자동 청소: cronsystem prune -f 등록해서 디스크 100% 방지하기

1편(컨테이너 생명주기), 2편(트러블슈팅), 그리고 이번 3편까지, 이 3개의 포스팅에 등장한 명령어들만 손에 익어도 Docker 실무 운영의 90%는 무리 없이 커버할 수 있을 것이다. 이론을 읽었다면 이제 터미널을 열고 직접 손을 움직여보자!