티스토리 뷰

개발/docker

docker 데이터 디렉터리 변경

Jaeyeon Baek 2019. 5. 27. 12:02

(*) 우분투 16.0.4 환경에서의 글입니다. 버전이나 OS의 종류에 따라 내용이 적용되지 않을 수도 있습니다.

docker를 처음 설치하고 보면 이미지나 컨터이너등 모든 정보가 쌓이는 공간이 /var/lib/docker 로 동작하는 것을 알 수 있습니다. 보통의 사용자 환경을 보면 root 디렉터리는 빠르고 비싼 SSD를 사용하기 때문에 용량이 충분하지 않은데 별 생각없이 이미지와 컨테이너를 생성하다보면 어느샌가 용량부족으로 어려움을 겪게 될 것으로 생각됩니다. 그렇기 때문에 처음 docker를 설치해줬을때부터 이런 데이터가 적재되는 곳을 충분히 여유있는 HDD로 잡아주는게 좋은데요. 이번글에서는 그 방법에 대해서 소개합니다.

우선 데이터 경로가 어디로 잡혀있는지 아래 명령어를 통해 확인해줍니다.

$ docker info | grep Root
Docker Root Dir:  /var/lib/docker

위와 같이 /var/lib/docker로 설정되어 있는것이 확인됩니다. 이제부터 저 경로를 변경해볼텐데, 그러기에 앞서 docker 데몬이 돌고 있는 것을 확인해줍니다.

$ ps aux | grep dockerd
root     22030  3.5  0.4 1281684 71876 ?       Ssl  11:37   0:44 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

우리가 하고자하는 것은 간단합니다. dockerd 데몬이 실행될 때 데이터 디렉터리를 지정해주는 것이죠. dockerd 에 --help로 어떤 옵션을 사용해서 그것이 가능한지 살펴봅시다.

$ dockerd --help
...
  --data-root string                        Root directory of persistent Docker state (default "/var/lib/docker")
...

어렵지 않게 --data-root 라는 옵션으로 데이터 경로를 변경해줄 수 있다는 사실이 확인되었으며, 기본경로는 /var/lib/docker라는 사실도 알게 되었습니다. 이제 service 명령을 통해 dockerd가 실행될 때의 옵션을 변경해주면 되는데 docker.servce의 경로를 아래와 같이 확인해줍니다.

$ sudo service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since 월 2019-05-27 11:37:20 KST; 13min ago
     Docs: https://docs.docker.com
 Main PID: 22030 (dockerd)
    Tasks: 28
   Memory: 71.2M
      CPU: 48.170s
   CGroup: /system.slice/docker.service
           └─22030 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 5월 27 11:37:18 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:18.462700174+09:00" level=warning msg="Your kernel does not su
 5월 27 11:37:18 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:18.463995174+09:00" level=info msg="Loading containers: start.
 5월 27 11:37:19 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:19.355434840+09:00" level=info msg="Default bridge (docker0) i
 5월 27 11:37:19 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:19.810312063+09:00" level=info msg="Loading containers: done."
 5월 27 11:37:20 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:20.169455577+09:00" level=info msg="Docker daemon" commit=481b
 5월 27 11:37:20 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:20.169710403+09:00" level=info msg="Daemon has completed initi
 5월 27 11:37:20 caley-ubuntu dockerd[22030]: time="2019-05-27T11:37:20.756993426+09:00" level=info msg="API listen on /var/run/doc
 5월 27 11:37:20 caley-ubuntu systemd[1]: Started Docker Application Container Engine.
 5월 27 11:38:42 caley-ubuntu dockerd[22030]: time="2019-05-27T11:38:42.241954906+09:00" level=info msg="No non-localhost DNS names
 5월 27 11:38:42 caley-ubuntu dockerd[22030]: time="2019-05-27T11:38:42.242026462+09:00" level=info msg="IPv6 enabled; Adding defau

위의 내용에서 살펴보면 /lib/systemd/system/docker.service 를 통해서 서비스가 실행되는 것을 알 수 있습니다. vim등의 편집툴을 이용해서 파일을 열고 아래 부분을 찾아봅시다.

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

이제 뒤쪽으로 --data-root 옵션을 추가해주도록 합니다. 아래 예제의 경우에는 데이터 경로를 /data/ 로 지정한 상태입니다.

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data/

편집이 끝났으면 dockerd 를 재시작해주도록 합니다.

sudo service docker stop
sudo service docker start

재시작되었으면 이제 데이터 경로가 변경된 것이 확인됩니다.

$ docker info | grep Root
Docker Root Dir: /data

 

혹시 위와 같이 진행했지만 원하는 결과를 얻지 못한 경우에는 댓글 남겨주세요. 도움 드릴 수 있는 부분이 있다면 함께 고민해보도록 합시다. :-) 

댓글
  • 프로필사진 개발초보 도움됬습니다. 감사합니다 2020.07.22 13:50
  • 프로필사진 BlogIcon Jaeyeon Baek 감사합니다 :) 2020.07.24 23:57 신고
  • 프로필사진 조우현 감사합니다~ㅎㅎ 2020.09.10 19:15
  • 프로필사진 BlogIcon Jaeyeon Baek 감사합니다. :-) 2020.09.10 23:35 신고
  • 프로필사진 김정현 ExecStart=/usr/bin/dockerd -H /fd:// --containerd=/run/containerd/containerd.sock 를 하게되면 -H: Command not found 가 뜨는데 왜그럴까요.. 2020.10.19 21:43
  • 프로필사진 BlogIcon Jaeyeon Baek 이상하네요, docker 버전에 차이가 있다고 해도 옵션이 다르지는 않을텐데요.

    /usr/bin/dockerd --help 명령어로 -H 옵션이 있는지부터 확인해보시면 좋을 듯 합니다.
    2020.10.24 17:00 신고
  • 프로필사진 질문자 안녕하세요 글 잘읽었습니다!
    궁금한게있는데요
    도커를 설치한 서버의 용량이 많이 부족하여 용량이 넉넉한 외부의 서버에서 마운트한 폴더로 디렉토리를 잡으려고하는데
    이론상으로 가능할까요?
    2020.10.28 13:41
  • 프로필사진 BlogIcon Jaeyeon Baek nfs를 말씀하시는거면 딱히 안될 이유는 없어보입니다 :) 2020.10.28 13:58 신고
  • 프로필사진 BlogIcon 질문자 감사합니다
    그런데 기존 데이터 디렉토리를 사용하다가 해당 글처럼 디렉토리를 다른곳으로 변경햇을경우에 모든것이 초기화되는건가요?
    예를들어 기존에 docker image ls나 docker container ls 햇을때 나왔던 것들이 디렉토리 변경후에는 안나오는지 궁금합니다
    2020.10.28 14:15
  • 프로필사진 BlogIcon Jaeyeon Baek 네 모두 안나오고 기존 디렉터리를 통째로 복사해서 쓰시면 됩니다 :-) 2020.10.28 17:35 신고
  • 프로필사진 BlogIcon 질문자 헛... 통째로 복사라함은
    cp /var/lib/docker /mount된폴더/ 처럼 그냥 복제해서 갖다넣으면 되는건가요?
    2020.10.28 17:43
  • 프로필사진 BlogIcon Jaeyeon Baek 네 디렉터리 복사 옵션, 권한 동일 등만 처리되면 역시 딱히 안될 이유는 없습니다 :) 2020.10.28 18:22 신고
  • 프로필사진 ronac /etc/docker/daemon.json 이나 /etc/default/docker 에서 data-root 설정을 해보라는 글에도 안 됐는데 아예 데몬에서 바로 설정하는 방법도 있었군요 큰 도움 받고 갑니다 감사합니다 2021.04.10 18:36
  • 프로필사진 BlogIcon Jaeyeon Baek 도움이 되셨다니 기쁘네요.
    감사합니다. :)
    2021.04.12 09:29 신고
댓글쓰기 폼