Open6

PostGISの環境をDockerで構築する

ジョンの地図ジョンの地図

ディレクトリを用意

以下のようなディレクトリ・ファイルを用意した。
dbディレクトリ以下はPostGISコンテナのボリューム用に使用する。

postgis
├── docker
│   └── db
│       └── data
│       └── sql
└── docker-compose.yml

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の設定を追加する

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

# ここから下を追加

  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

「接続テスト」をクリックして接続できているか確認する。

参考ページ