PostGISの環境をDockerで構築する
このスクラップのゴール
- PostGIS(PostgreSQL)の環境を構築する
- 国土数値情報(国土数値情報 | 鉄道時系列データ)を構築したDBに取り込む
- pgAdmin4で構築したDBにアクセスできるようにする
- QGISで構築したDBに接続してみる
GitHubのレポジトリ:mapsofjohn/postgis-docker
ディレクトリを用意
以下のようなディレクトリ・ファイルを用意した。
dbディレクトリ以下はPostGISコンテナのボリューム用に使用する。
postgis
├── docker
│ └── db
│ └── data
│ └── sql
└── docker-compose.yml
docker-compose.ymlを用意する
作業ディレクトリ直下にdocker-compose.yml
を作成して、
以下のような内容を記述した。
version: '3'
services:
service_postgres:
container_name: postgres_container
image: postgis/postgis:16-3.4
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
ports:
- 5432:5432
volumes:
- ./docker/db/data:/var/lib/postgresql/data
- ./docker/db/sql:/docker-entrypoint-initdb.d
restart: always
PostGISのイメージ
PostGIS公式のDockerイメージ(postgis/docker-postgis: Docker image for PostGIS)を使用した。
バージョン毎の違いをよく分かっていないので、
現時点(2024年2月4日)で最新のpostgis:16-3.4
を入れることにした。
PostgreSQLの環境設定
PostgreSQLのログイン情報などを設定する。
外部に公開する予定はないので、設定内容は適当。
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
参考ページ
PostGISのコンテナを立ててみる
docker compose up
を実行する。
以下のように出力されたら成功(のはず)
✔ Network postgis_default Created 0.0s
✔ Container postgres_container Created 0.0s
Attaching to postgres_container
postgres_container |
postgres_container | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres_container |
postgres_container | 2024-02-03 16:49:52.556 UTC [1] LOG: starting PostgreSQL 16.1 (Debian 16.1-1.pgdg110+1) on x86_64-p
c-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
postgres_container | 2024-02-03 16:49:52.556 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres_container | 2024-02-03 16:49:52.556 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres_container | 2024-02-03 16:49:52.558 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_container | 2024-02-03 16:49:52.561 UTC [29] LOG: database system was shut down at 2024-02-03 16:48:18 UTC
postgres_container | 2024-02-03 16:49:52.564 UTC [1] LOG: database system is ready to accept connections
起動している事を確認したらCtrl + C
でいったん終了させる。
pgAdminのコンテナをたてる
PostGIS(PostgreSQL)だけたててもDBの中身を確認しにくいので、
pgAdmin(PostgreSQL用のGUI管理ツール)のコンテナも一緒にたてる。
docker-compose.ymlにpgAdminの設定を追加する
version: '3'
services:
service_postgres:
container_name: postgres_container
image: postgis/postgis:16-3.4
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
ports:
- 5432:5432
volumes:
- ./docker/db/data:/var/lib/postgresql/data
- ./docker/db/sql:/docker-entrypoint-initdb.d
restart: always
# ここから下を追加
service_pgadmin:
container_name: pgadmin_container
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: example@example.com
PGADMIN_DEFAULT_PASSWORD: example
ports:
- 8080:80
volumes:
- ./docker/pgadmin4:/var/lib/pgadmin
restart: always
depends_on:
- service_postgres
docker compose upする
docker compose up
コマンドを叩く。
このときに./docker/pgadmin4
ディレクトリへの書込権限がない旨のエラーが出るときがある。
pgadmin_container | ERROR : Failed to create the directory /var/lib/pgadmin/sessions:
pgadmin_container | [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
こうなった場合はいったんCtrl + C
でコンテナを停止させた上で、下記のコマンドを実行して、権限を変更する。
sudo chown -R 5050:5050 ./docker/pgadmin4
再度docker compose up
コマンドを叩くと、以下のような内容が表示される。
pgadmin_container | pgAdmin 4 - Application Initialisation
pgadmin_container | ======================================
pgadmin_container |
pgadmin_container | postfix/postlog: starting the Postfix mail system
pgadmin_container | [2024-02-03 17:16:43 +0000] [1] [INFO] Starting gunicorn 20.1.0
pgadmin_container | [2024-02-03 17:16:43 +0000] [1] [INFO] Listening at: http://[::]:80 (1)
pgadmin_container | [2024-02-03 17:16:43 +0000] [1] [INFO] Using worker: gthread
pgadmin_container | [2024-02-03 17:16:43 +0000] [116] [INFO] Booting worker with pid: 116
「http://localhost:8080/」に接続してpgAdminのログイン画面が表示されれば成功。
参考ページ
pgAdminからPostGIS(PostgreSQL)のDBに接続する
http://localhost:8080/に接続する。
メールアドレスの欄にはdocker-compose.yml
のPGADMIN_DEFAULT_EMAILに設定した内容入力する。
パスワードの欄にはPGADMIN_DEFAULT_PASSWORDに設定した内容を入力する。
言語は「Japanese」にしておいた方がよい。
environment:
PGADMIN_DEFAULT_EMAIL: example@example.com
PGADMIN_DEFAULT_PASSWORD: example
DB接続
Serversを右クリック → 登録 → サーバー
設定内容
- General
- 名前:
postgres_container
(適当でいいはず)
- 名前:
- 接続
- ホスト名:
postgres_container
(docker-compose.ymlのcontainer_name
) - 管理用データベース:
postgres
(docker-compose.ymlのPOSTGRES_DB
) - ユーザ名:
postgres
(docker-compose.ymlのPOSTGRES_USER
) - パスワード:
postgres
(docker-compose.ymlのPOSTGRES_PASSWORD
) - パスワードを保存:有効
- ホスト名:
左側のツリーが画像のようになっていれば接続できている。
QGIS DBマネージャを使ってデータを取り込んでみる
QGISのブラウザ欄にPostGISがあるので、右クリック → 新規接続
- 名前:postgres_container
- ホスト:localhost
- ポート番号:5432
- データベース:postgres
- SSLモード:prefer(変更する必要ないかもしれない)
- 認証
- ユーザー名:postgres
- パスワード:postgres
「接続テスト」をクリックして接続できているか確認する。