내가 Docker를 사용할 때는 실수로 지워버린다던지에 대한 두려움 때문에 앤만하면 호스트의 디렉터리를 직접 맵핑할려고 하지 않고, Docker Volume를 생성해서 등록하고자 노력한다. 하지만 Docker Volume를 백업해야하거나 직접 Volume에 접근해서 조치를 해야할 때 문제가 생기게 된다. 특히, Host가 Windows 또는 macOS일 경우에 생기게 되는데, macOS에서 표시되는 것과 실 위치가 다른지 탐구해보았다.
Linux의 경우 Docker Volume의 실제 저장 위치를 찾기 매우 쉽다. 별 걱정 없이 사용할 수 있을 것이다. 바로 아래 명령어를 통해 찾는 것이다.
docker volume inspect (volume 명)
명령어를 사용하면 위와 같이 'Mountpoint'라고 등장해서 실제 데이터의 위치를 알려준다. Docker를 돌리는 Host OS가 Linux의 경우 그냥 그대로 찾아들어가면 된다.
이제 문제는 Linux가 아닌 다른 OS일 때이다. Docker의 원리를 알아보신 분들이라면 알겠지만, Docker는 Host의 Kernel Socket를 공유한다. 그것이 VM과 Container를 가름짓는 결정적인 차이점이다.
출처: https://www.aquasec.com/cloud-native-academy/docker-container/docker-architecture
위 사진을 보시라. 차이를 알겠는가. Docker는 OS를 구성하는 요소 없이 바이너리, 라이브러리, 어플리케이션만 구동한다. 즉, Host Linux Kernel을 대신할 것이 필요하다.
만일, Host가 Linux라면 쓰고 있는걸 그대로 사용하면 되지만, 다른 OS라면 Linux Kernel가 아니다. 그래서, VM으로 Linux를 구동하고 그 위에 Docker Engine를 구동하는 것이다. 즉, 아까 명령어에서 Mountpoint는 VM에서의 Mountpoint를 뜻하게 되는 것이다. 그래서, 우리가 찾을 수 없었던 것이다. 이는 Windows와 macOS에서 동일하다.
macOS의 경우에 Docker Volume에 접근하기 위해서는 screen 명령어를 통해서 Linux VM에 접속한 다음에 경로에 접속하면 된다고 했는데, M1으로 오면서 바뀐건지 어쩐건지 안 됐다. 그래서 여기에서 다른 방법을 찾을 수 있었다. 그래서 이 방법을 소개해보고자 한다.
vi ~/.zshrc
위 명령어를 터미널에 입력한 뒤, 아래 내용을 제일 아래에 추가해준다.
alias dockervm="docker start dockervm_instance -i || docker run --name=dockervm_instance -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh"
이 후 dockervm
이라는 명령어를 입력하고, /var/lib/docker/volumes
로 이동하면 volume이 등장하게 된다.
하지만, 명령어를 보면 알 수 있듯이 'nsenter'를 통해 namespace에 들어간 것이라서 저 명령어를 변경해서 Volume를 마운트해봐자 불가능했다. 그래서 외부 백업을 위해서는 다른 명령어를 사용해야하고, 위 경우에는 volume에 직접 접근해서 명령을 수행해야할 때 사용하면 된다.