어느 날, systemctl start docker 명령어를 입력했더니 hang이 걸리는 사건이 있었다.
dmesg와 journalctl, messages를 전부 확인해도 문제가 되는 부분이 없었고, docker.socket 또한 기동이 되고 있었다.
삽질을 하던 중 찾아낸 원인은…. docker의 기본 디렉토리인 /var/lib/docker 가 3TB 가까이 사용중이였으며,
하필이면 할당된 디스크가 성능이 안 좋은 SATA 디스크였기에 docker가 기동되면서 /var/lib/docker의 데이터들을 읽어오는 시간이
상상초월할 정도로 길었으며, 그러던 중 hang이 걸리게 되는 것이였다.
(hang이 걸렸다기보다는 몇십분을 기다려도 안올라오고 있었다.)
결국 해당 디렉토리를 백업하고 비우니 정상적으로 docker가 기동되었다.
이런 경험이 있었던 만큼 docker 디렉토리의 구조를 짚고 넘어가야겠다는 생각이 들었다.
설치한 Docker의 정보 확인
[root@wordpress docker]# docker info
Client: Docker Engine - Community
Version: 26.1.3
Server:
Storage Driver: overlay2
Logging Driver: json-file
Docker Root Dir: /var/lib/docker
docker info 명령어로 현재 설치한 docker의 버전과 Root Dir, Driver등을 알 수 있다.
Root Dir에 디렉토리 구조 확인
[root@wordpress docker]# tree -L 1
.
├── buildkit
├── containers
├── image
├── network
├── overlay2
├── plugins
├── runtimes
├── swarm
├── tmp
└── volumes
설치 환경과 Docker에 따라 디렉토리 구조는 조금씩 다를 수 있다고 생각한다.
해당 Dir들을 하나씩 까보면서 구조를 파악하는 것이 좋을 것 같다.
BuildKit
Docker 18.09부터 추가 된 Buildkit라는 빌드 엔진이 있는데, 주로 Multi-stage Build를 사용할 경우 시간을 단축시키기 위해 많이 사용한다.
Overlay2
Linux의 Docker에서 선호되는 스토리지 드라이버이며, Docker의 Container가 Storage Driver의 파일 시스템을 기반으로 동작한다고 한다.
여러 스토리지 드라이버가 있지만 대체적으로 overlay2를 가장 추천한다고 적혀있다.
(overlay2는 xfs, ext4의 파일시스템을 지원하며, 디폴트는 xfs이다.)
Docker의 Image는 레이어가 차곡차곡 쌓아져 만들어 지는데, 이를 확인하려면 아래 명령어로 특정 Container의 레이어들을 확인할 수 있다.
[root@wordpress overlay2]# docker inspect --format='{{json .GraphDriver}}' wordpress
{"Data":{"LowerDir":"/var/lib/docker/overlay2/efd29057f8244b121bd35b0c72b99c5be0ce3c35f6ab78cc1c8997522aa0ef64-init/diff:/var/lib/docker/overlay2/344e702aa7172d5eac72c9e8d938d3b4fdb1be678a90158afd33e69d1a377962/diff:/var/lib/docker/overlay2/83e773a51559167f6f2c486d261346de6bc5a1b19b547eb73ca9c4791ad0dac6/diff:/var/lib/docker/overlay2/5ff338d9d8977f81c7c5e6bf1dd52398518014651bfa98555fab40a78759d9c6/diff:/var/lib/docker/overlay2/66806b530dd152b923605b817dc85266a5f926fca8c0a01b6643f508dd0395d6/diff:/var/lib/docker/overlay2/b4f094c03a1af3b3a2668fa9c863cad9eb9967d964792a852ca9e2e222d5cae5/diff:/var/lib/docker/overlay2/ab497cd32f26fb03882323174007ce8eedd656831b9ad8c3aeed1333fcc15870/diff:/var/lib/docker/overlay2/7fb4e025df695642cbbe4bffad4c908798778b90328c382893dfdc480338e37a/diff:/var/lib/docker/overlay2/b23567bf21828a875449ac08da96ae38ef7f93591eea796c474442100770584a/diff:/var/lib/docker/overlay2/8af58315fa8066f439bb8e899351961b57a814945a6fe3a220eacc5b5284e279/diff:/var/lib/docker/overlay2/fbd90798624da128c0a6ad301c10c52c5c6a4b6b1bdbc2e6ab3c07b858303cb0/diff:/var/lib/docker/overlay2/31d7e97054470fb3d36482bca2fbd2fe71ebbd430b27a03481427237a015d465/diff:/var/lib/docker/overlay2/e36cf33d2d6b159a7d1f45f9b917c93b80be7d0a503b9c20eb1015332864a1f5/diff:/var/lib/docker/overlay2/4b901088abac2e3f3e58adaa5121fcffca6fec42ed33484c6371c2c56f313289/diff:/var/lib/docker/overlay2/1ffdfffc24b413a9027559445b45e0b15c193ab0e5864cf990fb60ebcd0f3003/diff:/var/lib/docker/overlay2/3a4f422410f57426883f83412a99b8d47a533f7e98b34d7ec5a01ebc13db0444/diff:/var/lib/docker/overlay2/a6f5d13d1d4151071a671b0786136801dad648bd2d8966895a7bdcf24dacf15b/diff:/var/lib/docker/overlay2/8bde1a0afa07c85ad1f74fc466e4eeeb0bdb2f36e5ba1212ff46688a920dee3b/diff","MergedDir":"/var/lib/docker/overlay2/efd29057f8244b121bd35b0c72b99c5be0ce3c35f6ab78cc1c8997522aa0ef64/merged","UpperDir":"/var/lib/docker/overlay2/efd29057f8244b121bd35b0c72b99c5be0ce3c35f6ab78cc1c8997522aa0ef64/diff","WorkDir":"/var/lib/docker/overlay2/efd29057f8244b121bd35b0c72b99c5be0ce3c35f6ab78cc1c8997522aa0ef64/work"},"Name":"overlay2"}
Docker 디렉토리의 분석은 추가적으로 계속 작성할 예정이다.