도커

[클라우드] 7. Docker Volumn

트리스탄1234 2022. 8. 7. 09:42
728x90
반응형

이번 포스팅에서는 Docker 기반에서의 Volumn에 대해 포스팅을 해보겠습니다.

Docker에서 Docker로 컨테이너를 실행 후 컨테이너 안에서 파일을 생성하면 Docker의 기본설정으로 모든 파일들을 컨테이너 안의 writable layer에 저장됩니다.

이런 구조에서의 운영환경은 많은 문제를 발생 시킵니다. 예를 들면 컨테이너 안에서 생성한 파일들은 컨테이너가 재시작 되거나, 중지가 되어 버리면 접근을 할수 없습니다.

컨테이너의 writable layer에 데이터를 기록하기 위해서는 파일스시템을 관리 할 storage driver 가 필요한데요, storage driver는 리눅스의 커널을 이용해서 union filesystem을 제공하기때문에 이러한 추가적인 작업으로 인해, Host 파일시스템에 직접 데이터를 기록하는 것과 비교하면. 성능적인 면에서 Host 파일 시스템을 사용하는것 보다 취약 합니다.

그래서 Docker에서 컨테이너가 중지 되더라고 Host 파일 시스템을 사용하기 위한 방법은 아래와 같이 3가지의 방법이 있습니다.

Volumn

 

Volumes은 Docker에 의해 관리되는 Host 파일시스템 특정 영역에 데이터를 저장하는 방식 입니다 리눅스상에서의 기본 위치는 "/var/lib/docker/volumes/" 입니다.

그럼 이제 Volumn을 이용해서 컨테이너에 마운트 시켜서 사용하는 방법을 알아 보겠 습니다.

우선 Volumn과 관련된 명령어의 용도를 정리를해 보면 아래와 같습니다

- docker volumn create : 신규 볼륨을 생성합니다.

- docker volumn inspect : 볼륨의 상세 정보를 조회 합니다.

- docker volumn ls : 생성된 볼륨들의 리스트를 보여 줍니다.

- docker volumn prune: 사용하는 않는 로컬 볼륨들을 삭제 합니다.

- docker volumn rm : 하나 이상의 볼륨을 삭제 합니다.

그럼 이제 위의 명령을 사용해서 볼륨을 생성하고 컨테이너에 마운트 시켜 보겠 습니다.

root@test-VirtualBox:~# docker volume create testvolumn ==> 신규 볼륨 생성
testvolumn
root@test-VirtualBox:~# docker volume inspect testvolumn ==> 생성된 볼륨 정보 출력
[
{
"CreatedAt": "2022-07-19T09:55:33+09:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/testvolumn/_data", ==> 디폴트 마운트 위치
"Name": "testvolumn",
"Options": {},
"Scope": "local"
}
]
root@test-VirtualBox:~# docker run -it --name ubuntu --mount source=testvolumn,target=/testvolumndata ubuntu
root@debd7972d1db:/# cd testvolumndata/ ==> 컨테이너의 볼륨 영역으로 이동
root@debd7972d1db:/testvolumndata# ls -al ==> 파일 조회
total 8
drwxr-xr-x 2 root root 4096 Jul 19 00:55 .
drwxr-xr-x 1 root root 4096 Jul 19 01:03 ..
root@debd7972d1db:/testvolumndata# touch testvolumn ==> 신규 파일 생성
root@debd7972d1db:/testvolumndata# ls -al ==> 파일 조회
total 8
drwxr-xr-x 2 root root 4096 Jul 19 01:04 .
drwxr-xr-x 1 root root 4096 Jul 19 01:03 ..
-rw-r--r-- 1 root root 0 Jul 19 01:04 testvolumn
root@debd7972d1db:/testvolumndata# exit ==> 컨테이너에서 호스트 머신으로 전환
exit
root@test-VirtualBox:~# cd /var/lib/docker/volumes/testvolumn/_data/ => 호스트 영역의 도커 파일 영역으로 이동
root@test-VirtualBox:/var/lib/docker/volumes/testvolumn/_data# ls -al ==> 파일 조회
total 8
drwxr-xr-x 2 root root 4096 7월 19 10:04 .
drwx-----x 3 root root 4096 7월 19 09:55 ..
-rw-r--r-- 1 root root 0 7월 19 10:04 testvolumn ==> 컨테이너에서 생성한 파일 조회
root@test-VirtualBox:/var/lib/docker/volumes/testvolumn/_data#

Bind mount

 

Bind mounts는 Host시스템의 Docker영역이 아닌 어디에나 파일을 저장할 수 있는 방법입니다.

Volumn을 사용할때와 비교를해 보면 아래와 같은 단점이 있습니다.

- Bind mount는 Host의 디렉터리 구조에 의존적.

- Docker에 의해 관리되어지지 않음.

- Container안의 프로세스가 Host의 파일시스템을 변경할 수 있으므로 보안상 위험.

Bindmount를 이용하는 방법은 -v옵션을 사용해서 가능합니다. 그 형식은 아래와 같습니다.

docker run -v <호트트 머신의 마운트 경로>: <컨테이너의 마운트 경로> <이미지 이름>

root@test-VirtualBox:~/testvolumn# docker run -it -v /root/testvolumn/:/data/bindmount ubuntu
root@1a003817e339:/#
root@1a003817e339:/# pwd
/
root@1a003817e339:/# cd data/bindmount/ ==> 컨테이너의 마운트 경로로 이동
root@1a003817e339:/data/bindmount# ls -al
total 8
drwxr-xr-x 2 root root 4096 Jul 19 01:27 .
drwxr-xr-x 3 root root 4096 Jul 19 01:28 ..
root@1a003817e339:/data/bindmount# touch test ==> 테스트 파일 생성
root@1a003817e339:/data/bindmount#
root@1a003817e339:/data/bindmount#
root@1a003817e339:/data/bindmount# ls ==> 파일 확인
test
root@1a003817e339:/data/bindmount#
root@1a003817e339:/data/bindmount# exit ==> 컨테이너에서 호스트로 전환
exit
root@test-VirtualBox:~/testvolumn# pwd
/root/testvolumn
root@test-VirtualBox:~/testvolumn# ls -al ==> 호스트 마운트 경로의 생성된 파일 확인
total 8
drwxr-xr-x 2 root root 4096 7월 19 10:28 .
drwx------ 6 root root 4096 7월 19 10:27 ..
-rw-r--r-- 1 root root 0 7월 19 10:28 test
root@test-VirtualBox:~/testvolumn#

tmpfs mounts

tmpfs mounts디스크에 데이터를 영구적으로 저장할 필요가 없는 경우에 사용을 하게 됩니다. tmpfs의 데이터는 호스트의 메모리에 저장이 되게 됩니다. 이러 특징 때문에 tmfs mount Container의 생명주기와 맞춰서 데이터를 보존하고자 할 때 사용을 합니다.

tmpfs 설정 방법은 위의 bind mount방식과 같이 -v옵션을 사용하면 됩니다. 다만 source의 디렉토리를 /tmp/밑의 사용하고자 하는 디렉토리로 마운트를해서 사용을 하면 됩니다.

 

728x90
반응형