Backend with Golang

[Docker] Storage: volumes vs bind mounts

아직개구리 2024. 3. 21. 22:21

Container 안에서 생성된 모든 파일들은 writable container layer에 저장된다. 이것은 아래와 같은 사실들을 의미한다. 

 

- 컨테이너가 사라지면 이 데이터들은 유지되지 않는다, 또한 이 데이터들을 다른 프로세스에서 사용하려고 할 때 꺼내기가 쉽지 않다. 

- container의 writable layer는 host machine과 tight하게 커플링 된다. 데이터를 어디론가 이동시키는 것은 쉽지 않다. 

 

어떤 방식으로 mount 되는가에 상관 없이 data는 컨테이너 안해서 똑같이 보인다. 

하지만 방식 자체는 여러개가 있는데 이 글에서는 그 세가지에 대해서 간략히 다뤄보고자 한다. 

 

Volumes 

: docker에 의해 관리되는 host filesystem (/var/lib/docker/volumes/) 안에 저장된다. Non-docker process들은 filesystem의 이 부분을 변경할 수 없다. volume은 docker내에서 data를 유지하기에 가장 좋은 방법이다. 

 

 Volume은 docker 에 의해서 생성되고 관리된다. 생성하게 되면 docker host의 디렉터리 내에 저장된다. 볼륨을 컨테이너에 탑재하면 이 디렉터리가 컨테이너에 탑재되는 것이다. Volume은 docker에 의해 관리되고 호스트 시스템의 코어 기능들로부터 분리된다는 점만 빼면 bind mounts 의 동작과 비슷하다. 

 

하나의 volume은 여러개의 container들에 동시에 mount 될 수 있다. 동작하고 있는 container가 volume을 사용하고 있어도, 그 볼륨은 docker에 의해 접근 가능하다. 

 

Bind mounts

: host system의 어딘가에 저장될 수 있다. non docker 프로세스들은 이것들을 언제든지 바꿀 수 있다. 

 

volume에 비해서 기능이 제한되어있다. 호스트 시스템의 파일이나 디렉터리가 컨테이너에 마운트 된다. 호스트 시스템의 전체 경로로 참조가 된다. 이미 존재하지 않는 것이면, 요청 시에 생성된다. 

 

부작용은 중요한 시스템 파일이나 디렉터리 생성 수정 삭제를 포함해서 컨테이너에서 실행되는 프로세스를 통해서 호스트 파일 시스템을 변경할 수 있다는 점이다. 보안에 영향을 미칠 수 있는 강력한 기능이라 조심해야한다. 

 

Tmpfs mounts

: host system의 메모리에 저장하는 것이다. host system의 filesystem에 파일을 쓰지 않는다. 즉, 디스크에 유지되지 않기 떄문에 컨테이너 수명동안 non-persistent state나 민감한 정보를 저장하는 데 사용할 수 있다.