Docker와 PostgreSQL

Docker와 PostgreSQL
이 글은 CentOS 7.x 배포판에서의 Docker를 이용한 PostgreSQL 사용법에 대한 소개입니다.
docker 설치 및 확인
설치
yum install docker-engine
확인
ps ax | grep dockerd
PostgreSQL 이미지 받기
이 글에서는 도커 공식 저장소에 있는 PostgreSQL 이미지를 사용한다. 설명서 링크
docker pull postgres:9.6.6
뒤 버전을 빼면 마지막 배포판 선택, 버전을 지정하면, 해당 버전
컨테이너 만들기
로컬 호스트의 디스크를 컨테이너 안에서 사용하기 위해서, 미리 준비하고, (아래 예제에서는 /home/postgres/pgdata 이다) 그것을 데이터 디렉터리로 사용한다. 또한 한국어 처리를 위해서, 초기 환경 설정을 위해 run 명령어가 조금 복잡하다.
하나 기억해 두어야 할 부분은 아래와 같이 포트 포워딩 설정을 한다면 이 run 작업 내용안에 방화벽 설정이 포함된다. 그렇기 때문에, firewalld 서비스가 활성화 되어 있어야 한다.
docker run \ -e PGDATA=/data/pgdata \ --volume /home/postgres/pgdata:/data \ -e POSTGRES_INITDB_ARGS="--data-checksums -E utf8 --no-locale" \ --name postgres96 \ --publish 5432:5432 \ postgres:9.6.6
컨테이너를 만들 때 데몬 모드로 만들지 않았다. 진행 과정을 보고 어디에 문제가 있는지 살펴보고 적당히 대응해야한다. start / stop 명령으로 서버를 언제든지 실행, 중지 할 수 있음으로 run 작업을 때는 데몬 모드를 사용하지 않는 것이 나은 것 같다.
PostgreSQL 초기 설정
문제는 docker 쓰는 것과 관계 없이 DB 서버를 운영 환경에서 쓰기 위해서 해야하는 작업들은 똑 같다는 것이다. 오히려 OS 의존성을 끊어버리는 바람에 postgresql.conf 쪽에 손을 봐야할 부분이 오히려 더 많다.
손 봐야 postgresql.conf 파일의 부분은 다음과 같다.
- shared_buffers
- wal_level
- archive_mode
- archive_command
- effective_cache_size
- min|max_wal_size
- logging_collector
- log_line_prefix
- autovacuum_max_workers
- timezone
- log_timezone
- 그리고, pg_hba.conf 파일 (복제 환경도 함께 고려해야한다)
서버 실행 & 중지
docker stop postgres96 docker start postgres96
영구보관 디스크와 도커 철학
문제는 위와 같은 로컬 호스트 디스크 영역을 도커 내에서 쓰는 경우 도커 도입의 장점들이 많이 희석된다.
데이터베이스의 자료가 저장되는 위치는 결국 로컬 호스트와도 분리되는 것이 고가용성 측면에서 운영 비용을 최소화할 것이다.
그렇다면, fail over 상황에서의 대기 서버를 운영 서버로 전환하는 작업은 온프레미스 환경이거나, 가상 호스트 환경 보다 더 복잡해 진다.
생각보다 복.잡.하.다.