티스토리 뷰

DOCKER

[Docker] Docker Volume

PeonyF 2024. 1. 2. 19:59
반응형

Docker Storage 필요성

1. Docker Layer = Container Layer + Image Layer

  • Image Layer = Read Only : Docker Image는 읽기전용이며 어떠한 경우에도 변경되지 않음(변경사항 적용X)
  • Container Layer = Writable
  • Writable Layer : 컨테이너가 생성될때, Dockers는 읽기 전용 이미지 위에 “Writable Layer”를 추가

→ 이 레이어에서 컨테이너 내의 변경사항(파일 추가,수정,삭제 등)이 처리됨

  • Writable Layer의 휘발성 : Container 삭제시 Writable Layer에 저장된 모든 데이터도 함께 삭제됨

2. Container의 Data 저장 문제점(휘발성)

Container의 Writable Layer에 Data를 저장할 수 있지만 몇가지 문제점이 있음

  • Container 삭제시 Data 삭제 → 다른 Process에서 Container에 저장된 Data를 사용X
  • 이미지를 통해 Container를 만들면 Container는 읽기 전용이 되고 컨테이너 변경사항만 별도로 저장하여 컨테이너 정보를 보존한다. 이때 이미지는 어떠한 경우로도 변경되지 않는다.
  • Container의 Writable Layer가 실행중인 host system과 밀접하게 연결 (Writable Layer가 실행 중인 host storage system에 저장되어 관리되기 때문) + Container의 생명주기와 연결되어있어 = 데이터를 다른곳으로 옮기기 힘듦(데이터를 다른 시스템으로 이전시 변환과정 필요 및, 데이터가 지속적으로 있단 보장이 없음)

 

Docker Storage

  • 컨테이너 상에서 볼륨을 영구적으로 사용할 수 있는 방법은 세가지가 있다.
  1. Docker Volume
  2. Bind Mounts
  3. tmpfs Mounts

 

Docker Volume

 

  • Docker가 제공하는 불륨 관리 기능을 통해서 볼륨을 생성하고 삭제,관리를 할 수 있다.
  • Volume이란 Host file system에 저장되는 디렉터리나 파일로, Container의 Union 파일 시스템 외부에 존재
  • Linux 시스템에서 볼륨은 일반적으로 /var/lib/docker/volumes/ 디렉터리 아래에 저장되어 Docker는 이 Volume을 관리하고 Volume에 저장된 데이터는 Host file system의 일부로 존재함

Host file system 이란?

Docker가 실행되고 있는 컴퓨터의 파일 시스템(OS가 파일을 저장하고 관리하는 방식: 파일 저장,삭제,수정)

즉, Docker 환경에서 호스트 파일 시스템은 Docker의 컨테이너, 이미지, 그리고 볼륨을 저장하는 기반

호스트 파일 시스템
│
├── Docker 이미지 (읽기 전용 레이어) : 호스트 파일 시스템에 저장되며 컨테이너를 시작시 사용
│
├── Docker 컨테이너
│   ├── 읽기 전용 레이어 (이미지에서 가져옴)
│   └── 쓰기 가능 레이어 (컨테이너 레이어): 컨테이너 실행시 '읽기 전용 레이어'위에 '쓰기 가능 레이어'를 추가
└── Volumes
    └── 영구적 데이터 저장: 컨테이너에 마운트되어 데이터를 보관 
  • Volume은 Container의 데이터를 영속적으로 저장하고 Container 사이에 데이터를 공유하기 위해 사용, Container가 삭제되어도 Volume에 저장된 데이터는 유지됨

 

Docker Volume VS COPY

Volume : 로컬머신(Docker가 설치되고 실행되는 기본 시스템)에 있는것을 맵핑(참조)해서 도커 컨테이너에서 실행

             개발때 소스 변경시 다시 이미지를 빌드하지 않고 변경한 소스부분이 application에 적용하도록 하기 위해

  • Copy: 로컬머신에 있는 파일을 도커 컨테이너에 복사

 

 

Docker Volume 장점

  • Volume은 Bind Mount보다 백업, 마이그레이션이 더 쉬움
  • Volume은 다른 컨테이너 간에 데이터를 공유하는 데에도 사용
  • Docker CLI 명령, Docker API를 사용해 Volume을 관리 할 수 있음
  • Docker Desktop의 Volume은 Mac,Window host의 바인드 마운트보다 성능이 훨씬 높다.
  • Volume은 이를 사용하는 Container크기를 늘리지 않고 Volume의 컨텐츠가 지정된 Container의 수명 주기 외부에 존재해서 Container의 Writable Layer에 데이터를 유지하는 것보다 Volume을 선택하는것이 더 나은 경우가 많다

 

Docker Volume 사용 사례

  • 실행 중인 여러 Container 간에 Data 공유가 필요한 경우
    • 여러 Container가 동일한 volume을 읽기/쓰기 또는 읽기 전용으로 동시에 Mount할 수 있다.
  • Docker Host가 특정 디렉토리나 파일 구조를 가질 수 없는 경우
    • volume은 Container Runtime으로부터 Docker Host의 설정을 분리할 수 있다.
  • 로컬외의 원격 Host 및 Cloud Provider에 Container의 Data를 저장하려는 경우
    • A Docker Host → B Docker Host로 백업,복구,migration시 volume을 사용하는게 좋다.
    • volume을 사용하여 Container를 중지한 다음 volume의 디렉토리(예: /var/lib/docker/volume/<volume-name>)를 백업할 수 있다.

 

Docker Volume 코드

% docker volume create testvolume
testvolume

# nginx를 testvolume에 영구 설치함, -d는 백그라운드에서 실행하란 명령어
# -v testvolume:/app/data는 testvolume : 볼륨을 컨테이너의 /app/data 디렉토리에 마운트하라고 명령
% docker run -d -v testvolume:/app/data --name mycontainer nginx

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
24e221e92a36: Pull complete 
58cc89079bd7: Pull complete 
3799b53049f3: Pull complete 
2a580edba2f4: Pull complete 
cfe7877ea167: Pull complete 
6f26751fc54b: Pull complete 
c98494bb3682: Pull complete 
Digest: sha256:2bdc49f2f8ae8d8dc50ed00f2ee56d00385c6f8bc8a8b320d0a294d9e3b49026
Status: Downloaded newer image for nginx:latest
4d16388a956dca7f49b4059d31d84512005653fc242f3720a723e82e64b69e68

 % docker volume ls
DRIVER    VOLUME NAME
local     5f349cb6b961a651e3b2ab8395dfa011e6e6a4284cb1a8d028b9c4b213d1805d
local     23af4fea9ed9bcbdcae9fe69228324bb27714363c3ce3e31e83260793e0fef17
local     testvolume

 % docker volume inspect testvolume
[
    {
        "CreatedAt": "2024-01-02T05:07:59Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/testvolume/_data",
        "Name": "testvolume",
        "Options": null,
        "Scope": "local"
    }
]

% docker run -d -v testvolume:/app/data --name testcontainer nginx
c9e06651da1b2b067a8ecfefefb18ae4f63b05b5b10197bce6e9721806199018

% docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
c9e06651da1b   nginx     "/docker-entrypoint.…"   56 seconds ago   Up 56 seconds   80/tcp     testcontainer
4d16388a956d   nginx     "/docker-entrypoint.…"   4 minutes ago    Up 4 minutes    80/tcp     mycontainer


% docker stop testcontainer
testcontainer
% docker stop mycontainer
mycontainer
% docker rm testcontainer
testcontainer
% docker rm mycontainer
mycontainer
% docker volume rm testvolume
testvolume

 

 

 

Bind Mounts

  • host file system의 특정 파일이나 디렉토리를 컨테이너의 파일 시스템에 마운트 하는 방법
+---------------------+      +----------------------+
|   호스트 시스템        |      |    Docker 컨테이너      |
|                     |      |                      |
|  /path/to/data      |      |  /app/data           |
|  (실제 데이터)         |      |  (마운트 포인트)        |
|                     |      |                      |
+---------------------+      +----------------------+

Mount(마운트)란?

저장된 데이터를 다른 위치(시스템,프로그램)에서 접근할 수 있도록 연결하는 과정

ex.

  1. 로그파일을 호스트의 ‘/var/log/myapp’에 저장
  2. 컨테이너의 ‘/app/log’에 마운트

→ /app/log는 마운트 포인트, 실제 호스트는 ‘/app/log’에 있지만 컨테이너는 마치 자신내부에 데이터가 있는것 처럼 ‘/app/log’를 통해 로그 파일에 접근,관리함

즉, ‘/app/log’ 경로로 접근시 실제 호스트 ‘/var/log/myapp’의 내용을 사용

로그파일의 실제 호스트는 ‘/var/log/myapp’에 쓰여짐

 

Bind Mounts 장점

데이터의 실제 저장 위치와 상관없이 다양한 시스템,프로그램 간에 데이터를 공유하고 접근할 수 있는 유연성을 얻을 수 있다.

 

Bind Mounts 사용 사례

  • 일반적인 경우, 가능하면 bind Mounts보다 volume을 사용하는게 좋다.
  • Docker Host 개발환경과 Container 간 소스코드 또는 빌드된 artifact를 공유
    1. Maven의 target/ 디렉토리를 Container에 Mount → Docker Host에서 Maven Project를 빌드할 때마다, Container에서 재 작성된 작성된 JAR/WAR에 접근
    2. 만약 bind mounts 사용한다면 Production-Ready 아티팩트를 Image에 직접 복사할 수 있다.

 

Bind Mounts VS Docker Volume

 
Volume Bind Mounts
관리 방식
Docker에 의해 관리
  • Docker CLI,API를 통해 생성,삭제,관리됨
사용자가 직접 host system file이나 디렉토리 관리
사용시
호스트 시스템의 Docker 저장소 디렉터리 내에 새 디렉터리가 생성되고 Docker는 해당 디렉터리의 콘텐츠를 관리
  • 호스트 파일 시스템 접근 : 호스트 시스템의 절대 경로를 사용해 특정 파일,디렉토리 지정
  • 컨테이너 내 위치 지정: 컨테이너 내부에서 해당 파일이나 디렉토리를 어디에 마운트할 것인지 위치 지정
Q. 컨테이너에 저장되면 컨테이너 삭제시 데이터도 삭제 되는가?
A. 컨테이너 내부에서 데이터를 보고 사용할 수 있지만, 실제 데이터는 호스트의 파일 시스템에 존재
ex.
  1. 로그파일을 호스트의 ‘/var/log/myapp’에 저장
  2. 컨테이너의 ‘/app/log’에 마운트
(해당 경로로 접근시 실제 호스트 ‘/var/log/myapp’의 내용을 사용)
  1. 로그파일의 실제 호스트는 ‘/var/log/myapp’에 쓰여짐

저장 위치
Docker가 설정한 특정 경로에 저장 사용자가 지정한 호스트 시스템의 어떤 경로에든 위치
장점
  • 데이터가 컨테이너가 삭제되어도 유지되어 재사용 가능
  • 데이터를 격리할 수 있고 백업이 가능해 보안이 중요시 사용
개발과정에서 실시간으로 데이터를 공유, 업데이트시 사용 (직접 마운트하고 직접 경로 설정을 하기 때문)
관련 코드   docker run -v /home/user/myapp:/var/www/html myimage

 

 

 

tmpfs Mounts

  • tmpfs(temp orary file system) 임시파일 저장 방식, 데이터를 영구 저장이 아닌 휘발성 메모리에 저장한다.

tmpfs Mounts 특징

  • tmpfs mounts를 사용하여 컨테이너 생성시 tmpfs 컨테이너는 컨테이너의 쓰기 가능한 레이어 외부에 파일을 생성 할 수 있음
  • volume, bind mounts와 다르게 tmpfs mounts는 일시적이며 호스트 메모리에만 지속되기 때문에 컨테이너 중지시 tmpfs가 제거되고 데이터도 제거된다.
  • 주로 호스트,Container writable layer에 유지하고 싶지 않은 민감한 파일을 임시로 저장하는데 유용하다.

Q. tmpfs mounts와 컨테이너의 쓰기 가능한 레이어(writable layer) 모두 컨테이너 삭제 시 데이터가 삭제되는데 무슨 차이가 있는건가?

A.

 

  tmpfs mounts container writable layer
  호스트 시스템의 메모리(램)에 데이터를 저장 디스크에 저장
장점
  • 기존 디스크에 저장하는 방법보다 더 빠르게 데이터 접근 할 수 있다.
  • 디스크에 저장된 레이어에는 컨테이너 실행 중에 생성되거나 변경되는 파일들이 저장된다.
특징 컨테이너가 중지/삭제되면 메모리에서 데이터가 사라짐 컨테이너가 삭제해야만 해당 레이어에 저장된 모든 데이터도 함께 삭제
(중지시 데이터 그대로 유지)
사용 방식 일시적 사용(세션 데이터,임시 파일 처리)
주로 민감함 데이터의 임시저장시 사용
일반적인 데이터 저장과 어플리케이션의 작업에 사용

 

tmpfs Mounts 제한사항

  • tmpfs mounts는 volume, bind mounts와 다르게 컨테이너 간에 마운트를 공유할 수 없다
  • Linux에서 Docker를 실행하는 경우에만 사용 할 수 있다.

 

 

*참고자료

https://docs.docker.com/storage/volumes/

https://docs.docker.com/storage/bind-mounts/

https://docs.docker.com/storage/tmpfs/

https://en.wikipedia.org/wiki/Tmpfs

https://medium.com/dtevangelist/docker-%EA%B8%B0%EB%B3%B8-5-8-volume%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-data-%EA%B4%80%EB%A6%AC-9a9ac1db978c

https://seosh817.tistory.com/374

https://velog.io/@hoplin/Docker-docker-volume

https://belowthemalt.com/2021/12/08/mount-volumes-to-persist-data-in-local-initialize-database-in-docker/

https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/storage.html

https://oertx.highered.texas.gov/courseware/lesson/2379/student/?section=5https://oertx.highered.texas.gov/courseware/lesson/2379/student/?section=5

따라하며 배우는 도커와 CI환경 강의

반응형

'DOCKER' 카테고리의 다른 글

[DOCKER] Docker compose에 nginx 적용기  (0) 2024.01.15
[DOCKER] Docker Compose  (0) 2024.01.08
[Docker] Docker 최적화  (0) 2023.12.28
[Docker] Docker Container2 - 코드로 보는 개념  (0) 2023.12.26
[Docker] Docker Image  (0) 2023.12.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함