storage / knowledge
Docker의 data-root를 다른 디스크로 옮기기
Docker는 기본적으로 /var/lib/docker 에 이미지와 볼륨을 쌓는다. OS 디스크에 그대로 두면 이미지 몇 개 받는 것만으로 루트가 차오른다. 별도 디스크를 /srv/docker 에 마운트하고 그쪽으로 옮겼다.
디렉토리는 나눠뒀다. engine 은 Docker가 쓰고, services 는 각 컨테이너의 compose와 설정을 둔다.
지금 어디를 쓰고 있나
$ docker info | grep "Docker Root Dir"
옮기기
docker와 docker.socket을 둘 다 내려야 한다.
$ systemctl stop docker
$ systemctl stop docker.socket
docker 만 멈추면 socket이 살아 있어서 누가 docker 명령을 치는 순간 다시 올라온다. 복사 중에 데몬이 살아나면 파일이 어긋난다.
$ rsync -aP /var/lib/docker/ /srv/docker/engine
-a 를 그대로 쓴다. 여기서는 소유자와 권한을 정확히 보존해야 한다. 이미지 레이어의 소유권이 틀어지면 컨테이너가 안 뜬다.
/etc/docker/daemon.json 에 새 위치를 적는다.
{
"data-root": "/srv/docker/engine"
}
containerd도 따로 옮긴다
여기서 한 번 걸렸다. Docker의 data-root 를 바꿔도 containerd는 여전히 /var/lib/containerd 를 쓴다. 별개의 데몬이라 설정도 따로 있다.
$ systemctl stop containerd
$ rsync -aP /var/lib/containerd/ /srv/docker/containerd
/etc/containerd/config.toml 의 root 를 바꾼다.
root = "/srv/docker/containerd"
다시 켜기
$ systemctl start docker
$ systemctl start containerd
docker info | grep "Docker Root Dir" 로 바뀐 것을 확인한다.
옮기고 나서 컨테이너가 정상인 걸 확인하기 전까지 /var/lib/docker 는 지우지 않는다. 되돌릴 게 필요하다.