도커/개념 및 실습

04장, 도커 볼륨

Jaden Park 2021. 6. 2. 11:35

도커에서 데이터 관리

  • 기본적으로 컨테이너에 생성되는 모든 파일은 컨테이너 레이어에 저장된다.
  • 이 데이터들은 컨테이너와 함께 삭제되는 런타임 데이터인데, 이 데이터를 영구적으로 저장하려면 반드시 볼륨을 사용해야 한다.
  • 도커에서 볼륨을 사용하는 방법은 Bind Mount볼륨(Volume) 두 가지 방법이 있다.

Bind Mount 소개

  • 초기 도커부터 사용했던 방식
  • 호스트의 특정 디렉토리와 컨테이너의 디렉토리를 연결하는 방식
  • Bind Mount 는 쉽게 사용할 수 있지만 도커에 의해 관리되지 않기 때문에 따로 기록하지 않으면 관리하기가 쉽지 않음
  • 성능이 뛰어나지만, 호스트의 파일 시스템에 대한 의존도가 높음
  • 만약 애플리케이션을 개발한다면 Bind Mount 보다 볼륨을 사용하는 것을 권장
  • Bind Mount 는 호스트의 민감한 파일까지 접근할 수 있으므로 보안 측면에 문제가 발생할 수 있음

Bind Mount 관한 사용 사례

  • 호스트와 컨테이너가 /etc/reslov.conf 와 같은 설정 파일을 공유할 때
  • 호스트와 컨테이너가 개발환경 사이에서 소스 코드나 빌드 아티팩트를 공유할 때
  • 호스트와 파일 또는 디렉토리 구조가 컨테이너의 Bind Mount와 일치하도록 보장된 경우

볼륨(Volume) 소개

  • 도커에 의해 관리되는 스토리지
  • docker 명령을 사용하여 생성할 수 있고 사용하지 않으면 한꺼번에 삭제할 수 있음
  • 이미지의 Volumes 부분에 어떤 값이 지정되어 있으면 컨테이너로 실행할 때 볼륨을 지정해야 함
  • 그렇지 않으면 임의의 이름으로 볼륨을 생성하고 이런 볼륨은 어떤 데이터를 저장하는지 저장하고 있는지 모르기 때문에 관리가 어려움
  • 볼륨 Bind Mount 와 다르게 다양한 드라이버를 지원

볼륨 관한 사용 사례

  • 다수의 실행 중인 컨테이너 사이에 데이터를 공유할 때
  • 컨테이너에서 호스트 구성을 분리할 때
  • 컨테이너 데이터를 원격의 호스트 또는 클아우드 업체를 저장하고 싶을 때
  • 다른 호스트로 데이터를 백업하거나 복원할 때

Bind Mount 사용

[root@docker ~]# mkdir ~/bm1 ; touch ~/bm1/fileA.txt
[root@docker ~]# docker run -itd --name os3 -v /root/bm1:/tmp/mount centos
f99b3ded428321c27eaa31bb60200121c9101953717f61d8984251d67dc7159b
[root@docker ~]# docker exec os3 ls /tmp/mount
fileA.txt
  • Bind Mount를 사용하기 위해 먼저 디렉토리와 파일을 생성
  • 실핼 중인 컨테이너에는 Bind Mount를 연결할 수 없고, 반드시 컨테이너를 실행하거나 생성하면서 연결해야 함.
  • 컨테이너에 Bind Mount를 사용하려면 docker run 명령 중 -v 옵션을 사용
  • 마운트 할 로컬 디렉토리를 컨테이너에 덮어쓰게 됌.
    • 로컬:/bindMount 비어있음
    • centos 이미지 컨테이너 /tmp/mount/ 마운트함
    • 컨테이너 tmp/mount/ 는 로컬의 빈 디렉토리로 초기화 됌.

볼륨(volume) 사용

[root@docker ~]# docker volume create --help

Usage:  docker volume create [OPTIONS] [VOLUME]
  • 볼륨은 docker volume 명령으로 생성할 수 있음
  • 이 볼륨들은 /var/lib/docker/volumes 에 저장되며, 이 위치는 호스트에서 접근하는 것을 권장하지 않음
  • Bind Mount와 마찬가지로 도커 볼륨도 컨테이너를 실행하거나 생성하면서 볼륨을 연결해야 함, 옵션은 -v 동일

vol1 볼륨을 생성하고 확인

[root@docker ~]# docker volume create vol1
vol1

[root@docker ~]# docker volume ls
DRIVER    VOLUME NAME

...

local     vol1

[root@docker ~]# docker inspect vol1
[
    {
        "CreatedAt": "2021-06-02T05:13:48+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
        "Name": "vol1",
        "Options": {},
        "Scope": "local"
    }
]

centos 이미지로 os4 컨테이너를 실행하면서 vol1 볼륨을 os4 /tmp/volume 에 연결

[root@docker ~]# docker run --name os4 -itd -v vol1:/tmp/volume centos
dbbaa0c18d296bf0af110a5f6694c30dfd56fe78706573fc97bca160ff58e47a
  • 현재는 vol1에 아무런 데이터가 없기 떄문에 os4 컨테이너의 /tmp/volume 의 내용을 확인해도 아무것도 없음

http 이미지로 web3 컨테이너를 생성하면서 vol1 을 연결

[root@docker ~]# docker run --name web4 -itd -v vol1:/usr/local/apache2/htdocs:ro httpd
a875bb8d36b231a96c4ed1a8ef9d8c346de750f857ab91d3902b253777eb6829
[root@docker ~]# docker exec os4 cat /tmp/volume/index.html
<html><body><h1>It works!</h1></body></html>
  • httpd 이미지로 생성된 모든 컨테이너는 /usr/local/apache2/htdocs 디렉토리에 index.html 파일이 존재
  • 만약 web3 컨테이너가 vol1 볼륨에 성공적으로 연결되었다면 os4 컨테이너의 /tmp/volume 에서도 index.html 파일을 확인할 수 있어야 함.

'도커 > 개념 및 실습' 카테고리의 다른 글

05장-2, 컨테이너의 통신  (0) 2021.06.02
05장-1, 도커 네트워크 유형  (0) 2021.06.02
1, 2, 3장 연습문제  (0) 2021.06.02
03장-3, 컨테이너 관리  (0) 2021.06.02
03장-2, 컨테이너 실행  (0) 2021.06.01