::: IT인터넷 :::

Docker로 PostgreSQL 사용하기

곰탱이푸우 2022. 3. 7. 08:20
RDBMS에서 가장 유명한 것은 Oracle이다.
 
그러나 유료이고 주로 대형 프로젝트에 적합하다. 
유료라고 나쁜 것은 아니지만 개인이나 소규모 조직에서 사용하기엔 부담스러운 가격인 것은 사실이다.
 
서비스가 커지거나 데이터가 많아지면 스케일업을 해야 한다.
그러나 실제로 Oracle의 경우 비용 증가가 확실히 부담 되기 때문에 PostgreSQL을 대안으로 전환하는 곳도 많아졌다.
또는 RDBMS 대신 하둡과 같은 빅데이터를 도입하는 경우도 많다.
 
데이터나 파일들은 MinIO나 하둡 같은 분산 시스템의 도입을 검토할 수 있다.
그러나 메타 정보나 인덱스 정보 같은 소규모 데이터는, 비용 대비 복잡성과 효율성을 비교하면 여전히 RDBMS로 운용하는 것이 적합하다.
 
 

오픈소스 데이터베이스 소개

개인이나 소규모 조직은 주로 무료로 사용 가능한 오픈소스로 제공되는 도구를 활용하게 된다.
대표적인 오픈소스 데이터베이스는 다음과 같다.
구분
내용
적합한 조직
비고
MySQL, MariaDB 
단순 트랜잭션 성능 우수
복잡한 쿼리는 성능 저하 발생
작은 규모의 비지니스
소규모 프로젝트
MariaDB는 MySQL에서 분기
PostgreSQL
복잡한 쿼리의 성능 우수
SQL 표준 준수
CRUD 성능이 MySQL보다 저하
큰 큐모의 비지니스
큰 규모 프로젝트
CRUD는 Create, Read, Update, Delete의 약자
SQLite
가볍고 단순
파일 기반이라 멀티 작업 불가
SQL 학습
단순 작업
 
 
자세한 내용은 아래 블로그를  참고하면 도움이 된다.
정리하면 Oracle > PostgreSQL > MariaDB or MySQL > SQLite 정도가 될 것 같다.
개발, 테스트, 그리고 소규모 조직의 서비스에 바로 적용하기에는 PostgreSQL이 적합한 선택이 될 수 있다.
 
기본적인 CRUD 성능은 조금 아쉽지만 전체적인 성능, 다른 서비스로의 확장성과 활용도 등을 고려하여 PostgreSQL 사용하기로 결정 했다.
 
PostgreSQL의 오픈소스 라이선스는 PostgreSQL License를 따른다고 되어 있다.
 

PostgreSQL: License

License PostgreSQL is released under the PostgreSQL License, a liberal Open Source license, similar to the BSD or MIT licenses. PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95) Portions Copyright © 1996-2022, The Post

www.postgresql.org

 
자체적으로 생산한 라이선스이며, BSD 또는 MIT와 유사한 라이선스라고 되어 있다. (similar to the BSD or MIT licenses.)
즉, 사용에 있어서 특별한 제약은 없다. 코드 수정을 해도 공개 여부는 선택 가능하다. (할일이 있을까 싶지만..)
 

최신 버전 확인

Docker로 설정하는 방법은 의외로 간단하다.
 
PostgreSQL의 경우 Dockerhub에서 공식 Docker 이미지를 제공하고 있다.
최신 버전은 latest를 사용하면 되지만, 버전 태그가 latest로 지정되어 관리할 때 직관적으로 버전을 확인하기가 어렵다.
 
따라서 가급적 아래 URL에 접속하여 latest로 지정 된 버전을 확인하여 pull 명령에 명시한다.
2022-01-23 현재 가장 최신 버전 (latest)는 14.1 버전로 확인된다.
 
 

Docker 이미지 받아오기

아래 명령을 사용하여 Docker 이미지를 받아온다.
$ docker pull postgres:14.1    # DockerHub를 사용하는 경우

# 사설 저장소를 사용하는 경우
# docker pull 저장소주소:포트/postgres:14.1

 

해당 명령을 실행하면 아래와 같이 이미지를 받아온다.
 

Docker 컨테이너 생성

Docker 컨테이너 생성은 다음 명령어를 사용한다.
$ docker run -p 5432:5432 --name sr-postgres \    # PostgreSQL 포트 5432 바인딩
    -e POSTGRES_PASSWORD=POSTGRES_PASS -e TZ=Asia/Seoul \    # POSTGRES_PASSWORD 수정 필요
    -v /데이터경로/pgdata:/var/lib/postgresql/data -d \    # 공유 볼륨 경로
    postgres:14.1    # 이미지명:버전
 
옵션별 지정은 다음과 같다.
구분
내용
비고
-p
5432:5432
내부의 5432 포트를 외부 5432 포트와 연결한다.
-e
POSTGRES_PASSWORD=POSTGRES_PASS
데이터베이스 비밀번호이다. 사용할 비밀번호로 수정한다.
-v
/데이터경로/pgdata:/var/lib/postgresql/data
호스트 PC의 pgdata 경로를 컨테이너 내부의 data 경로로
사용하도록 공유 볼륨을 설정한다.
-d
 
Docker 컨테이너가 백그라운드로 실행되도록 지정한다.
 
포트 번호 변경 필요

AirFlow에서 사용하는 PostgreSQL도 5432 포트를 사용한다.
따라서 AirFlow와 별도로 PosgtreSQL을 사용하는 경우 충돌이 발생할 수 있다.

AirFlow 내부의 DB 포트 변경 보다는 별도로 셋팅하는 PostgreSQL의 포트를 변경하는 것이 더 쉽다.
AirFlow와 별도의 PosgtreSQL을 함께 사용하려는 경우, PostgreSQL의 포트를 5432가 아닌 다른 포트를 지정한다. 
 
해당 명령을 실행하면 다음과 같이 컨테이너와 지정한 공유 볼륨의 폴더가 생성 된 것을 확인할 수 있다.

 

wsl 환경에서 /mnt 하위에 공유 볼륨 생성할 경우 오류가 발생하는데, 아래와 같이 설정하고 컨테이너를 재실행한다.

만약, 기존에 /mnt 하위에 공유 볼륨을 지정하여 사용 중인 컨테이너가 있다면 영향을 받는다.
따라서 반드시 기존 컨테이너들도 모두 종료하고 진행해야 한다.
$ sudo umount /mnt/d
$ sudo mount -t drvfs D: /mnt/d -o metadata​
 
 
 

PostgreSQL 실행 확인

컨테이너가 실행되었으면 PostgreSQL이 정상적으로 동작하는지 확인한다.
 
아래 명령으로 컨테이너 내부로 진입해서 psql을 실행한다. 기본 사용자는 postgres이다.
$ docker exec -it sr-postgres /bin/bash

# psql -U postgres
 
해당 명령을 실행하면 아래와 같이 PostgreSQL 데이터베이스의 쉘이 실행된다.
 

Database 목록 확인

아래와 같이 \l (소문자 L) 명령어를 사용하면 PostgreSQL 내부의 데이터베이스 목록을 확인할 수 있다.
 
기본 설정으로 postgres, template0, template1이 생성되어 있는 것을 확인할 수 있다.

 

 

PostgreSQL URL 설정

외부에서 DB에 연결하기 위해서는 URL을 사용해야 한다.
 
컨테이너 실행 후 아래와 같은 주소를 사용한다.
# posgresql://PostgreSQL_아이디:PostgreSQL_비밀번호@PostgreSQL주소:포트/Database이름

# 우분투 환경 변수로 DB 주소 지정하는 경우
# 컨테이너를 생성하면서 포트는 5432, 비밀번호는 postgresql을 지정했다.
# Database는 기본으로 생성되어 있는 postgres를 사용한다.
export DB_URL = 'postgresql://postgres:postgresql@호스트IP:5432/postgres

 

SQL 기본 사용법과 Python으로 연동하여 사용하는 방법은 다음 포스팅으로 진행한다.