볼륨이 필요한 이유
컨테이너는 삭제되면 내부 데이터도 사라집니다.
# ❌ 데이터가 컨테이너에 저장됨
docker run postgres
docker rm postgres # 데이터 사라짐!
# ✅ 볼륨에 저장
docker run -v postgres_data:/var/lib/postgresql/data postgres
docker rm postgres # 컨테이너 삭제
docker run -v postgres_data:/var/lib/postgresql/data postgres # 데이터 유지됨!
볼륨 종류
flowchart TB
subgraph TYPES["볼륨 종류"]
V1["Named Volume\n이름 있는 볼륨\n(권장)"]
V2["Bind Mount\n호스트 경로 직접 연결\n(개발 환경)"]
V3["tmpfs Mount\n메모리에만 저장\n(임시 데이터)"]
end
Named Volume
# 볼륨 생성
docker volume create my-data
# 볼륨 목록
docker volume ls
# 볼륨 상세
docker volume inspect my-data
# 볼륨 마운트
docker run -v my-data:/app/data my-app
# 볼륨 삭제 (컨테이너가 사용 중이 아닐 때)
docker volume rm my-data
# 사용하지 않는 볼륨 모두 삭제
docker volume prune
Bind Mount (개발 환경)
호스트 폴더를 컨테이너에 연결합니다. 코드 변경이 즉시 반영됩니다.
# 현재 폴더를 컨테이너 /app에 마운트
docker run -v $(pwd):/app -v /app/node_modules node:20 npm run dev
# docker-compose.yml에서
volumes:
- .:/app # 소스 마운트
- /app/node_modules # anonymous volume으로 덮어쓰기 방지
네트워크
flowchart LR
subgraph NET["Docker 네트워크"]
APP["app 컨테이너\n:3000"]
DB["db 컨테이너\n:5432"]
CACHE["cache 컨테이너\n:6379"]
end
OUTSIDE["외부\n브라우저"]
OUTSIDE -->|"localhost:3000"| APP
APP -->|"db:5432\n(컨테이너명으로 접속)"| DB
APP -->|"cache:6379"| CACHE
같은 네트워크의 컨테이너는 서비스명으로 통신합니다.
네트워크 설정
# 네트워크 생성
docker network create my-network
# 컨테이너를 네트워크에 연결
docker run --network my-network --name db postgres
docker run --network my-network --name app my-app
# app에서 db로 접속: host = "db"
# DATABASE_URL=postgresql://postgres:pass@db:5432/mydb
# 네트워크 확인
docker network ls
docker network inspect my-network
docker-compose.yml 네트워크
services:
app:
build: .
networks:
- frontend
- backend
db:
image: postgres:16
networks:
- backend # app과만 통신, 외부 접근 불가
nginx:
image: nginx
ports:
- "80:80"
networks:
- frontend # 외부 접근 허용
networks:
frontend:
backend:
internal: true # 외부 인터넷 차단
데이터 백업과 복원
# PostgreSQL 데이터 백업
docker compose exec db pg_dump -U postgres mydb > backup.sql
# 복원
docker compose exec -T db psql -U postgres mydb < backup.sql
# 볼륨 전체 백업 (tar)
docker run --rm \
-v postgres_data:/source \
-v $(pwd):/backup \
alpine tar czf /backup/postgres_backup.tar.gz -C /source .
# 복원
docker run --rm \
-v postgres_data:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/postgres_backup.tar.gz -C /target
정리
| 개념 | 설명 |
|---|---|
| Named Volume | 이름으로 관리되는 Docker 볼륨 |
| Bind Mount | 호스트 파일시스템 직접 연결 |
| 네트워크 | 컨테이너 간 격리된 통신 공간 |
| 서비스 디스커버리 | 같은 네트워크에서 이름으로 접속 |
다음 편에서는 Docker 실전 배포 — 레지스트리 푸시부터 프로덕션 배포까지를 배웁니다.