storage / knowledge

Docker의 data-root를 다른 디스크로 옮기기

paul 2025.11.14 169words (1m)

Docker는 기본적으로 /var/lib/docker 에 이미지와 볼륨을 쌓는다. OS 디스크에 그대로 두면 이미지 몇 개 받는 것만으로 루트가 차오른다. 별도 디스크를 /srv/docker 에 마운트하고 그쪽으로 옮겼다.

디렉토리는 나눠뒀다. engine 은 Docker가 쓰고, services 는 각 컨테이너의 compose와 설정을 둔다.

지금 어디를 쓰고 있나

console
$ docker info | grep "Docker Root Dir"

옮기기

docker와 docker.socket을 둘 다 내려야 한다.

console
$ systemctl stop docker
$ systemctl stop docker.socket

docker 만 멈추면 socket이 살아 있어서 누가 docker 명령을 치는 순간 다시 올라온다. 복사 중에 데몬이 살아나면 파일이 어긋난다.

console
$ rsync -aP /var/lib/docker/ /srv/docker/engine

-a 를 그대로 쓴다. 여기서는 소유자와 권한을 정확히 보존해야 한다. 이미지 레이어의 소유권이 틀어지면 컨테이너가 안 뜬다.

/etc/docker/daemon.json 에 새 위치를 적는다.

json
{
  "data-root": "/srv/docker/engine"
}

containerd도 따로 옮긴다

여기서 한 번 걸렸다. Docker의 data-root 를 바꿔도 containerd는 여전히 /var/lib/containerd 를 쓴다. 별개의 데몬이라 설정도 따로 있다.

console
$ systemctl stop containerd
$ rsync -aP /var/lib/containerd/ /srv/docker/containerd

/etc/containerd/config.tomlroot 를 바꾼다.

toml
root = "/srv/docker/containerd"

다시 켜기

console
$ systemctl start docker
$ systemctl start containerd

docker info | grep "Docker Root Dir" 로 바뀐 것을 확인한다.

옮기고 나서 컨테이너가 정상인 걸 확인하기 전까지 /var/lib/docker 는 지우지 않는다. 되돌릴 게 필요하다.