Postgres 데이터베이스 실행하기
본 글에서는 Postgres 데이터베이스를 Docker Container 로 실행하는 방법을 설명합니다.
저는 별도의 데이터베이스 서비스(예를 들어, AWS RDS 와 같은 것들)를 이용하지 않아도 된다면, Docker Container 로 DB 를 빠르게 띄워 개발에 착수하는 것이 좋다고 생각합니다.
Postgres 데이터베이스 이미지가 이미 Docker-Hub 에 올라와 있기 때문에, 우리는 단순히 Pulling 하여 실행만 해도 빠르게 DB 를 소유할 수 있게 되며, 손쉽게 연결된 서버 구축이 가능하게 됩니다.
본 설명에서는 Docker Engine (+ Compose) 이 설치되어 있다는 가정 하에 설명하겠습니다.
혹시 설치가 되어 있지 않다면, 아래 글을 통해 Docker 설치를 완료하여 주시기 바랍니다.
Docker in Ubuntu 18.04
들어가기에 앞서Docker는 컨테이너(Container) 기반의 애플리케이션 빌드/배포 오픈소스 프로젝트입니다. 서버 환경을 기존 물리적 환경으로부터 격리시켜 가상화된 환경을 얻을 수 있으며, Docker Hub
ts01.tistory.com
위 글은 Ubuntu 18.04 를 기준으로 하지만 20.04 또는 22.04 에서도 비슷한 맥락으로 설치 가능합니다.
Postgres 이미지 선택하기
Docker Hub 에서는 각종 서비스들에 대한 이미지(Image)들이 저장되어 있습니다. 그중 우리가 이용할 "postgres" 를 검색하면 아래 사이트와 같이 버전별 컨테이너 이미지가 태그로 명명되어 있습니다.
postgres - Official Image | Docker Hub
Note: the description for this image is longer than the Hub length limit of 25000, so has been trimmed. The full description can be found at https://github.com/docker-library/docs/tree/master/postgres/README.md. See also docker/hub-feedback#238 and d
hub.docker.com
우리는 Postgres 이미지들 중 버전을 선택하여, Pulling 할 이미지를 결정해야 합니다.
많은 버전들 중에 하나를 Tag 값으로 이용하면, 그 이미지를 이용할 수 있습니다. 예를 들어, `postgres:17.4` 는 17.4 버전을, `postgres:17.4-alpine3.21` 은 17.4 Alpine 3.21 버전(Alpine = 경량화된) 을 의미합니다.
본 글에서는 "15" 버전을 이용하고자 합니다.
Docker 로 Postgres 실행하기
Docker Engine 이 설치되어 있어 명령어 입력이 가능하다면, 아래 명령어로 쉽게 이미지를 Pulling 할 수 있습니다.
docker pull postgres:15
설치가 완료되면, 아래 명령어를 통해 Pulling 한 Postgres 이미지를 확인할 수 있습니다.
docker images | grep postgres
이미지가 존재하므로 Docker 실행 명령어로 컨테이너를 실행할 수 있습니다.
docker run -dit --name=pg -e POSTGRES_PASSWORD=password postgres:15
실행 명령어를 분석하면 아래와 같습니다.
- `--name` 를 통해, 컨테이너 이름을 지정할 수 있습니다. 여기서는 `pg` 입니다.
- `-e POSTGRES_PASSWORD=password` 를 통해, Postgres 접근 비밀번호를 설정할 수 있습니다.
- `-e` 는 Environmet 즉, 환경변수를 설정하는 옵션입니다. `password` 값 대신 원하는 비밀번호를 설정하면 됩니다.
- 위 비밀번호를 설정하지 않고 실행하는 경우, 에러가 발생하여 컨테이너가 실행되지 않습니다.
아래 명령어를 통해 실제로 실행 중인지 확인해 봅니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
910d210aef3b postgres:15 "docker-entrypoint.s…" 2 seconds ago Up 1 second 5432/tcp pg
Postgres 가 Port 5432 에 실행되었으므로, 로컬 환경에 데이터베이스 구축이 완료되었습니다.
Docker-compose 로 Postgres 실행하기
앞서 Docker 명령어를 통해 실행하는 경우, 실행 명령어에 각종 환경변수를 대입하여 실행하고자 하는 Postgres 에 대한 설정을 추가할 수 있습니다. 다만, 이 경우 실행 명령어를 따로 스크립트화 해서 설정하거나 변수마다 새롭게 작성해야 하는 불편함이 있습니다.
Docker-compose 를 이용하면, YAML 파일을 통해 설정 값들을 미리 지정하고 실행할 수 있게 됩니다.
아래와 같이 docker-compose.yaml 파일을 작성해 봅니다.
version: "3.6"
services:
postgres:
image: postgres:15 # Postgres 버전
container_name: ${CONTAINER_NAME} # 실행하는 컨테이너의 이름 (환경변수 연동)
restart: always # 컨테이너가 종료되면 자동으로 재실행하는 옵션
ports:
- ${POSTGRES_PORT}:5432 # 컨테이너 외부로의 포트 번호 설정 (환경변수 연동)
environment:
POSTGRES_USER: ${POSTGRES_USER} # Postgres 데이터베이스 username (환경변수 연동)
POSTGRES_DB: ${POSTGRES_DB} # Postgres 데이터베이스 DB이름 (환경변수 연동)
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # Postgres 데이터베이스 연결 비밀번호 (환경변수 연동)
PGDATA: /var/lib/postgresql/data/pgdata # Postgres 컨테이너 내부에서의 PG데이터 저장 경로
volumes:
- ./${POSTGRES_VOLUME_DIR}:/var/lib/postgresal/data/pgdata # PG데이터에 대한 외부 경로와 내부 경로를 연결
여기서 "${}" 로 묶인 부분들은 환경변수 파일(.env)로부터 읽어들여 설정하는 값들입니다. 주석에도 설명이 있지만, 각 변수들을 설명하면 아래와 같습니다.
- `CONTAINER_NAME` : 실행하는 컨테이너 이름
- `POSTGRES_PORT` : 실행하는 Postgres 의 외부 포트번호
- `POSTGRES_USER` : 접속 유저이름
- `POSTGRES_DB` : 데이터베이스를 구분하는 최상위 DB이름 (DBNAME > Schema > Table 로 생각)
- `POSTGRES_PASSWORD` : 접속 비밀번호
- `POSTGRES_VOLUME_DIR` : 로컬 환경과 연결된 데이터베이스 저장경로(디렉토리 위치)
기타 환경변수의 경우 Postgres 데이터베이스에 대한 설정이며, 마지막 환경변수의 경우 로컬 환경과 Volume 연결을 하기 위해 이용합니다. 이를 이용하면, 컨테이너가 종료되거나 재실행되어도 데이터는 로컬에 남아있어 재연결하기 용이합니다.
위 변수들을 설정하기 위해 환경변수 파일(.env)을 생성하고 아래 값들을 채워줍니다.
# 실행하는 컨테이너 이름
CONTAINER_NAME=postgres
# Postgres 설정
POSTGRES_PORT=5432
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
# Postgres 데이터 저장 디렉토리
POSTGRES_VOLUME_DIR=pgdata
이제 Docker-compose 명령어를 이용하여 실행합니다. (docker-compose.yaml 파일이 존재하는 위치에서 실행)
docker-compose up -d
동일하게 아래 명령어를 통해 실행결과를 확인합니다.
docker ps
Postgres configuration
이렇게 Postgres 데이터베이스를 빠르게 구축하기 위해 Docker Container 를 올리는 방법에 대해 알아보았습니다. 만약 필요하다면, 아래와 같이 YAML 파일을 수정하여, Postgres Configuration 을 좀더 디테일하게 수행할 수 있습니다.
version: "3.6"
services:
postgres:
image: postgres:13 # Postgres 버전
container_name: ${CONTAINER_NAME} # 실행하는 컨테이너의 이름 (환경변수 연동)
restart: always # 컨테이너가 종료되면 자동으로 재실행하는 옵션
ports:
- ${POSTGRES_PORT}:5432 # 컨테이너 외부로의 포트 번호 설정 (환경변수 연동)
environment:
POSTGRES_USER: ${POSTGRES_USER} # Postgres 데이터베이스 username (환경변수 연동)
POSTGRES_DB: ${POSTGRES_DB} # Postgres 데이터베이스 DB이름 (환경변수 연동)
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # Postgres 데이터베이스 연결 비밀번호 (환경변수 연동)
PGDATA: /var/lib/postgresql/data/pgdata # Postgres 컨테이너 내부에서의 PG데이터 저장 경로
volumes:
- ./${POSTGRES_VOLUME_DIR}:/var/lib/postgresal/data/pgdata # PG데이터에 대한 외부 경로와 내부 경로를 연결
- ./postgresql.conf:/tmp/postgresql.conf # Postgres 설정 파일을 컨테이너 내부로 연결
command: postgres -c config_file=/tmp/postgresql.conf # Postgres 컨테이너 실행 시 설정 파일을 적용
이 때, 작성한 Postgres configuration file 인 postgresql.conf 파일은 docker-compose.yaml 파일과 같은 위치에 있어야 합니다. 그러면 Volume 연결을 통해 컨테이너 안으로 설정파일이 전달되고, `command` 를 통해 컨테이너 실행과 함께 Configuration 이 적용됩니다.
관련한 파일들이나 자세한 예시를 보시고 싶으시면, 아래 레포지토리의 'postgres' 디렉토리를 참고해 주세요.
https://github.com/hubts/moderate-nestjs/tree/main/postgres
moderate-nestjs/postgres at main · hubts/moderate-nestjs
REST API Backend using NestJS, Prisma, PostgreSQL, and so on. - hubts/moderate-nestjs
github.com
'개발 💻 > Docker' 카테고리의 다른 글
Zsh에서 Docker 명령어 자동완성하기 (2) | 2023.07.19 |
---|---|
Docker in Ubuntu 18.04 (0) | 2023.07.03 |