Published on

PostGIS확장하기(Docker기반)

Authors

Docker를 이용한 Postgresql DB 생성부터 PostGIS 를 확장(설치) 하는 방법입니다.

PostGIS는 Postgresql 의 extension 이므로, DB가 먼저 필요합니다.

저는 관리와 유지가 용이하기 때문에 로컬,배포 환경모두 docker 를 이용하는 편 입니다.

도커 스크립트로 간편하게 DB(Database)를 만들 수 있습니다.

1. Docker로 PostgreSQL 생성하기

  • Docker가 데이터베이스 배포를 위해 독립된 환경을 만드는 데 어떻게 사용되는지 소개합니다.
  • 아직 설치되지 않았다면 아래 링크에서 설치할 수 있습니다.

도커 링크

1.1 기본 실행방법

postgres 이미지를 가져오고, 바로 실행이 가능합니다.

여기에는 POSTGRES_PASSWORD와 같은 환경 변수 설정이 포함됩니다.

docker pull postgres docker run --name some-postgres -e POSTGRES_PASSWORD=password -d postgres

1.2 상세한 환경변수 설정 및 팁

아래처럼 환경변수를 다양하게 세팅할 수 있습니다.

docker run -d \
--name postgis -p 5432:5432 -h postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=postgis_db \
-e POSTGRES_PASSWORD=postgres123 \
-e PGDATA=/var/lib/postgresql/data/pgdata \
postgres
  1. docker run: Docker 컨테이너를 시작하고 실행하는 데 사용되는 기본 명령입니다.
  2. d: 백그라운드에서 실행하도록 합니다. 'detached' 의 의미입니다. 터미널이 컨테이너 실행에 바인딩되지 않고, 컨테이너가 백그라운드에서 독립적으로 실행됩니다. 로그를 직접 볼 수 없는 상태가 되겠죠.
  3. -name some-postgres: 생성될 컨테이너에 some-postgres라는 이름을 할당합니다.
  4. p 5432:5432: 포트 매핑을 정의합니다. 호스트 시스템의 5432 포트를 컨테이너의 5432 포트에 연결합니다. PostgreSQL의 기본 포트는 5432이며, 이를 통해 호스트 시스템에서 컨테이너의 PostgreSQL 서버에 접근할 수 있습니다.
  5. h postgres: 컨테이너의 호스트네임을 postgres로 설정합니다.
  6. e POSTGRES_USER=some-user: PostgreSQL의 사용자 이름을 some-user로 지정합니다.
  7. e POSTGRES_DB=some-db: PostgreSQL 내에 some-db라는 이름의 데이터베이스로 지정합니다.
  8. e POSTGRES_PASSWORD=some-password: PostgreSQL 사용자의 비밀번호를 some-password로 설정합니다. 데이터베이스 보안을 위해 실제 사용 환경에서는 더 강력한 비밀번호를 사용해야 합니다.
  9. e PGDATA=/var/lib/postgresql/data/pgdata: PostgreSQL 데이터 파일이 저장될 경로를 설정합니다. 이 경로는 컨테이너 내에서 데이터베이스 파일을 저장하는 데 사용됩니다.

1.2.1 포트매핑 작동 방식

  • 외부의 어떤 시스템이 호스트 시스템의 IP 주소와 5432 포트(앞 부분)를 사용하여 연결을 시도하면,Docker는 이 연결 요청을 컨테이너 내부의 5432 포트(뒤 부분)로 전달합니다.
  • 결과적으로, 외부에서 호스트 시스템의 5432 포트로 들어온 요청은 컨테이너 내의 PostgreSQL 서비스에 도달하게 됩니다.

1.3 컨테이너의 데이터베이스로 진입

아래 명령어로 진입합니다.

docker exec -it some-postgres /bin/bash

정상적으로 진입되었다면 root@postgres:/# 이 뜨게됩니다.

Postgis docker

2. psql 로 접속하고 자주쓰는 명령어 정리하기

2.1 psql 접속

psql 명령어로 데이터베이스에 접속합니다.

psql -U postgres -d postgis_db
  1. U postgres: U 플래그는 사용할 데이터베이스 사용자를 지정합니다. 여기서 postgres는 사용자 이름입니다.
  2. d postgis_db: d 플래그는 접속할 데이터베이스를 지정합니다. 여기서 postgis_db는 데이터베이스의 이름입니다.

db명=# 으로 표기되면 정상적으로 접속이 된 것 입니다.

Postgis docker

2.2 관련 명령어

자주사용하는 명령어들 입니다.

명령어설명
\l 또는 \list설치된 모든 데이터베이스의 목록을 보여줍니다.
\dt현재 데이터베이스에 있는 모든 테이블을 보여줍니다.
\dn현재 데이터베이스의 모든 스키마를 보여줍니다.
\d [테이블 이름]지정된 테이블의 열, 타입, 기본값, 키 제약 조건 등을 보여줍니다.
SQL 명령일반 SQL 명령 (예: SELECT * FROM table_name;)을 입력하여 실행합니다.
\conninfo현재 데이터베이스 서버의 연결 정보를 보여줍니다.
\c [데이터베이스 이름]다른 데이터베이스로 접속을 전환합니다.
?psql에서 사용 가능한 명령어들의 목록과 설명을 보여줍니다.
\hSQL 명령어에 대한 도움말을 보여줍니다. 특정 SQL 명령어에 대한 도움말을 보려면 \h [명령어] 형식을 사용합니다.

3. PostGIS extension 생성

Postgis docker

3.1 PostGIS 확장 명령어

아래 명령어로 PostGIS 를 확장할 수 있습니다.

CREATE EXTENSION postgis;

3.1.1 ERROR: extension "postgis" is not available

ERROR: extension "postgis" is not available 는 시스템단에서 postgis 패키지가 설치되어 있지 않기 때문에 발생합니다.

ERROR: extension "postgis" is not available
DETAIL: Could not open extension control file "/usr/share/postgresql/15/extension/postgis.control": No such file or directory.
HINT: The extension must first be installed on the system where PostgreSQL is running.

3.1.2 postgis OS패키지 설치

exit 명령어로 DB에서 나온뒤 아래 명령어를 입력합니다.

apt-get update
apt-get install -y postgis
Postgis docker

postgis를 설치합니다.

Postgis docker

3.1.3 정상설치

CREATE EXTENSION 이라 나오면 정상적으로 설치 된 것 입니다.

Postgis docker

4. extension 이 작동하는 원리

PostgreSQL은 다양한 확장을 지원하는 모듈식 아키텍처를 가지고 있습니다.

이 아키텍처는 사용자가 필요에 따라 추가 기능을 데이터베이스에 '플러그인' 형식으로 추가할 수 있게 해줍니다.

  • CREATE EXTENSION 명령은 PostgreSQL에 내장된 확장 관리 시스템을 통해 실행됩니다.
  • PostgreSQL은 해당 확장과 관련된 SQL 파일, 라이브러리, 데이터 파일 등을 데이터베이스 시스템에 로드합니다.

https://hongreat.co.kr/gis-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-1%ED%8E%B8-%EB%B8%8C%EC%9D%B4%EC%9B%94%EB%93%9C-%EB%94%94%EC%A7%80%ED%84%B8%ED%8A%B8%EC%9C%88%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%B8%EC%A7%80-%EC%95%8C/

https://hongreat.co.kr/wgs84-espg-%EC%A2%8C%ED%91%9C%EA%B3%844326-3857-%EC%99%80-%EA%B2%BD%EC%9C%84%EB%8F%84-gis2%ED%8E%B8-maps%EC%9D%98-%EC%A2%8C%ED%91%9C%EA%B3%84-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0/

hongreat 블로그의 글을 봐주셔서 감사합니다!