Docker Volume

  • Docker Volume은 데이터를 저장하고 관리하는 Docker의 기본 메커니즘 중 하나입니다.
  • 컨테이너와 독립적으로 데이터를 보존하며, 컨테이너 삭제 시에도 데이터가 유지됩니다.
  • 여러 컨테이너에서 데이터를 안전하게 공유하거나 관리할 때 사용됩니다.

Volume 사용 이유

이유 설명
데이터 영속성 컨테이너 삭제 후에도 데이터 유지 가능.
여러 컨테이너 간 데이터 공유 동일한 볼륨을 사용하여 여러 컨테이너가 데이터를 공유 가능.
데이터 백업 및 이동 용이 볼륨 데이터를 다른 시스템으로 쉽게 옮기거나 백업 가능.
성능 향상 많은 데이터를 처리할 때 성능 개선(Mac/Windows에서 특히 효과적).
데이터 안전성 데이터를 컨테이너 외부에 보관하여 데이터 손실 방지.
코드와 데이터의 분리 애플리케이션 코드와 데이터를 분리하여 유지보수 용이.

Docker Volume 유형

유형 설명 특징
Volume Docker가 자체적으로 관리하는 데이터 저장소. /var/lib/docker/volumes/에 저장. 여러 컨테이너 간 안전하게 데이터 공유 가능.Docker CLI로 관리 가능.
Bind Mount 호스트 시스템의 특정 파일/폴더를 컨테이너에 연결. 호스트 파일 경로를 직접 지정.Docker CLI 외 직접 접근 가능.데이터 관리에 주의 필요.
tmpfs Mount 데이터를 컨테이너 메모리에 저장. 빠른 속도 제공.컨테이너 종료 시 데이터 소멸.일시적인 데이터 저장에 적합.

Docker Volume의 장단점

장점 단점
컨테이너 삭제 후에도 데이터 유지 가능. 호스트 시스템 경로(/var/lib/docker/volumes)에 저장되므로 직접 접근이 제한적.
여러 컨테이너 간 안전하게 데이터 공유. 데이터 저장 위치를 명시적으로 지정하려면 Bind Mount 사용 필요.
백업 및 복원 용이. Volume 관리 및 모니터링에 익숙해져야 함.
Docker CLI를 통해 관리 가능. 기본 설정으로는 볼륨 데이터 암호화 및 보안 기능 미비(추가 설정 필요).
Mac/Windows 환경에서 기본 저장 방식보다 더 빠름. Volume 삭제 시 데이터 손실 가능(삭제 전 백업 필수).

Docker Volume 명령어

명령어 설명
docker volume create my-volume 이름이 my-volume인 볼륨 생성.
docker volume ls 현재 Docker에서 관리 중인 모든 볼륨 리스트 출력.
docker volume inspect my-volume 특정 볼륨(my-volume)의 상세 정보 확인.
docker volume rm my-volume 특정 볼륨 삭제.
docker run -v my-volume:/data 컨테이너 실행 시 my-volume을 /data 경로에 마운트.

Docker Compose에서 볼륨 설정

  • Compose 파일에서 서비스별로 볼륨을 설정할 수 있습니다.
version: "3.8"
services:
  app:
    image: myapp:latest
    volumes:
      - my-volume:/data
volumes:
  my-volume:

부가적으로 알아야 할 정보

  1. 볼륨 드라이버:
    • 기본적으로 Docker의 local 드라이버 사용.
    • NFS, AWS EBS 등 외부 저장소와 통합하려면 특정 볼륨 드라이버 설정 필요.
  2. Bind Mount와 비교:
    • Bind Mount는 호스트 경로를 직접 사용하므로 관리가 어렵지만, 특정 파일을 사용할 때 유용.
    • Volume은 Docker에서 관리하며, 안정성과 유연성이 뛰어남.
  3. 볼륨 보안:
    • 기본적으로 볼륨 데이터는 암호화되지 않음. 민감한 데이터는 추가적인 보안 설정 필요.
  4. 성능 최적화:
    • 데이터가 많거나 빈번히 접근하는 경우, 볼륨을 사용하는 것이 더 효율적.

8. 사용 사례

  • 데이터베이스 컨테이너:
    • 데이터를 영구적으로 저장하기 위해 볼륨 사용.
  • 여러 컨테이너가 동일한 데이터 공유:
    • 웹 서버와 애플리케이션 컨테이너가 동일한 볼륨 사용.
  • 백업 및 복구:
    • 중요한 데이터를 볼륨에 저장하여 백업 및 복구 작업 간소화.

더보기

상세 설명

 

Docker Volume, Bind Mount, tmpfs Mount 정리


1. Docker Volume

볼륨이란?

  • 볼륨은 Docker가 관리하는 폴더로, 데이터를 안전하게 저장하고 보존할 수 있는 저장소입니다.
  • 일반적으로 /var/lib/docker/volumes/ 경로에 저장됩니다.

볼륨의 장점

  1. 백업과 이동이 편리:
    • 데이터를 다른 시스템으로 쉽게 옮기거나 백업 가능.
  2. Docker 명령어로 관리 가능:
    • CLI 명령어나 API를 통해 간단히 관리 가능.
  3. 운영체제에 구애받지 않음:
    • 리눅스, 윈도우 등 어떤 환경에서도 작동.
  4. 여러 컨테이너에서 데이터 공유:
    • 동일한 볼륨을 사용해 여러 컨테이너에서 안전하게 데이터 공유 가능.
  5. 볼륨 드라이버 확장성:
    • NFS, 클라우드 저장소 등 다양한 외부 드라이버와 통합 가능.
  6. Mac/Windows에서 성능 향상:
    • 기본 저장 방식보다 더 빠르게 동작.

2. Bind Mount

바인드 마운트란?

  • 호스트 시스템의 특정 폴더나 파일을 컨테이너 내부로 연결.
  • 지정된 호스트 파일 경로를 컨테이너에서 직접 사용.

특징 및 사용 사례

  1. 호스트와 컨테이너 간 파일 동기화:
    • 컨테이너에서 수정한 파일이 호스트에도 바로 반영.
  2. 절대 경로 사용:
    • 호스트의 파일 또는 디렉토리를 절대 경로로 지정해야 함.
  3. 개발 환경에서 유용:
    • 소스 코드의 실시간 동기화가 필요한 개발 작업에 적합.

3. tmpfs Mount

tmpfs 마운트란?

  • 컨테이너에서 메모리를 사용해 데이터를 임시로 저장.
  • 컨테이너 종료 시 데이터도 사라짐.

특징 및 사용 이유

  1. 일시적인 데이터 저장:
    • 로그, 캐시 등 영구 저장이 필요 없는 데이터를 처리.
  2. 파일 시스템 대신 메모리 사용:
    • 디스크가 아닌 메모리를 사용해 빠른 속도 제공.
  3. 데이터 공유 불가:
    • 컨테이너 내부에서만 데이터 사용 가능.
  4. 성능 향상:
    • 빠른 데이터 읽기/쓰기 성능 제공.

Docker Volume, Bind Mount, tmpfs Mount 비교

항목  Volume Bind Mount tmpfs Mount
주 저장소 위치 Docker가 관리하는 /var/lib/docker/volumes/ 사용자가 지정한 호스트 파일/폴더의 절대 경로 메모리
영속성 컨테이너 삭제 후에도 데이터 유지 컨테이너 삭제 후에도 데이터 유지 컨테이너 종료 시 데이터 삭제
관리 방식 Docker CLI 또는 API 호스트 파일/폴더 직접 관리 Docker CLI로 관리
데이터 공유 여러 컨테이너에서 공유 가능 여러 컨테이너에서 공유 가능 컨테이너 내부에서만 사용
성능 일반적인 경우 적합 데이터 실시간 동기화가 필요할 때 적합 빠른 데이터 처리 성능
사용 사례 데이터베이스, 설정 파일, 영구 데이터 저장 개발 환경에서 소스 코드 실시간 동기화 임시 데이터 처리, 캐시, 로그

부가적으로 알아야 할 정보

  1. 볼륨 드라이버:
    • 기본적으로 Docker는 local 드라이버를 사용.
    • 외부 드라이버를 통해 클라우드 저장소(NFS, AWS EFS 등)와 통합 가능.
  2. 권장 사용:
    • Docker 공식 문서에서는 Volume을 가장 추천.
    • Mac/Windows 환경에서 볼륨을 사용하면 성능이 더 좋음.
  3. 보안:
    • Volume은 호스트 시스템 경로를 숨기므로 보안성이 높음.
    • Bind Mount는 호스트 파일이 노출되므로 보안 위험에 주의.
  4. Docker Compose 설정:
    • Volume, Bind Mount, tmpfs를 Docker Compose 파일에서 설정 가능:
      services:
        app:
          volumes:
            - my-volume:/data
          tmpfs:
            - /tmp
      

장단점 요약

  장점 단점
Volume 데이터 공유 및 관리 용이.Docker CLI로 관리 가능. 저장 위치가 호스트 시스템에서 가려짐.
Bind Mount 호스트 파일/폴더 실시간 동기화 가능.호스트 경로 직접 지정 가능. 보안성이 낮음.Docker CLI로 관리 불가능.
tmpfs Mount 빠른 데이터 처리.일시적인 데이터 처리에 적합. 컨테이너 종료 시 데이터 삭제.컨테이너 간 데이터 공유 불가.

Docker Volume 사용 이유

  1. 데이터를 안전하고 영구적으로 보존.
  2. 여러 컨테이너 간 데이터를 공유.
  3. 데이터를 쉽게 백업하고 복구.
  4. Docker CLI로 간편하게 관리 가능.
  5. 성능과 보안이 요구되는 환경에 적합.

 

Docker Volume 실습

1. 데이터 영속성 실습

예제 코드

# 1. 볼륨 생성
docker volume create datavol

# 2. 볼륨 리스트 확인
docker volume ls

# 3. Alpine 컨테이너에서 볼륨 사용
docker container run -ti --rm -v datavol:/data alpine

# 4. 컨테이너 내부에서 파일 생성
echo "볼륨 데모" > /data/demo.txt
exit

# 5. 볼륨 데이터 확인
docker container run --rm -v datavol:/data ubuntu cat /data/demo.txt

# 6. 호스트 머신에서 디렉토리 구조 확인
sudo apt update; sudo apt install -y tree
sudo tree -a /var/lib/docker/volumes/datavol

볼륨 정보 확인

docker volume inspect datavol

2. 암시적 볼륨 마운트 실습

예제 코드

# 1. MySQL 컨테이너 실행
docker run -d --name mysqltest -v /var/lib/mysql mysql:latest

# 2. 컨테이너 정보 확인
docker inspect mysqltest | jq .[].Mounts

# 3. 볼륨 리스트 확인
docker volume ls

3. Bind Mount 실습

디렉토리 마운트

# 1. 호스트 머신에서 디렉토리 생성
cd ~
mkdir test-app
cd test-app
touch run.sh
chmod +x ./run.sh

# 2. Bind Mount 컨테이너 실행
docker run -ti --rm -v .:/app alpine

# 3. 컨테이너 내부에서 파일 확인
cd /app
ls -ahlvF

Read-Only 및 Read-Write 마운트

# 1. Read-Only 및 Read-Write 디렉토리 생성
mkdir ~/readonly
mkdir ~/readwrite

# 2. 컨테이너 실행
docker run -ti \
-v ~/readonly:/readonly:ro \
-v ~/readwrite:/readwrite:rw \
ubuntu

# 3. 컨테이너 내부에서 파일 쓰기 테스트
echo "test" > /readonly/readonly.txt  # 파일 쓰기 불가
echo "test" > /readwrite/readwrite.txt  # 파일 쓰기 가능
exit

# 4. 호스트 머신에서 파일 확인
cat ~/readwrite/readwrite.txt

4. MySQL 데이터 보존 실습

MySQL 컨테이너 실행

docker run -ti --rm -d \
--name mysqltest \
-e MYSQL_ROOT_PASSWORD=123! \
-e MYSQL_DATABASE=mysqltest \
-v ~/mysqldata:/var/lib/mysql \
mysql:latest

MySQL 서버 접속 및 데이터 입력

# 1. 컨테이너 내부에서 MySQL 접속
docker exec -ti mysqltest /bin/bash
mysql -h localhost -u root -p

# 2. MySQL 명령 실행
show databases;
use mysqltest;
create table mysqltest(id int, name varchar(50));
insert into mysqltest values(1, 'testname');
select * from mysqltest;

# 3. 데이터 확인 후 종료
exit

데이터 파일 확인

# 1. 컨테이너 내부 데이터 확인
ls -ahlvF /var/lib/mysql/mysqltest

# 2. 호스트 머신에서 데이터 확인
ls -ahlvF ~/mysqldata/mysqltest

다른 컨테이너에서 동일 데이터 사용

# 1. 기존 컨테이너 중지
docker stop mysqltest

# 2. 새 컨테이너 실행
docker run -ti --rm -d \
--name mysqltest2 \
-e MYSQL_ROOT_PASSWORD=123! \
-e MYSQL_DATABASE=mysqltest \
-v ~/mysqldata:/var/lib/mysql \
mysql:latest

# 3. 새 컨테이너에서 데이터 확인
docker exec -ti mysqltest2 /bin/sh
mysql -h localhost -u root -p
use mysqltest;
select * from mysqltest;

환경 변수 확인


5. 실습 요약

실습 내용
데이터 영속성 볼륨을 생성하고 데이터가 컨테이너 종료 후에도 유지되는지 확인.
암시적 볼륨 마운트 MySQL 컨테이너를 실행하고, Docker가 자동으로 생성한 볼륨 확인.
Bind Mount 호스트 디렉토리와 컨테이너 디렉토리 연결.
Read-Only/Read-Write 마운트 읽기 전용과 읽기/쓰기 가능한 디렉토리 연결 테스트.
MySQL 데이터 보존 MySQL 데이터를 볼륨에 저장하고, 컨테이너 종료 후에도 동일 데이터를 다른 컨테이너에서 확인.

부가적으로 알아야 할 정보

  1. docker volume 명령어:
    • docker volume create <이름>: 새 볼륨 생성.
    • docker volume ls: 볼륨 목록 표시.
    • docker volume inspect <이름>: 볼륨 세부 정보 확인.
    • docker volume rm <이름>: 특정 볼륨 삭제.
  2. MySQL 환경 변수:
    • MySQL 컨테이너 실행 시 사용할 수 있는 환경 변수는 Docker Hub의 공식 문서를 참고.
  3. Bind Mount와 Volume 차이:
    • Bind Mount는 호스트 경로를 직접 연결, 파일 동기화에 적합.
    • Volume은 Docker에서 관리, 데이터 영속성 및 백업에 적합.

 

'Docker > Docker' 카테고리의 다른 글

[Docker] Docker Network  (0) 2025.02.06
[Docker] Docker 모니터링&로깅  (0) 2025.02.04
[Docker] Docker Compose  (0) 2025.02.03
[Docker] Dockerfile  (1) 2025.02.01
[CI/CD] Github Actions CI  (0) 2025.01.31

+ Recent posts