自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

[docker] postgreSQL12 + PostGIS3 環境を作成する

Database
Database

ヒノマルクです。タイトルのような仕様で環境構築をする機会があったので、どなたかのお役に立てればと思い記事にしておきます。

※ 実業務だとdockerイメージを作成するためにプロキシの設定が必要だったりと少々複雑になるので、今回は簡略化しています。自宅で気軽にテストする分には問題ないと思います。

スポンサーリンク

postgreSQLのdocker公式イメージ

今回環境構築するにあたり、postgreSQLのdocker公式イメージを使っています。

docker公式イメージにはPostGISは含まれていないので、別途インストールしてあげる必要があります。

PostGISが含まれている他のイメージも公開されているのですが、ヒノマルクは公式イメージを使いたかったのと、きちんとPostGISのインストール方法を理解しておきたかったので自分で導入しました。(提供イメージにないバージョンでも将来的に環境構築できるかも知れないというメリットがあります。)

※ もっと楽をしたい場合はこちらのイメージはpostgreSQLのdocker公式イメージを利用してPostGIS環境を構築してくれているようなので活用してみてください。

※ PostGISが必要ない場合は、単純に公式イメージをdocker runすればpostgreSQL環境が構築できるのでより簡単かも知れません。

スポンサーリンク

Dockerfileの作成

Dockerfileはイメージを作成するためのコマンドを事前にテキストファイルに記載しておくことで、自動で新しいdockerイメージを構築してくれます。

Dockerfileの中身
FROM docker.io/postgres:12
ENV LANG ja_JP.UTF-8
ENV TZ Asia/Tokyo
RUN apt-get update && apt-get install locales dialog tzdata -y \
               && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8 \
               && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
RUN apt update \
    && apt-get install wget vim iputils-ping net-tools unzip less -y \
    && apt-get install postgresql-12-postgis-3 -y
RUN echo "create extension if not exists postgis;" > /docker-entrypoint-initdb.d/dbinit.sql

postgreSQLのdocker公式イメージのページに書いてありますが、ロケールやタイムゾーンを日本語にする設定やPostGISを追加でインストールするコマンドを追加しています。

さらに、docker-entrypoint-initdb.dフォルダの中にdbinit.sqlがありますが、こちらはdocker runでコンテナを作成したときにPostGISを有効化するコマンドを記載しています。

追加するエクステンションによってはpostgresql-server-dev-12も必要になる場合があるかもしれません。
その場合は下記コマンドも追加します。

&& apt-get install postgresql-server-dev-12 --no-install-recommends -y

dockerイメージを構築する
docker build -t hinomaruc/postgres:12 .
Out[0]
Sending build context to Docker daemon  292.2MB
Step 1/6 : FROM docker.io/postgres:12
 ---> afee8d9d57fc
・・・省略・・・
Successfully built 2fed9f192556
Successfully tagged hinomaruc/postgres:12
構築した hinomaruc/postgres:12 イメージを確認する
docker images
Out[0]
REPOSITORY          TAG       IMAGE ID     CREATED        SIZE
hinomaruc/postgres  12        2fed9f192556 51 minutes ago 648MB
postgres            12        afee8d9d57fc 9 days ago     371MB
oracle/database     21.3.0-xe f21325365fcc 12 days ago    11.4GB
cloudera/quickstart latest    4239cd2958c6 5 years ago    6.34GB

無事作成されていました。パッケージを追加したので倍ほどの容量になっています。

PostgreSQLコンテナ作成
docker run -it -d \
-p 5432:5432 \
-e POSTGRES_PASSWORD=hinomaruc \
-e PGDATA=/var/lib/postgresql/data/ \
-v /Users/hinomaruc/postgres:/var/lib/postgresql/ \
--shm-size=64m \
--name postgres12 \
hinomaruc/postgres:12

PGDATAやshm-sizeはデフォルトの値を記載しています。お好みで変更してください。

docker psでコンテナのステータスを確認します。
「Up 〇〇 minutes」などになっていれば成功です。

エラーがあると存在しないか docker ps -a コマンドでみるとExitedとかになっています。

dockerプロセス確認
docker ps
Out[0]
"CONTAINER ID" IMAGE COMMAND CREATED STATUS PORTS NAMES
d0d29eae86e0 hinomaruc/postgres:12   "docker-entrypoint.s…" 38 minutes ago Up 21 minutes       0.0.0.0:5432->5432/tcp postgres12

postgres12 + PostGIS3 のコンテナを作成することができました。
次にPostGISのクエリを実行して動作確認して見ます。

スポンサーリンク

pgAdmin4 で作成したコンテナのpostgreSQL12に接続

pgAdmin4のインストール方法は下記にまとめてあります。

[Mac] PostgreSQL環境を準備する
どうもNFTやWeb3.0というワードに反応しているヒノマルクです。時代がまた変わりそうですね。今日はPostgreSQL環境を構築しようと思います。Macでの構築方法になります。「Mac postgres」で調べてみるとHomebrewを...

接続情報は下記を入力します。
General → Name: localhost (識別できれば名前は何でもよい)
Connection → Host: localhost (サーバーIPやホスト名など、今回はローカルホスト)
Connection → Port: 5432 (postgreSQLのデフォルトポート)
Connection → Username: postgres
Connection → Password: hinomaruc (POSTGRES_PASSWORDで指定した値)

クエリエディタに下記サンプルクエリを記入して実行してみてください。

PostGIS公式サイト*1のサンプルクエリ
CREATE TABLE gtest (id serial primary key, name varchar(20), geom geometry(LINESTRING));
INSERT INTO gtest (ID, NAME, GEOM)
VALUES (
  1,
  'First Geometry',
  ST_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)')
);
SELECT id, name, geom AS geom FROM gtest;

実行結果は Geometry Viewerタブで見て、画像のように表示されていたら成功です。

pgAdmin4のGeometry Viewerタブの表示画面

MacでpostgreSQL環境を作成するのであれば、Postgres.appを使う方がdockerでやるより楽ですね。

スポンサーリンク

参照元

*1 https://postgis.net/docs/manual-3.0/postgis-ja.html

タイトルとURLをコピーしました