- Published on
Docker를 이용해서 PostgreSQL을 생성하고 실행하기
- Authors
- Name
- hongreat
- ✉️hongreat95@gmail.com
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 이미지를 의미합니다.
오류 원인
명령어를 실행하면서 다음과 같은 오류가 발생할 수 있습니다
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
디렉토리 변경에 따른 문제 PostgreSQL의 자동 업데이트로 인해 데이터 디렉토리가 변경되었으며, 이전 버전과의 호환성 문제로 인해 데이터베이스에 접근할 수 없는 상황이 발생했습니다.
해결 방법
상황에 따라 해결방법이 다를 수 있습니다.
아래는 간단하게 패키지 (재)설치를 통해서 해결한 과정 입니다.
psycopg2 설치 PostgreSQL과 Python 애플리케이션 간의 연결을 위해
psycopg2
라이브러리를 설치합니다. 이는 PostgreSQL과 Python 간의 인터페이스를 제공하는 라이브러리입니다. 다음 명령어를 사용하여 설치할 수 있습니다pip install psycopg2
디렉토리 마이그레이션 PostgreSQL의 데이터 디렉토리를 새 버전의 디렉토리로 이동해야 할 수 있습니다. 오류 메시지에서 제시된 명령어를 사용하여 데이터 디렉토리를 새로운 위치로 이동합니다. PostgreSQL 서비스를 중지한 후, 다음 명령어를 실행합니다
mv -v "/opt/homebrew/var/postgres" "/opt/homebrew/var/postgresql@14"
데이터 디렉토리를 이동한 후, PostgreSQL을 다시 시작합니다
brew services restart postgresql@14
확인 필요 Mac의 M1 칩에서 PostgreSQL을 로컬로 구축할 때는 바이너리 사용 여부에 대해 확인할 필요가 있습니다. 이와 관련된 세부 사항은 PostgreSQL의 공식 문서나 커뮤니티를 참고하시기 바랍니다.