#!/bin/bash
# 실습 #3 ② — 데이터 영속화 3종: 명명된 볼륨 / 바인드 마운트 / tmpfs
# - 컨테이너는 휘발성. "재시작·삭제 후에도 남아야 하는 데이터"는 반드시 볼륨에.
# - 명명 볼륨    : Docker 가 /var/lib/docker/volumes/ 아래 관리. 운영 권장.
# - 바인드 마운트: 호스트 경로 그대로 노출. 개발·설정 파일 주입에 편리.
# - tmpfs       : RAM. 비밀번호 같은 영속 안 돼야 할 데이터.
set -e

cleanup() {
    sudo docker rm -f web-named web-bind web-tmp 2>/dev/null || true
}
trap cleanup INT TERM EXIT

# 1) 명명된 볼륨
sudo docker volume create web-data >/dev/null
sudo docker run -d --name web-named \
    -v web-data:/usr/share/nginx/html \
    -p 8081:80 nginx:1.27

# 컨테이너 안에 페이지 한 줄 써넣기
sudo docker exec web-named sh -c 'echo "<h1>From Named Volume</h1>" > /usr/share/nginx/html/index.html'
echo "=== 명명 볼륨 ==="
curl -s http://localhost:8081

# 컨테이너 삭제 후 다시 만들어도 데이터 유지되는지 검증
sudo docker rm -f web-named >/dev/null
sudo docker run -d --name web-named -v web-data:/usr/share/nginx/html -p 8081:80 nginx:1.27
sleep 1
echo "→ 재생성 후 (같은 내용이면 영속화 성공)"
curl -s http://localhost:8081

# 2) 바인드 마운트 — 호스트 경로를 ro 로 노출
HOST_DIR=/tmp/lab_html
mkdir -p "$HOST_DIR"
echo "<h1>From Host Bind</h1>" > "$HOST_DIR/index.html"

sudo docker run -d --name web-bind \
    -v "$HOST_DIR":/usr/share/nginx/html:ro \
    -p 8082:80 nginx:1.27

sleep 1
echo
echo "=== 바인드 마운트 (ro) ==="
curl -s http://localhost:8082

# 호스트에서 파일 바꾸면 즉시 반영
echo "<h1>Edited On Host</h1>" > "$HOST_DIR/index.html"
echo "→ 호스트 파일 수정 후"
curl -s http://localhost:8082

# 3) tmpfs — RAM 마운트
sudo docker run -d --name web-tmp \
    --tmpfs /tmp:rw,size=64m \
    -p 8083:80 nginx:1.27

sleep 1
echo
echo "=== tmpfs ==="
sudo docker exec web-tmp sh -c 'echo HELLO > /tmp/x && cat /tmp/x'
sudo docker exec web-tmp df -h /tmp | tail -1

# 4) 볼륨 관리 명령
echo
echo "=== docker volume ls / inspect ==="
sudo docker volume ls | grep web-data
sudo docker volume inspect web-data --format '{{.Mountpoint}}'

# 5) 정리는 trap 이 처리. 볼륨 web-data 는 일부러 남겨둠.
echo
echo "→ 볼륨 web-data 는 남아 있음. 직접 정리:  docker volume rm web-data"
echo "→ 미사용 볼륨 일괄 정리:                 docker volume prune"
