티스토리 뷰
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
- 컨테이너 상에서 볼륨을 영구적으로 사용할 수 있는 방법은 세가지가 있다.
- Docker Volume
- Bind Mounts
- 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.
- 로그파일을 호스트의 ‘/var/log/myapp’에 저장
- 컨테이너의 ‘/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를 공유
- Maven의 target/ 디렉토리를 Container에 Mount → Docker Host에서 Maven Project를 빌드할 때마다, Container에서 재 작성된 작성된 JAR/WAR에 접근
- 만약 bind mounts 사용한다면 Production-Ready 아티팩트를 Image에 직접 복사할 수 있다.
Bind Mounts VS Docker Volume
|
Volume | Bind Mounts |
관리 방식
|
Docker에 의해 관리
|
사용자가 직접 host system file이나 디렉토리 관리 |
사용시
|
호스트 시스템의 Docker 저장소 디렉터리 내에 새 디렉터리가 생성되고 Docker는 해당 디렉터리의 콘텐츠를 관리 |
A. 컨테이너 내부에서 데이터를 보고 사용할 수 있지만, 실제 데이터는 호스트의 파일 시스템에 존재 ex.
|
저장 위치
|
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://seosh817.tistory.com/374
https://velog.io/@hoplin/Docker-docker-volume
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 |