PostgreSQL11.15とPostgreSQL15.3の環境をDockerで構築する方法

2023年7月23日Docker,Database,AI

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

Docker,Database,AI

Posted by snow