Published on

Docker를 이용해서 PostgreSQL을 생성하고 실행하기

Authors

Docker를 사용하면 데이터베이스를 로컬에서 편하게 만들고 사용할 수 있습니다. 분리형 환경이라 관리하는게 오히려 쉽게 느껴지지만, 설정 과정에서 몇 가지 오류가 발생할 수 있습니다. 이번 글에서는 Docker를 이용해 PostgreSQL을 실행하는 방법과 발생할 수 있는 오류나 해결 방법을 기록합니다.

Docker 명령어 설명

아래는 PostgreSQL을 Docker 컨테이너에서 실행하기 위한 명령어입니다

docker run -d \
--name projects_local_db -p 5432:5432 -h postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=db_name \
-e POSTGRES_PASSWORD=password \
-e PGDATA=/var/lib/postgresql/data/pgdata \
postgres

이 명령어는 Docker 컨테이너에서 PostgreSQL 데이터베이스를 실행하기 위한 설정을 포함하고 있습니다. 각 옵션의 의미를 하나씩 살펴보겠습니다

  • docker run -d docker run 명령어는 새로운 컨테이너를 실행하는 명령어입니다. -d 옵션은 컨테이너를 백그라운드에서 실행하도록 설정합니다.

  • --name projects_local_db --name 옵션은 생성할 컨테이너의 이름을 지정합니다. 여기서는 projects_local_db라는 이름을 붙였습니다. 이 이름으로 컨테이너를 식별할 수 있습니다.

  • -p 5432:5432 -p 옵션은 호스트와 컨테이너 간의 포트를 매핑합니다. 5432:5432는 호스트의 5432 포트를 컨테이너의 5432 포트에 매핑합니다. PostgreSQL의 기본 포트가 5432이므로, 이를 통해 호스트 머신에서 데이터베이스에 접근할 수 있습니다.

  • -h postgres -h 옵션은 컨테이너의 호스트 이름을 지정합니다. 여기서는 postgres라는 호스트 이름을 설정했습니다. 이 옵션은 네트워크 환경에서 컨테이너를 식별하는 데 유용합니다.

  • -e POSTGRES_USER=postgres -e 옵션은 환경 변수를 설정합니다. POSTGRES_USER는 PostgreSQL의 기본 사용자 이름을 설정합니다. 여기서는 postgres로 설정했습니다.

  • -e POSTGRES_DB=db_name POSTGRES_DB는 생성할 기본 데이터베이스의 이름을 설정합니다. 여기서는 db_name으로 설정했습니다.

  • -e POSTGRES_PASSWORD=password POSTGRES_PASSWORD는 PostgreSQL의 기본 사용자 비밀번호를 설정합니다. 여기서는 password로 설정했습니다.

  • -e PGDATA=/var/lib/postgresql/data/pgdata PGDATA는 PostgreSQL 데이터 디렉토리의 경로를 지정합니다. 데이터베이스 파일이 이 경로에 저장됩니다. 기본값은 /var/lib/postgresql/data인데, 여기서는 /var/lib/postgresql/data/pgdata로 설정했습니다.

  • postgres 이 부분은 사용할 Docker 이미지를 지정합니다. postgres는 공식 PostgreSQL Docker 이미지를 의미합니다.

오류 원인

명령어를 실행하면서 다음과 같은 오류가 발생할 수 있습니다

  1. Homebrew를 통한 PostgreSQL 설치 Homebrew를 사용하여 PostgreSQL을 설치한 후, 자동 업데이트로 인해 데이터 디렉토리가 변경되었을 수 있습니다. PostgreSQL의 데이터 디렉토리가 이전 버전과 호환되지 않는 경우 오류가 발생할 수 있습니다.

    ==> postgresql@14
    Previous versions of postgresql shared the same data directory.
    
    You can migrate to a versioned data directory by running:
      mv -v "/opt/homebrew/var/postgres" "/opt/homebrew/var/postgresql@14"
    
    (Make sure PostgreSQL is stopped before executing this command)
    
    This formula has created a default database cluster with:
      initdb --locale=C -E UTF-8 /opt/homebrew/var/postgres
    For more details, read:
      https://www.postgresql.org/docs/14/app-initdb.html
    
    To restart postgresql@14 after an upgrade:
      brew services restart postgresql@14
    Or, if you don't want/need a background service you can just run:
      /opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgres
    
  2. 디렉토리 변경에 따른 문제 PostgreSQL의 자동 업데이트로 인해 데이터 디렉토리가 변경되었으며, 이전 버전과의 호환성 문제로 인해 데이터베이스에 접근할 수 없는 상황이 발생했습니다.

해결 방법

이 문제를 해결하기 위해 다음과 같은 단계를 시도해볼 수 있습니다

  1. psycopg2 설치 PostgreSQL과 Python 애플리케이션 간의 연결을 위해 psycopg2 라이브러리를 설치합니다. 이는 PostgreSQL과 Python 간의 인터페이스를 제공하는 라이브러리입니다. 다음 명령어를 사용하여 설치할 수 있습니다:

    pip install psycopg2
    
  2. 디렉토리 마이그레이션 PostgreSQL의 데이터 디렉토리를 새 버전의 디렉토리로 이동해야 할 수 있습니다. 오류 메시지에서 제시된 명령어를 사용하여 데이터 디렉토리를 새로운 위치로 이동합니다. PostgreSQL 서비스를 중지한 후, 다음 명령어를 실행합니다

    mv -v "/opt/homebrew/var/postgres" "/opt/homebrew/var/postgresql@14"
    

    데이터 디렉토리를 이동한 후, PostgreSQL을 다시 시작합니다

    brew services restart postgresql@14
    
  3. 확인 필요 Mac의 M1 칩에서 PostgreSQL을 로컬로 구축할 때는 바이너리 사용 여부에 대해 확인할 필요가 있습니다. 이와 관련된 세부 사항은 PostgreSQL의 공식 문서나 커뮤니티를 참고하시기 바랍니다.

hongreat 블로그의 글을 봐주셔서 감사합니다! 하단의 버튼을 누르시면 댓글을 달거나 보실 수 있습니다.

Buy Me A Coffee