Infra/IaC

[Docker] docker volume 데이터 지속성 및 데이터 관리

jykim23 2023. 10. 26. 12:40

출처 : 패캠 gitops

 

Docker Volume

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

1. Bind mount

호스트에서 직접적인 관리된다.

docker run ~~ -v /host-volume:/app ~~

docker run ~~ --mount type=bind,source=/host-volume ~~ # 리눅스 mount와 유사

 

예시1 : redis 설치에 config 파일에 패스워드를 설정하여 그 파일을 바인트 마운트 한다.

예시2 : 파일 투 파일로 연동. 시간동기화: /etc/localtime (Dockerfile로 설정이 편하긴함)

 

 

2. docker volume

도커의 볼륨 드라이버로 도커가 관리함.(도커에서 권장하는 방법)

docker volume create my-volume

docker run ~~ -v my-volume:/app ~~

docker run ~~ --mount source=my-volume ~~

 

 

docker volume create mydb-data

docker volume inspect mydb-data

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=passwrod1 -e MYSQL_DATABASE=dockerdb -v mydb-data:/var/lib/mysql mysql:5.7-debian

sudo ls /var/lib/docker/volumes/mydb-data/_data

도커 호스트에서 mysql 컨테이너의 데이터 조회 가능

 

암시적 도커 볼륨 : 도커 볼륨 명시하지 않고 임의의 이름으로 마운트 된다.

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=passwrod1 -e MYSQL_DATABASE=dockerdb -v /var/lib/mysql mysql:5.7-debian

 

 

 

data container

--volumes-from : 여러 컨테이너가 데이터를 공유하기 위한 데이터 컨테이너

 

# 도커 볼륨

docker create -v /share-data --name=share-container ubuntu # 데이터 컨테이너는 실행하지 않고 생성만 한다.

docker run -it --rm --volumes-from share-container --name=data-1 ubuntu bash

echo data-1 > /share-data/share-test.txt # data-1컨테이너에서 파일 생성

docker run -it --rm --volumes-from share-container --name=data-2 ubuntu bash

cat /share-data/share-test.txt # data-1. 데이터 공유 확인.

docker rm share-container

 

# 바인딩 마운트

docker create -v $(pwd)/share-volume:/share-data --name=share-container ubuntu

docker run -it --rm --volumes-from share-container --name=data-1 ubuntu bash

echo data-1 > /share-data/share-test.txt # data-1컨테이너에서 파일 생성

docker run -it --rm --volumes-from share-container --name=data-2 ubuntu bash

cat /share-data/share-test.txt # data-1. 데이터 공유 확인.

docker rm share-container

 

읽기/쓰기 권한

--volumes-from share-container:ro # 읽기

--volumes-from share-container:rw # 읽기,쓰기(기본값)

 

3. tmpfs mount

메모리에 저장. 컨테이너 중지하면 데이터 소실.

docker run ~~ -tmpfs /var/www/html ~

docker run ~~ --mount type=tmpfs,destication=/var/www/html ~

 

 

 

데이터 컨테이너의 데이터 지속성 특징

1. DB데이터 지속성 및 업/다운그레이드

DB 데이터가 저장된 데이터 컨테이너를 다른 컨테이너에서 사용하면 온전히 사용 할 수 있다.

DB 종류와 버전에대한 호환은 당연히 안된다고 생각했지만 버전 호환은 가능하다!!

 

2. 컨테이너 log 확인

nginx,apache의 로그위치를 이용한다.

그럼 호스트에서 로그 확인가능. 게다가 호스트에서 로그를 파싱(shell script 등)할 수 있다.(=웹 로그 분석)

 

 

 

Volume 사용량 제한

 

docker run -it -v $(pwd)/myvolume:/webapp --name=mycontainer --storage-opt size=1G ubuntu bash

오류 : docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.

 

 

도커 호스트 pquota 설정

sudo vi /etc/default/grub

10 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=uquota,pquota"

sudo vi /etc/fstab

UUID=b~~~1 /var/lib/docker xfs defaults,pquota 0 0

sudo reboot

 

컨테이너 별 영역 제한

docker run -it -v $(pwd)/myvolume:/webapp --name=mycontainer --storage-opt size=1G ubuntu bash

df -h

Filesystem Size Used Avail Use% Mounted on 

overlay 1.0G 8.0K 1.0G 1% /

 

모든 컨테이너 영역 제한

sudo vi /etc/docker/daemon.json

{ "insecure-registries": ["192.168.56.101:5000"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "30m",
    "max-file": "10"
  },
  "storage-opts": ["overlay2.size=500m"]
}

 

docker run -it -v $(pwd)/myvolume:/webapp --name=mycontainer ubuntu bash

df -h

Filesystem Size Used Avail Use% Mounted on 

overlay 500M 8.0K 500M 1% /

 

bind mount 구성하여 컨테이너 영역 제한

sudo -s # 관리자 로그인. sudo su -

dd if=/dev/zero of=tmpdisk.img count=512 bs=1M # zero로 채워진 512M 크기의 파일(영역) 생성

mkfs.xfs tmpdisk.img # xfs 파일시스템 포멧

fdisk -l tmpdisk.img # 파일시스템 조회

 

mkdir -p /home/{사용자}/volume-quota 

mount -o loop tmpdisk.img /home/{사용자}/volume-quota # 마운트

df -h # 마운트 조회

/dev/loop18 507M 30M 478M 6% /home/{사용자}/volume-quota

chown -R {사용자}.{사용자} /home/{사용자}/volume-quota # 파일 소유자 변경

exit # 관리자 로그아웃

docker run -it -v /home/{사용자}/volume-quota:/webapp --name=myvolume ubuntu bash

df -h # /webapp 의 크기가 도커 호스트에서 조회한 내용과 같으면 성공

 

 

 

현재 Docker Host 가 proxmox CT ubuntu 이미지를 사용하고 있는데 ext4라서 지원이 안된다...

VM으로 도커 서버를 다시 구성하거나 다른 방법이 필요하다. 실습 없이 명령어라도 작성한다...

 

 

 


'Infra > IaC' 카테고리의 다른 글

[Docker] compose  (0) 2023.10.26
[Docker] Dockerfile 경량화  (0) 2023.10.26
[Docker] 리소스 모니터링과 자원 할당 관리  (0) 2023.10.24
[Docker] Network 관리  (2) 2023.10.20
[Docker] 컨테이너 운용에 필요한 CLI  (0) 2023.10.17