Docker Compose 환경에서 Container를 운영할 때 중요한 부분 중 하나는 데이터가 어디에 저장되고 어떻게 관리되는지 이해하는 것입니다.
많은 사용자가 처음 Docker를 사용할 때 다음과 같은 문제를 경험합니다.
Container 삭제
↓
파일 삭제
↓
Database 데이터 손실
이유는 Container 내부 저장 공간은 영구 저장소가 아니기 때문입니다.
Docker의 기본 구조:
Host Server
↓
Docker Engine
↓
Container
↓
Container 내부 파일 시스템
Container는 Image를 기반으로 생성되며 실행 중 변경된 데이터는 Container Layer에 저장됩니다.
하지만 Container를 삭제하면 해당 데이터도 함께 사라집니다.
그래서 Docker에서는 데이터를 관리하기 위해 다음 저장 방식을 사용합니다.
- Container Writable Layer
- Volume
- Bind Mount
- tmpfs Mount
이번 글에서는 Docker Compose Storage 구조와 각 저장 방식의 차이, 실제 서버 운영에서 어떤 방식을 선택해야 하는지 자세히 알아보겠습니다.
Docker Container Storage 기본 구조
Docker Container는 여러 Layer로 구성됩니다.
구조:
Docker Image
↓
Image Layer
↓
Container Writable Layer
↓
Application 실행
Image Layer:
읽기 전용(Read Only)
Container Layer:
쓰기 가능(Read Write)
예:
Nginx Image
↓
Nginx Container
↓
로그 파일 생성
로그 파일은 Container Layer에 저장됩니다.
하지만:
Container 삭제
↓
Container Layer 삭제
↓
데이터 삭제
됩니다.
Docker Storage 방식 종류
Docker는 크게 4가지 저장 방식을 제공합니다.
1. Container Layer
Container 내부 임시 저장 공간입니다.
구조:
Container
↓
Writable Layer
특징:
- 빠른 테스트 가능
- 별도 설정 필요 없음
- 영구 저장 불가
사용:
개발 테스트 환경
운영 환경에서는 권장하지 않습니다.
2. Docker Volume
가장 일반적인 데이터 저장 방식입니다.
구조:
Docker Volume
↓
Container 연결
↓
데이터 저장
예:
services:
database:
image: mysql
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
특징:
- Docker가 관리
- Container 삭제 후 유지
- Database 운영 적합
사용:
- MySQL
- PostgreSQL
- Redis
- MongoDB
3. Bind Mount
Host 서버 폴더를 Container와 직접 연결합니다.
구조:
Host Directory
↓
Container Directory
예:
services:
app:
image: node
volumes:
- ./src:/app/src
특징:
- Host에서 파일 수정 가능
- 개발 환경 편리
- 설정 파일 관리 용이
사용:
- 개발 환경
- Config 파일
- Source Code
4. tmpfs Mount
메모리에 데이터를 저장하는 방식입니다.
구조:
RAM
↓
Container
특징:
- 디스크 저장 안 함
- 빠른 속도
- Container 종료 시 삭제
사용:
- 임시 데이터
- 보안 데이터
Volume과 Bind Mount 차이
| 구분 | Volume | Bind Mount |
|---|---|---|
| 관리 주체 | Docker | Host |
| 저장 위치 | Docker 영역 | 사용자 지정 폴더 |
| 관리 편의성 | 높음 | 낮음 |
| Database | 추천 | 비추천 |
| 개발 환경 | 가능 | 추천 |
운영 서버:
Database
↓
Volume 사용
개발 서버:
Source Code
↓
Bind Mount 사용
Docker Compose Storage 구조 확인하기
Container Mount 확인:
docker inspect container-name
확인:
Mounts
↓
Type
↓
Source
↓
Destination
예:
Type: volume
Source: mysql-data
Destination: /var/lib/mysql
Docker Compose Volume 저장 위치
Docker Volume은 Docker가 관리합니다.
확인:
docker volume inspect mysql-data
결과:
Mountpoint:
/var/lib/docker/volumes/mysql-data/_data
구조:
Docker Volume
↓
Host Disk
↓
Database File
Docker Compose Storage와 Database 운영
Database는 Storage 설계가 매우 중요합니다.
잘못된 구조:
MySQL Container
↓
Container 내부 저장
↓
Container 삭제
↓
데이터 손실
올바른 구조:
MySQL Container
↓
Docker Volume
↓
Database Data
↓
Backup
Production 구조:
Application Container
↓
Database Container
↓
Volume
↓
Backup Storage
Docker Compose Storage와 로그 관리
Container 로그도 저장 방식이 중요합니다.
기본:
Container 로그
↓
Docker Engine
문제:
- 로그 증가
- 디스크 부족
운영에서는:
- Log Rotation
- 외부 Logging System
- 별도 Storage
를 사용합니다.
Docker Compose Storage 용량 확인
Docker 전체 사용량 확인:
docker system df
Volume 확인:
docker volume ls
상세:
docker system df -v
확인:
- Image 사용량
- Container 사용량
- Volume 사용량
Docker Compose Storage 정리 방법
사용하지 않는 Volume 확인:
docker volume ls
미사용 Volume 삭제:
docker volume prune
주의:
삭제된 Volume
↓
복구 불가
중요 데이터 확인 후 실행해야 합니다.
Docker Compose Production Storage 설계
실제 서버에서는 데이터를 역할별로 분리합니다.
예:
Web Server
↓
Container
Application
↓
Container
Database
↓
Volume
Backup
↓
External Storage
권장 구조:
Server
├── Container
├── Volume
├── Backup
└── Logs
Docker Compose Storage Best Practice
운영 환경 추천:
데이터:
- Database → Named Volume
- Upload 파일 → Volume 또는 Object Storage
- Config → Bind Mount
- Secret → Secret 관리
관리:
- 정기 Backup
- Volume 모니터링
- Disk 용량 확인
- 불필요 데이터 정리
Docker Compose Storage 장애 대응
데이터가 사라진 경우
확인:
docker volume ls
Volume 존재 여부 확인
Container는 실행되는데 데이터 없음
확인:
docker inspect container-name
Mount 설정 확인
Disk 부족 문제
확인:
docker system df
정리:
docker system prune
주의:
Production에서는 삭제 대상 확인 필요
자주 묻는 질문
Container 내부 저장과 Volume 차이는 무엇인가요?
Container 내부 저장은 삭제 시 사라지고 Volume은 별도로 유지됩니다.
Database는 왜 Volume을 사용하나요?
Container를 재생성해도 데이터를 유지하기 위해 사용합니다.
Bind Mount는 운영 서버에서 사용하면 안 되나요?
사용 가능하지만 데이터 관리와 권한 문제가 발생할 수 있어 목적에 맞게 선택해야 합니다.
Docker Volume은 어디에 저장되나요?
기본적으로 Docker가 관리하는 Host 영역에 저장됩니다.
마무리
Docker Compose Storage 구조를 이해하면 Container 운영에서 발생하는 데이터 손실 문제를 예방할 수 있습니다.
Container는 쉽게 생성되고 삭제되지만 데이터는 별도의 Storage 영역에서 관리해야 합니다.
Production 서버에서는 Docker Compose, Volume, Backup 구조를 함께 설계하는 것이 안정적인 운영의 기본입니다.
다음 글에서는 Docker Compose 환경에서 중요한 데이터 보호 과정인 Volume 백업과 복원 전략을 자세히 알아보겠습니다.