본문 바로가기
인공지능/MLOps

[docker] Docker Root Dir 변경

by judy@ 2022. 12. 18.

Docker Root Dir 변경하기

아래 쪽 해결 방안을 통해 변경 완료

 

문제 상황

회사에서 사용하는 ubuntu 기반의 onPrem 서버에 docker를 설치하여 사용하고 있는데, 방금 올린 도커 이미지가 1-2분 뒤에 자꾸만 삭제되었음. 확인해보니 docker의 root dir은 default로 /var/lib/docker에 설정되어 있는데, 이 공간에 여유가 없어서 발생한 문제였음

 

찾아본 바..

대부분의 블로그 글(무턱대로 신뢰하면 안됨, 과거의 나 조차도..)에서는 두 가지 방법을 통해서 이 디렉토리를 변경할 수 있다고 함.

1. /lib/systemd/system/docker.service 파일을 열어 -g 또는 --data-dir 옵션을 주고 새롭게 설정할 디렉토리명을 인자로 전달하라는 것.

2. /etc/docker/daemon.json 파일을 열어 'data-dir' 또는  'graph' 키 안에 새롭게 설정할 디렉토리명을 value로 넣어주라는 것.

 

둘 다 시도를 해보았는데, 오히려 설정이 꼬여 난생 처음보는 'Docker Root Dir: /var/snap/docker/common/var-lib-docker' 로 설정되는 상황에 부딪힘..

이렇게 뇌피셜로 변경하는 것이 아니라 이해하고 잘 설정해야겠다는 생각에 지금부터 문제를 다시 파고들어 보려고 함.

 

원리를 이해하고 변경에 성공한 방법


적용 환경

- OS: 18.04.2-Ubuntu x86_64
- docker version:
   - Client: 20.10.21
   - Server: 20.10.17

 

docker는 크게 클라이언트와 데몬이 있음. 아래와 같이 client는 command를 통해 수행할 작업을 docker daemon에 전달하고 daemon이 직접 Registry, container, images와 소통하여 임무를 수행함. 

docker architecture from the docs

도커 데몬은 컨테이너, 이미지, 볼륨, 서비스 정의, 시크릿 등을 하나의 디렉토리에서 관리하는데, 이를 Docker Root Dir이라 하며, ubuntu에서는 default로 /var/lib/docker로 설정되어 있음.

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

현재 어떤 디렉토리로 설정되어 있는지 다음의 명령어로 확인할 수 있음.

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

 

문제는 이 디렉토리에 더 이상 사용가능한 여유 공간이 없었던 것이며, 이를 변경해야 함. 변경하기 위해서는 docker daemon의 config 를 변경해야 함. 공식 홈페이지에 docker daemon의 config 설정 방법은 두 가지가 있다고 설명함.

 

  1. 첫째는 json 설정 파일을 사용하는 것이고, 모든 설정을 한 곳에서 관리할 수 있어, 이 방법이 더 선호되는 방식임.
    (/etc/docker/daemon.json 파일 변경)
  2. 둘째는 dockerd 시작할 때에 flag를 사용하는 방식
    (/lib/systemd/system/docker.service 파일 변경)
There are two ways to configure the Docker daemon:
 - Use a JSON configuration file. This is the preferred option, since it keeps all configurations in a single place.
 - Use flags when starting dockerd.

추가 해석:

도커 데몬은 우분투에서 systemctl을 통해 실행됨. systemctl은 프로그램 실행 시 /lib/systemd/system/[PROGRAM-NAME].service 파일을 읽어 실행하는데, 이 파일에 dockerd를 CLI로 실행하는 스크립트가 있고, 여기서 flag를 전달하면 두 번째 방법으로 config를 설정하는 것. 이에 반해 daemon.json 파일을 설정하는 것은 ubuntu와는 별개로 어떤 os이든 docker daemon에 대한 설정을 json 형식으로 daemon 실행 시에 전달하는 것으로, 표준적이고, 한 파일 내에 작성, 관리될 수 있어 더 선호되는 방식인 듯함. 실제로 macos에서 docker desktop을 열어봐도 동일한 설정 파일을 통해 설정 가능함을 확인함.

무튼 그래서 나는 두 가지 방식 중 첫 번째 방식을 통해 설정을 수행하였고, 결과적으로 변경이 잘 된 것을 확인함. 따라서 첫 번째 방법에 대해서 아래에 기술함.

 

Docker daemon configure 설정하기

/etc/docker/daemon.json 파일을 열어 다음을 추가. [NEW-DIRECTORY]는 말그대로 새로운 디렉토리로 가용 공간이 많은 디렉토리에 새로운 도커만을 위한 디렉토리를 생성하여 추가해 주어야 함.

$ sudo vi /etc/docker/daemon.json
{
  "data-root": [NEW-DIRECTORY]
}

예를 들면 아래와 같음.
(이유는 도커에서 사용하는 모든 다양한 파일들을 이 디렉토리에 저장하기 때문에 다른 데이터와 섞이지 않도록 관리되는 것이 좋음)

$ mkdir /data/docker
$ sudo vi /etc/docker/daemon.json
{
  "data-root": /data/docker
}

이렇게 경로를 바꿔주면, docker daemon이 이 설정 파일을 읽어 경로를 변경하도록 restart 해주어야 하는데, 이 전에 해야 할 일이 있음.

 

1. 지금까지 저장된 파일을 새로운 경로에 옮겨주기

$ cp -r /var/lib/docker [NEW-DIRECTORY]

# example
$ cp -r /var/lib/docker /data/docker

 

2. 현재 실행 중인 프로세스 확인

(만약 중요한 실행 중인 프로세스가 있다면, 변경 및 재시작 때문에 문제가 발생할 수 있으므로 없애주어야 함)

$ docker ps
$ docker-compose ps

특히, 쿠버네티스 관련 파드를 제대로 중지하지 않으면, 데몬 재시작이 원활하지 않아 설정이 잘 안되는 경우가 있으니 웬만하면 중지 또는 삭제하는 것이 좋음

 

위 작업이 완료되면, 도커 데몬을 재시작하면 됨.

$ sudo systemctl stop docker
$ sudo systemctl daemon-reload

위를 실행하였을 때에 도커 데몬이 실행 중이면 안됨. 실행 중인지는 아래 명령어를 통해 확인할 수 있으며, 만약 실행 중인 프로세스가 있으면 kill 을 통해 프로세스를 죽여야 함.

$ ps -ef | grep -v grep | grep docker

실행 중인 프로세스가 없으면 아래 명령어를 통해 도커를 재시작.

$ sudo systemctl restart docker

재시작 후에 설정이 잘 되었는지 확인해본다.

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

실행이 잘 되었다! 만약 이 때 restart 에서 오류가 나면 /etc/docker/daemon.json을 수정하다가 오류가 난 것이니 다시 한 번 형식을 잘 살펴야 하며, 실행이 잘 되었지만 설정이 안된 경우, 위에서 말한 것처럼, 도커 데몬을 중지하였음에도 제대로 멈춰지지 않아 안되었을 확률이 높으니, 프로세스를 다시 한번 확인하고 재시작한다.

 

마무리..

뇌피셜과 블로그 코딩은 지양하고, 최대한 공식 도큐먼트를 통해 찬찬히 이해하고 코드 한 줄 한 줄을 신중하게 입력하도록 노력하자..

Reference

반응형