Docker 용량 부족? Data Root 폴더 변경으로 안전하게 공간 확보하기

안녕하세요. 미뇽입니다.

Docker를 열심히 사용하다 보니 어느 날 갑자기 서버의 루트(/) 파티션 용량이 꽉 찼다는 경고 메시지를 받으신 적 없으신가요? Docker는 이미지를 내려받고, 컨테이너를 생성하며, 볼륨을 사용하는 과정에서 상당한 양의 데이터를 저장하게 됩니다. 이 모든 데이터는 기본적으로 /var/lib/docker라는 단일 디렉토리에 쌓이게 되는데, 이로 인해 기본 디스크 파티션의 용량이 부족해지는 문제는 많은 개발자와 운영자들이 겪는 흔한 골칫거리입니다.

오늘은 바로 이 문제를 해결하기 위한 ‘Docker Data Root 폴더 변경 방법’에 대해 알아보겠습니다. Docker의 핵심 데이터 저장 위치를 용량이 넉넉한 다른 디스크나 파티션으로 안전하게 이전하여 서버 용량을 효율적으로 관리하는 방법을 단계별로 상세히 안내해 드리겠습니다.

Docker Data Root란 무엇이며, 왜 변경해야 할까요?

Docker의 Data Root 폴더는 Docker의 심장과도 같은 곳입니다. 기본적으로 리눅스 시스템에서는 /var/lib/docker 경로에 위치하며, 이곳에는 다음과 같은 Docker의 모든 핵심 데이터가 저장됩니다.

  • 이미지(Images): docker pull 명령으로 내려받은 모든 이미지 레이어
  • 컨테이너(Containers): 생성된 모든 컨테이너의 파일 시스템과 설정
  • 볼륨(Volumes): 컨테이너의 데이터를 영구적으로 저장하기 위해 생성한 볼륨
  • 네트워크 설정 등 기타 데이터

이처럼 중요한 데이터가 한곳에 모여있기 때문에, 다음과 같은 상황에서 Data Root 폴더를 변경할 필요가 생깁니다.

  1. 기본 파티션 용량 부족: 가장 흔한 경우로, 루트(/) 파티션의 용량이 가득 차서 더 이상 새로운 이미지를 받거나 컨테이너를 생성할 수 없을 때.
  2. 성능 향상: 더 빠른 디스크(예: NVMe, SSD)에 Docker 데이터를 위치시켜 이미지 로딩이나 컨테이너 I/O 성능을 높이고 싶을 때.
  3. 체계적인 관리: 운영체제(OS) 파티션과 Docker 데이터 파티션을 물리적으로 분리하여 관리의 효율성을 높이고, 백업 및 복구를 용이하게 하고 싶을 때.

변경 전, 반드시 확인해야 할 주의사항

Data Root 폴더 변경은 Docker의 핵심 데이터를 직접 다루는 중요한 작업입니다. 데이터 손실이나 서비스 장애를 막기 위해 작업 전에 아래 사항들을 반드시 숙지하고 진행해야 합니다.

  • Docker 서비스 및 컨테이너 중지: 데이터 이동 중 파일이 변경되거나 손상되는 것을 막기 위해, 현재 실행 중인 모든 컨테이너와 Docker 관련 서비스를 완전히 중지해야 합니다.
  • 데이터 백업: rsync 명령어를 통해 데이터를 복사하겠지만, 만일의 사태에 대비해 중요한 데이터는 별도로 백업해두는 것이 가장 안전합니다.

Docker Data Root 폴더 변경 단계별 가이드

이제 본격적으로 Data Root 폴더를 변경하는 과정을 단계별로 살펴보겠습니다.

Docker 관련 서비스 모두 중지하기

데이터 이동의 안전성을 확보하기 위해 Docker와 관련된 모든 서비스를 중지합니다. 터미널에서 아래 명령어를 순서대로 실행합니다.

sudo systemctl stop docker.socket
sudo systemctl stop docker
sudo systemctl stop containerd

docker.socketcontainerd까지 모두 중지하여 Docker가 사용 중인 파일에 대한 모든 접근을 완전히 차단하는 것이 중요합니다.

기존 데이터 새로운 경로로 복사하기

이제 기존 Data Root 폴더(/var/lib/docker)의 모든 데이터를 새로운 위치로 복사합니다. 여기서는 /new/docker/data/root라는 경로로 데이터를 옮기는 것을 예로 들겠습니다. 이 경로는 실제 환경에 맞게 원하는 경로로 지정하시면 됩니다.

rsync 명령어는 파일 권한과 속성을 그대로 유지하면서 데이터를 안정적으로 복사할 수 있어 매우 유용합니다.

# 새로운 경로에 디렉토리가 없다면 먼저 생성합니다.
sudo mkdir -p /new/docker/data/root

# rsync 명령어로 데이터를 복사합니다.
sudo rsync -avzh /var/lib/docker/ /new/docker/data/root
  • rsync 명령어에서 원본 경로(/var/lib/docker/) 끝에 붙는 슬래시(/)는 매우 중요합니다. 슬래시를 붙이면 해당 디렉토리의 ‘내용물’을 복사하고, 붙이지 않으면 디렉토리 ‘자체’를 복사하게 됩니다. 여기서는 내용물을 복사해야 하므로 반드시 슬래시를 포함해 주세요.
  • -avzh 옵션은 각각 archive 모드(권한, 소유권 등 모든 속성 유지), verbose(진행 과정 표시), compress(전송 중 압축), human-readable(읽기 쉬운 형식으로 크기 표시)을 의미합니다.

Docker 설정 파일(daemon.json) 수정

데이터 복사가 완료되었다면, 이제 Docker 데몬에게 새로운 Data Root 경로를 알려주어야 합니다. /etc/docker/daemon.json 파일을 수정하여 이 설정을 변경합니다.

sudo nano /etc/docker/daemon.json

만약 파일이 존재하지 않는다면 새로 생성됩니다. 파일에 아래와 같이 data-root 항목을 추가하고, 2단계에서 지정했던 새로운 경로를 입력합니다.

{
  "data-root": "/new/docker/data/root"
}

만약 daemon.json 파일에 이미 다른 설정이 있다면, 쉼표(,)를 사용하여 data-root 키-값 쌍을 기존 내용에 맞게 추가해 주시면 됩니다.

Docker 서비스 재시작하기

새로운 설정을 적용하기 위해 Docker 서비스를 다시 시작합니다.

sudo systemctl start docker

변경 사항 확인 및 최종 테스트

마지막으로 모든 것이 올바르게 변경되었는지 확인하는 과정입니다.

Data Root 경로 확인:docker info 명령어를 사용하여 Docker의 설정 정보를 확인합니다. grep을 이용해 Data Root 경로만 필터링해서 볼 수 있습니다.

docker info | grep "Docker Root Dir" 

결과로 아래와 같이 daemon.json에 설정한 새로운 경로가 출력되면 성공입니다.

Docker Root Dir: /new/docker/data/root

기존 컨테이너 및 이미지 확인:

docker ps -a 와 docker images 명령어로 기존에 사용하던 컨테이너와 이미지들이 정상적으로 보이는지 확인합니다.

기능 테스트:

간단한 컨테이너를 실행하여 Docker가 새로운 경로에서 정상적으로 작동하는지 최종 테스트를 진행합니다.

docker run hello-world

기존 데이터 삭제로 용량 확보:위 모든 확인 과정이 성공적으로 끝났다면, 이제 기존 경로에 남아있는 데이터(/var/lib/docker)는 불필요합니다. 이 디렉토리를 삭제하여 최종적으로 서버 용량을 확보할 수 있습니다.단, 삭제 전 다시 한번 모든 것이 정상 작동하는지 꼭 확인하시고, 만약을 위해 바로 삭제하기보다는 백업 이름으로 변경해두었다가 며칠 후 삭제하는 것을 권장합니다.

# 백업 이름으로 변경 
sudo mv /var/lib/docker /var/lib/docker.bak 

# 며칠 후 문제가 없다고 판단되면 최종 삭제 
sudo rm -rf /var/lib/docker.bak

    마치며

    오늘은 서버 용량 부족 문제를 해결하기 위해 Docker의 Data Root 폴더를 변경하는 방법에 대해 알아보았습니다. 처음에는 다소 복잡하게 느껴질 수 있지만, 각 단계를 차근차근 따라 하면 누구나 안전하게 데이터 저장 위치를 이전할 수 있습니다.

    이 과정을 통해 Docker의 저장 공간을 유연하게 관리하고, 예기치 않은 용량 문제로부터 자유로워져 더욱 안정적인 개발 및 운영 환경을 구축하시길 바랍니다.

    읽어주셔서 감사합니다. 🙂

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    댓글 달기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

    위로 스크롤