Backend

Docker 환경에서 postgreSQL 설치, backup, restore 하기

뒷골목프로그래머 2023. 2. 15. 20:59
반응형

안녕하세요. 글쓰는 개발자 입니다.

"GNU GPL 2 license"여서 상업용으로 사용할 경우 "소스코드 공개 의무"가 있는 MariaDB 대신 쓸 수 있는 PostgreSQL을 Docker 를 활용해 설치하고 백업 및 복구 방법까지 소개합니다.
 본래 docker compose로 작성하는 것이 가장 간편하지만 전체 인프라가 MSA로 구성 될 예정이고 최종적으로 kubenetes 로 관리 할 예정이기에 이런 방식이 굳이 필요하지는 않지만, 사내 docker network 교육 세미나를 위해 단계별로 작업한 내용을 공유합니다.

 

목차

1. 개발 환경
2. postgreSQL Docker Container 실행
3. DB 생성
4. postgres backup
5. postgres restore
6. <부록> docker network 사용 container 통신

 

 

1. 개발 환경

- Host : Ubuntu 22.04.1 LTS
- Postgres version : 14.7
- Docker Image: postgres:14.7
 

2. postgreSQL Docker Container 실행

docker pull postgres:14.7

docker run \
  -d \
  --name <container-name> \
  --restart always \
  -e POSTGRES_PASSWORD=<user postgress password> \
  -v ${PWD}/postgres-docker:/var/lib/postgresql/data \
  -p 5432:5432 postgres:14.7

* -v : volume의 경우 앞의 ${PWD} 는 명령을 실행하고 있는 위치를 나타냅니다. ${HOME} 또는 본인이 원하는 절대 경로를 입력하시면 됩니다.

 

3. DB 생성

 구글링을 하다보면, psql 을 사용하는 예제가 많이 있습니다. 저는 편하게 사용하기 위해서 DBeaver 를 사용했습니다.

1) DBeaver의 connection 에서 Host 주소와 ID / PW 를 입력하고 접속

DBeaver postgreSQL connect

2) Database 생성

DBeaver Create New Database
DBeaver Create Database

3) Table 생성

DBeaver Create New Table

 

4. postgres backup

 postgreSQL 백업(backup) 은 HOST 에서 쉘 스크립트(shell script) 를 매일 특정 시간에 cronjob으로 HOST의 정해진 경로에 백업하는 방식을 사용합니다. 저는 /workspace 경로에서 작업을 진행했습니다.
(!주의 Docker Container 내부가 아니라 HOST 에서 진행합니다.)

1) postgresql 백업 쉘스크립트 (postgres_backup.sh) 작성

# /workspace

mkdir postgres_backups # backup sql script 를 저장하는 장소
mkdir script          # crontab log 를 저장하는 장소

touch postgres_backup.sh
vi postgres_backup.sh


############## vi postgres_backup.sh ###########

#!/bin/bash

BACKUP_DIR="/workspace/postgres_backups/"
FILE_NAME=$BACKUP_DIR`date +%y%m%d-%H%M%S`.sql

docker exec -t <container_name> pg_dump -U <dbuser> <db-name> > FILENAME
 
 

2) User 에게 docker 권한 부여

 Host에서 -t 옵션으로 postgresql container에 접속해 pg_dump를 실행하기 위해서는 현재 User에게 docker 사용 권한이 부여되어야 합니다.
sudo usermod -aG docker $USER

3) Cron

 postgresql Container 의 TimeZone을 Asia/Seoul로 세팅하고 crontab에 작성한 postgres_backup.sh 를 매일 새벽 1시에 주기적으로 실행하도록 합니다. 또한 crontab 실행 log 를 앞에서 생성한 script 디렉토리 하위에 postgres_backup.sh.log 라는 이름으로 생성하도록 합니다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime # TimeZone 세팅

crontab -e

# m h  dom mon dow   command
0 1 * * * sh /workspace/postgres_backup.sh >> /workspace/script/postgres_backup.sh.log 2>&1
 

5. postgres restore

 문제가 생겨 database 를 사용하게 될 수 없게 된 경우, 생성한 sql script 를 사용해 restore 합니다. 

#/workspace/postgres_backups/

# psql -U <dbuser> --dbname <dbname> -f <backup sql script path>
psql -U postgres --dbanme test -f /var/lib/postgres/data/test.sql

 

 6. <부록> docker network 활용 container 통신

 docker compose 를 사용해 보신 분들은 container 간 통신에서 container name 만으로 편리하게 통신이 가능한 것을 확인 하셨을 것입니다. 사실, docker compose 를 사용하면 menifest에 명시된 container들은 하나의 bridge network로 연결되고 이를 통해 container name으로 통신이 가능한 것 입니다.

 그렇다면 docker compose 를 사용하지 않았을 때는 어떻게 하면 좋을까요? docker network 를 생성하여 container를 추가하는 방법으로 해결합니다. 아래 명령어를 참고하세요.

# docker network create <network-name>
docker network create test-network

# docker network connect <network-name> <container-name>
docker network connect test-network postgresql

# network 연결 확인
# docker network inspect <network-name>
docker network inspect test-network

 

반응형