DockerDocker 기초 · 4기초

볼륨과 네트워크 — 데이터 영속성과 컨테이너 통신

Docker볼륨네트워크데이터영속성컨테이너통신

볼륨이 필요한 이유

컨테이너는 삭제되면 내부 데이터도 사라집니다.

# ❌ 데이터가 컨테이너에 저장됨
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 실전 배포 — 레지스트리 푸시부터 프로덕션 배포까지를 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.