docker-compose PostgreSQL DB 백업 및 복원
PostgreSQL Docker Compose 환경에서 DB 백업 및 복원 방법
PostgreSQL을 Docker Compose로 운영할 때 DB를 백업하고 복원하는 방법은 크게 두 가지로 나눌 수 있습니다.
- Docker 컨테이너 내에서 직접
pg_dump
와pg_restore
사용 - Docker 컨테이너 외부에서
docker-compose exec
를 통해 명령 실행
두 방법 모두 장단점이 있으므로 상황에 맞게 선택하여 사용하시면 됩니다.
1. 백업 방법
1-1. Docker 컨테이너 내에서 직접 백업
이 방법은 Docker 컨테이너 쉘에 접속하여 백업 명령어를 실행하는 것입니다. 아래의 명령으로 PostgreSQL 컨테이너 쉘에 접속합니다.
docker-compose exec [서비스_이름] bash
[서비스_이름]
은 docker-compose.yml
파일에 정의된 PostgreSQL 서비스 이름입니다 (예: db
, postgres
). 컨테이너에 접속 후 아래의 명령으로 DB를 백업합니다.
pg_dump -U [유저_이름] -d [데이터베이스_이름] > /backup/[백업_파일명].sql
-U [유저_이름]
: 데이터베이스 사용자 이름 (예:postgres
).-d [데이터베이스_이름]
: 백업할 데이터베이스 이름.
/backup/[백업_파일명].sql
: 백업 파일을 저장할 경로와 파일명.
컨테이너의 backup폴더를 docker-compose가 실행되는 클라이언트 컴퓨터의 backup폴더와 연결됩니다. backup 볼륨을 추가한 아래의 예시를 참고하세요.
docker-compose 예시파일
services:
db:
image: postgres:14
volumes:
- ./data:/var/lib/postgresql/data
- ./backup:/backup # 백업 디렉토리 마운트
/backup
디렉토리는 컨테이너 내부에 있어야 합니다. 영구적인 백업을 위해 docker-compose.yml
에 볼륨을 마운트하여 호스트와 컨테이너 간에 공유하는 것이 좋습니다.
1-2. Docker Compose 외부에서 백업
이 방법은 호스트 OS에서 docker-compose exec
명령어를 사용하여 컨테이너 내의 pg_dump
를 실행하고 결과를 호스트로 바로 저장하는 방법입니다. pg_dump
명령을 이용해서 DB파일을 backup
폴더로 백업합니다.
docker-compose exec [서비스_이름] \
\
pg_dump -U [유저_이름] \
-d [데이터베이스_이름] > ./backup/[백업_파일명].sql
./backup/[백업_파일명].sql
: 호스트 OS의 현재 디렉토리 아래 backup
폴더에 백업 파일이 생성됩니다. 이 방법은 별도의 볼륨 설정 없이도 호스트에 바로 백업 파일을 생성할 수 있어 편리합니다.
2. 복원 방법
복원 방법도 백업과 유사하게 두 가지로 나눌 수 있습니다. 복원을 진행하기 전에 복원할 데이터베이스가 존재해야 합니다.
2-1. Docker 컨테이너 내에서 직접 복원
docker cp
명령어를 사용하여 호스트의 백업 파일을 컨테이너 내부로 복사합니다.
docker cp ./backup/[백업_파일명].sql [컨테이너_이름]:/tmp/
[컨테이너_이름]
은 docker-compose ps
명령어로 확인할 수 있습니다 (예: myproject_db_1
). /tmp/
는 컨테이너 내 임시 디렉토리입니다. 아래의 명령으로 PostgreSQL 컨테이너 쉘에 접속합니다.
docker-compose exec [서비스_이름] bash
복사한 파일을 psql
이용하여 복원합니다. 아래의 명령을 이용해서 /tmp
폴더로 복사한 DB 백업을 데이터베이스에 적용할 수 있습니다.
psql -U [유저_이름] -d [데이터베이스_이름] < /tmp/[백업_파일명].sql
2-2. Docker Compose 외부에서 복원
이 방법은 호스트 OS에서 docker-compose exec
를 통해 psql
명령어를 실행하고, stdin
으로 백업 파일을 전달하는 방법입니다.
docker-compose exec -T [서비스_이름] psql -U [유저_이름] -d [데이터베이스_이름] < ./backup/[백업_파일명].sql
-T
:docker-compose exec
의 pseudo-TTY 할당을 비활성화하는 옵션입니다. 이 옵션은 스크립트 실행 시 필요합니다../backup/[백업_파일명].sql
: 호스트 OS의 백업 파일 경로.
3. DB 백업 및 복원 방법
PostgreSQL 데이터베이스를 복원하는 두 가지 주요 방법인 psql과 pg_restore의 차이를 알아봅니다. 위의 예제에서는 psql
을 이용하여 DB를 백업하고 복원 했습니다.
간단한 복원이나 수동편집이 필요한 경우 유용하지만 대규모 데이터베이스를 빠르고 효율적으로 복원하는 경우 pg_restore
를 사용합니다.
특징 | psql |
pg_restore |
---|---|---|
백업 파일 형식 | SQL 스크립트(.sql) | 커스텀/디렉토리/tar 아카이브 (-Fc /-Fd /-Ft ) |
복원 속도 | 느림 (순차적 실행) | 빠름 (병렬 복원 가능, -j 옵션) |
복원 유연성 | 낮음 (전체 복원만 가능) | 높음 (선택적 복원 가능, --table 옵션) |
파일 크기 | 큼 (압축되지 않은 텍스트) | 작음 (기본적으로 압축) |
사용 환경 | 소규모 DB, 개발/테스트 환경 | 대규모 프로덕션 DB, 정기 백업/복원 |
요약 | 단순하지만 비효율적인 방법 | 복잡하지만 유연하고 효율적인 방법 |
4. 추가 팁: 자동 백업 스크립트
정기적인 백업을 위해 백업 스크립트를 작성하고, cronjob 등을 이용하여 자동화할 수 있습니다.
예시 DB백업 script
#!/bin/bash
# 설정
SERVICE_NAME="db"
DB_USER="postgres"
DB_NAME="my_database"
BACKUP_DIR="./backup"
# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR
# 파일명 설정 (예: my_database-2025-08-02T10:00:00.sql)
TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%S")
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$TIMESTAMP.sql"
# 백업 실행
echo "Starting backup of '$DB_NAME'..."
docker-compose exec $SERVICE_NAME pg_dump -U $DB_USER -d $DB_NAME > $BACKUP_FILE
# 백업 성공 여부 확인
if [ $? -eq 0 ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed!"
rm $BACKUP_FILE
fi
# 오래된 백업 파일 삭제 (예: 7일 지난 파일)
find $BACKUP_DIR -name "*.sql" -type f -mtime +7 -delete
이 스크립트를 Crontab에 등록하여 매일 특정 시간에 실행하도록 설정할 수 있습니다.
# 매일 새벽 2시에 백업 실행
0 2 * * * /path/to/your/backup_db.sh
카테고리 다른 글
Date | Title | Author |
---|---|---|
Jan 1, 3000 | 전체 카테고리 | |
Aug 1, 2025 | GCP VM 인스턴스에 도메인 연결하기 | |
Jul 26, 2025 | GCP VM 인스턴스에서 DB 및 서비스 이전 가이드 | |
Jul 19, 2025 | 윈도우에 ngrok 설치하고 사용하기 | |
Jun 5, 2025 | FastAPI에서 문서 접속을 환경설정으로 제한하는 방법 | |
May 5, 2025 | 포트를 점유하고 있는 서비스 제거하기 | |
Mar 20, 2025 | 우분투(Ubuntu)에서 ngrok 설치 및 사용 방법 | |
Feb 4, 2025 | Windows 11에서 WSL 설치 및 Docker 연결하기 | |
Oct 7, 2024 | Docker Compose로 Jenkins 설치 및 사용하기 | |
Aug 23, 2024 | 우분투(Ubuntu)에서 특정 폴더를 아파치 서버로 설정하기 | |
Jul 24, 2024 | GitHub Actions 시작하기 | |
Dec 31, 2023 | 우분투와 윈도우 파일 공유하기 (samba) | |
Dec 5, 2023 | crontab을 이용해서 Let’s Encrypt SSL 인증서 자동갱신 | |
Nov 27, 2023 | 우분투 docker, docker-compse 설치 | |
Nov 26, 2023 | AWS 호스팅 EC2 와 Lightsail의 차이 | |
Nov 20, 2023 | wsl 이미지 저장 위치 변경 및 백업 | |
Nov 20, 2023 | airflow postgresoperator 사용하기 | |
Nov 18, 2023 | docker-compose로 airflow 설치하기 | |
Nov 15, 2023 | wsl2에 docker 설치하기 | |
Nov 15, 2023 | mkfifo를 이용한 IPC | |
Oct 9, 2023 | Github Pull Request 템플릿 적용하기 |