본문 바로가기

GitOps/Docker

[Docker] 도커 스토리지

도커 스토리지

관련 명령어

  • docker container inspect --format "{{ json .Mounts }}" <name> |  jq: 컨테이너에 마운트된 스토리지 정보 확인

Docker Volume

  • 일반적으로 사용되는 도커 스토리지
  • Docker에서 관리
  • CLI로 명시적 관리 가능
  • 호스트 파일 시스템 구조에 의존 X
  • Linux OS의 경우 /var/lib/docker/volumes에 저장됨
  • 처음 마운트할 때는 host 디렉토리를 container에 덮어 씀.
  • 마이그레이션에 적합

관련 명령어

  • docker volume create: 볼륨 생성. --name 옵션으로 이름 부여 가능
  • docker volume inspect <name>: 볼륨 상세 정보 표시
  • docker volume ls: 도커 볼륨 목록 확인
  • docker volume prune: 사용하지 않는 모든 로컬 볼륨 제거
  • docker volume rm <name_list>: 한개 이상의 볼륨 제거
  • docker container run -v <container path> <image> <cmd> <args>: docker volume을 런타임에 정의
  • docker container run -v <volume name>:/<container path> <image> <cmd> <args>: 특정 volume을 컨테이너에 마운트
  • docker run --mount <세부설정들> <이미지>: -v 옵션 대신 mount 옵션을 사용하여 더 세밀한 설정 가능

Runtime Volume Definition 실습

# 런타임에 볼륨 정의 및 연결
docker container run --name html -d -v /usr/share/nginx/html nginx

# mount 정보 확인
docker container inspect --format "{{ json .Mounts }}" html | jq

# 확인 가능
sudo ls /var/lib/docker/volumes/b30ff531c06732327d55d136331658ee3d273127f5f4e6b91d5e54d61a354f5a/_data

Volume API 실습

# 이름이 html인 volume 생성
docker volume create --name html

# docker volume 확인
docker volume ls

# volume 상세 정보 확인 (Mountpoint가 로컬 위치)
docker voluem inspect html

# 마운트 후 컨테이너 생성
docker container run -d -p 8080:80 -v html:/usr/share/nginx/html nginx

# host에서 마운트 확인
# /usr/share/nginx/html은 nginx 이미지에서 기본 제공하는 파일이 첨부됨
sudo ls /var/lib/docker/volumes/html/_data

# host에서 index.html 수정
sudo vi /var/lib/docker/volumes/html/_data/index.html

# 8080포트로 확인하면 수정사항 반영

Docker Bind Mount

  • Docker Volume보다 제한적
  • 호스트 파일 시스템 가용성에 의존
  • 컨테이너를 실행할 때 생성 가능
  • 처음 마운트할 때는 host 디렉토리를 container에 덮어 씀.
  • 실시간 데이터 저장에 적합

관련 명령어

  • docker container run -v  <host path>:<container path> <image> <cmd> <args>: -v옵션으로 host path와 container path를 연결
  • docker run --mount type=bind,<기타옵션> <이미지>: --mount 옵션 사용

Bind Mount 실습

# host의 /tmp와 container의 /data를 bind mount
docker container run -it -v /tmp:/data alpine /bin/sh

# host의 tmp 내부와 동일한지 확인
ls /data

tmpfs Mount

  • 데이터가 호스트의 메모리(RAM)에 쓰여짐
  • 빠르게 접근 가능
  • Disk I/O 부하 감소
  • 컨테이너가 중지되면 삭제됨

관련 명령어

  • docker run --tmpfs <경로> <이미지>: 컨테이너 내부의 경로를 tmpfs mount
  • docker run --mount type=tmpfs,<기타옵션> <이미지>: --mount 옵션 사용

번외 실습

Docker의 독립성 실습

# alpine 이미지 컨테이너화
docker container run --name test alpine sh

# /data/hello.txt 빈 파일 생성
mkdir /data && cd /data && touch hello.txt

exit

# GraphDriver를 키로 갖는 세부 정보 확인
docker container inspect --format "{{ json .GraphDriver }}" test | jq

# 확인한 정보에서 UpperDir 경로 확인
sudo ls /var/lib/docker/overlay2/acec68d3fb22975e7c02ec9da492f7ccfe5e440db4d4a7bd8e5dca16e6b3c5a0/diff/data

# 삭제 후 재확인. 경로가 존재하지 않음을 확인 가능
docker container rm test
sudo ls /var/lib/docker/overlay2/acec68d3fb22975e7c02ec9da492f7ccfe5e440db4d4a7bd8e5dca16e6b3c5a0/diff/data

Dockerfile을 통한 Default Volume 실습

# Dockerfile

# alpine 이미지
FROM nginx

# -v로 명시하지 않으면 /data 경로와 docker volume 연결
VOLUME ["/data"]

 

# 위의 dockerfile을 사용하여 이미지 빌드
docker image build -t volume_nginx .

# 컨테이너화
docker container run --name vn -d volmue_nginx

# 컨테이너 내 도커 볼륨과 연결된 /data에 빈 hello.txt 생성
docker container exec -d vn /bin/sh
touch /data/hello.txt
exit

# Mount source 확인
docker container inspect -f "{{ json .Mounts }}" vn | jq

# hello.txt 확인
sudo ls /var/lib/docker/volumes/86859c38d4eeffb950c3a907e9bfdfb8ce8d81bcc47c5663a64da4cf4b6f120c/_data

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

[Docker] 도커 네트워크  (0) 2025.01.12
[Docker] 웹사이트 배포  (0) 2025.01.12
[Docker] 이미지  (0) 2025.01.11
[Docker] 컨테이너  (0) 2025.01.10
[Docker] 개념  (0) 2025.01.09