본문 바로가기
공부/프로그래밍

[centos7-docker] 용량이 가득 찼을 경우 처리, docker 경로 변경

by demonic_ 2018. 12. 25.
반응형

도커를 쓰던중에 갑자기 시스템이 멈췄다. 알고보니 최근 대용량 처리를 한적이 있는데, 그것때문에 물리디스크가 100%로 가득찼던것. 진단을 해보니 docker의 overlay 가 대부분을 차지하고 있었다. 용량이 큰 물리디스크가 있었는데 그곳에 붙이지 않고 용량이 적은 디스크에 쓰여있어서 이런 문제가 발생했던 것. 그래서 디스크 사용을 진단하고 docker의 경로를 변경했다.


여기서는 다음의 순서로 진행한다.


1) 안쓰는 이미지와 컨테이너 삭제

2) 도커의 기본경로 바꾸기


1) 안쓰는 이미지와 컨테이너 삭제


안쓰는 이미지와 컨테이너를 삭제하는 방법은 명령어 한줄로 간단히 할 수 있다.


docker system prune -a -f


위의 명령어를 쓸 때는 지금당장 컨테이너가 실행되고 있지 않은 것까지 모두 지운다는 것. 컨테이너를 올리게 되면 다시 다운로드 받을테니 큰 걱정거리는 아니다.


문제는 이런 이미지와 컨테이는 생각보다 용량이 크지 않다. 대부분 라이브의 것이 용량이 엄청 크다.


도커가 설치되면 별다른 설정을 하지않는 한 /var/lib/docker 에 설치된다.

그리고 컨테이너를 실행할때 별다른 볼륨을 조절하지 않았다면 /var/lib/docker/volumes 안에 있다.

일단 여기에 접근해서 용량을 살펴봤다.


du -hs *|sort -nr


50G ca97777cc97e8562a8d8f91f4cd5783a44

48K ba990c5df5f4b724ca853ef4c8a6d01ee0

24K metadata.db

20K d028f1240b4c2c7b7f93d123a179f83fff

4.8M 1bb927f01df31493b38cad0ed8818782


50G 를 차지하는 volume가 있다. 과연 이게 무엇일까? 안타깝게도 역추적하는 방법을 몰라 docker의 컨테이너 번호를 통해 어떤것이 저중에 연결되어 있는지는 추적했다. 우선 도커 컨테이너 목록을 살펴봤다.


docker ps -a


보이는 목록에서 컨테이너 ID를 가지고 다음의 명령어를 이용해 연결된 것을 찾았다.


docker inspect [컨테이너_ID 또는 컨테이너_NAME]


해당 컨테이너의 상세정보를 알 수 있다. 이중에 Mounts 부분에 간 다음 Name을 확인해보면 이전에 용량확인을 위해 목록업 했던 것의 결과값과 일치하는 것이 있음을 확인할 수 잇다.

(ca97777cc97e8562a8d8f91f4cd5783a44)


...

"Mounts": [

    {

        "Type": "bind",

        "Source": "/var/run/docker.sock",

        "Destination": "/var/run/docker.sock",

        "Mode": "rw",

        "RW": true,

        "Propagation": "rprivate"

    },

    {

        "Type": "volume",

        "Name": "ca97777cc97e8562a8d8f91f4cd5783a44",

        "Source": "/data/docker/volumes/ca97777cc97e8562a8d8f91f4cd5783a44/_data",

        "Destination": "/kafka",

        "Driver": "local",

        "Mode": "",

        "RW": true,

        "Propagation": ""

    }

],

...


해당 컨테이너가 현재 50G 의 용량을 차지하고 있는 샘이다.


관련 컨테이너를 죽이든, 아니면 컨테이너 내 용량을 차지하는 것을 지우든 하면 된다.




2) 도커의 기본경로 바꾸기

도커의 설정파일을 수정해야 한다. 하기전에 우선 도커를 끄자.

# 도커 종료
systemctl stop docker

# 설정파일 수정
vi /lib/systemd/system/docker.service

...
[Service]
# ExecStart=/usr/bin/dockerd << 이부분을 주석처리 하고 아래부분 추가
ExecStart=/usr/bin/dockerd --graph=[변경할 경로]
...


저장하고 나면 데몬을 다시 로드해야한다고 한다. 


# 데몬 리로드

systemctl daemon-reload


# 도커 시작

systemctl start docker


정상적으로 서비스가 실행되었다면 다음의 경로를 확인하여 다음의 폴더들이 있는지 확인해보면 된다.


ls -al /[변경한 경로]


containers  image  network  overlay  plugins  swarm  tmp  trust  volumes



반응형

댓글