PostgreSQL11.15とPostgreSQL15.3の環境をDockerで構築する方法
AWSのAuroraでPostgreSQL 11.xxのサポート終了に伴い、15.xxへの移行をすすめるにあたり両バージョンの環境を構築して検証することにした。
PostgreSQL 15.xxはVacuumが並列動作するなど、パフォーマンスが改善しているとの情報があるが、そのあたりを確認したく簡易的にDockerコンテナを用いて手早く確認するための環境構築手順をまとめる。
やりたいこと
WSL2のDocker環境を利用する
WSL2上のDocker環境でDocker-Composeを用いて、PostgreSQL 11.xxと15.xxの両環境を同時に起動して稼働確認できるようにしたい。
構成図は以下の通り。
ChatGPTを利用してみる
最近流行りのChatGPTを利用してDockerfileやdocker-compose.ymlなどの記載内容をサポートしてもらいながら作成する。
最初の質問内容は以下の通りで、エラーなどが発生した場合はそのエラーメッセージを貼り付け、解決させる
PostgreSQL 11.15とPostgreSQL 15.3の環境をdocker-composeを用いて同時に接続可能な環境を構築する手順とファイルの記載内容を教えてほしい。
ポート番号は11.15は10011、15.3は10015とする。
また、言語やタイムゾーンは日本とする。
PostgreSQL 11.xxのDockerfileを作成する
まずは、現行のバージョンである11.xxの環境構築用のDockerfileを準備する。
基本的には、postgreの11.15のイメージに日本語環境用に設定するのみとする。
ファイル内容は以下の通り。
ファイル名は「Dockerfile_11」とする。
FROM postgres:11.15-bullseye
ENV POSTGRES_USER admin
ENV POSTGRES_PASSWORD admin
ENV POSTGRES_DB test_db
RUN apt-get update && apt-get install -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Time Zone
ENV TZ Asia/Tokyo
# Language
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
LANGUAGE="ja_JP:ja" \
LC_ALL="ja_JP.UTF-8"
PostgreSQL 15.xxのDockerfileを作成する
次に、移行先のバージョンの15.xxの環境構築用のDockerfileを準備する。
11.xxと条件を同じにするため、メインとなるコンテナイメージ以外は同じとする。
ファイルの内容は以下の通り。
ファイル名は「Dockerfile_15」とする。
FROM postgres:15.3-bullseye
ENV POSTGRES_USER admin
ENV POSTGRES_PASSWORD admin
ENV POSTGRES_DB test_db
RUN apt-get update && apt-get install -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Time Zone
ENV TZ Asia/Tokyo
# Language
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
LANGUAGE="ja_JP:ja" \
LC_ALL="ja_JP.UTF-8"
2つのコンテナを呼び出すdocker-compose.ymlファイルを作成する
先程作成した、Dockerfile_11とDockerfile_15を呼び出すだけだが、
ポート番号が重複しないように注意する。
ここでは、両バージョンに合わせてそれぞれ、以下のポート番号にする
- PostgreSQL 11.15 => ポート番号:10011
- PostgreSQL 15.3 => ポート番号:10015
docker-compose.ymlファイルの内容は以下の通り。
version: '3'
services:
postgres11:
build:
context: .
dockerfile: Dockerfile_11
container_name: postgres11
ports:
- "10011:5432"
volumes:
- ./pgdata11:/var/lib/postgresql/data
networks:
- postgres-network
postgres15:
build:
context: .
dockerfile: Dockerfile_15
container_name: postgres15
ports:
- "10015:5432"
volumes:
- ./pgdata15:/var/lib/postgresql/data
networks:
- postgres-network
networks:
postgres-network:
コンテナを起動と接続確認を行う
コンテナの起動
シンプルに以下のコマンドで実効する
$ docker-compose up -d
コンテナの状態を確認する
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
postgres11 db-con-test-postgres11 "docker-entrypoint.s…" postgres11 16 hours ago Up 26 minutes 0.0.0.0:10011->5432/tcp, :::10011->5432/tcp
postgres15 db-con-test-postgres15 "docker-entrypoint.s…" postgres15 16 hours ago Up 26 minutes 0.0.0.0:10015->5432/tcp, :::10015->5432/tcp
WSL2のターミナルからDB接続して確認する
WSL2のターミナルからであれば、psqlで以下のコマンドで接続可能だ。
PostgreSQL 11.15への接続
psql -h localhost -p 10011 -U admin -d test_db
PostgreSQL 15.3への接続
psql -h localhost -p 10015 -U admin -d test_db
WindowsからDB接続ツール等で接続して確認する
WSL2のターミナルから接続する場合との違いは、IPアドレスが異なる点です。
WSL2からであれば、localhost(127.0.0.1)で接続可能だが、Windows側からの場合、WSL2側に割当されているIPアドレスを指定する必要がある。
WSL2側でipコマンドで確認しよう。
「eth0」等で表示されているはずです。
以下の場合は、「172.21.142.238」を指定すればOKです。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:37:18:33 brd ff:ff:ff:ff:ff:ff
inet 172.21.142.238/20 brd 172.18.175.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe37:1833/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:12:ec:ba:b5 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:12ff:feec:bab5/64 scope link
valid_lft forever preferred_lft forever
まとめ
Dockerコンテナを利用することで、サクッとPostgreSQL 11.15と15.3の環境を構築することができた。
ChatGPTについても、比較的エラーなく記載方法を知ることができた。
質問するたびに微妙に回答がことなるのは気になるが、取り急ぎ動作させたい環境構築であれば十分だ。
参考:https://docs.docker.jp/engine/articles/dockerfile_best-practice.html