IT技術で仕事を減らしたい!

素人ITエンジニアのメモ+α

Docker PostgreSQLの環境構築(その3)

どうも、nippa です。

前回の内容:

timesaving.hatenablog.com

docker で postgresql の環境を構築してきましたが、コマンドの長さやコンテナの停止 、削除が非常に煩わしいです。

そこで今回は前回の内容を利用して docker-compose 化を行いと思います。

環境

ディレクトリ構造

今回は以下のようなディレクトリ構造です。

.
├── docker-compose.yaml
└── postgresql/
    ├── data/
    ├── dockerfile
    └── init/
        └── init.sql

datapostgresql のデータが保存されるディレクトリ、initはコンテナの初回起動 時に実行されるスクリプトを格納するディレクトリになります。

dockerfile の作成

dockerfile の内容は前回同様です。

FROM postgres:14-alpine

# Time Zone
ENV TZ Asia/Tokyo

init.sql の作成

初回起動時に実行される SQL スクリプトです。内容は前回同様です。

/* Variables */
\set user_name test
\set user_password test
\set database_name test
\set schema_name public
\set table_name users
\set table_name_seq users_id_seq

/** CREATE ROLE **/
CREATE ROLE :user_name WITH LOGIN PASSWORD :'user_password';

/** CREATE DATABASE **/
CREATE DATABASE :database_name OWNER = :user_name TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';

/** TIMEZONE Asia/Tokyo **/
ALTER DATABASE :database_name SET timezone to 'Asia/Tokyo';

/** GRANT FOR DATABASE **/
GRANT ALL ON DATABASE :database_name TO :user_name;
ALTER ROLE :user_name SET search_path TO :schema_name;

/** CONNECTION DATABASE **/
\c :database_name

/** CREATE TABLE **/
CREATE TABLE IF NOT EXISTS :schema_name.:table_name (
    id          serial PRIMARY KEY,
    username    VARCHAR ( 50 ) UNIQUE NOT NULL,
    password    VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL
);

/** GRANT FOR TABLE **/
GRANT ALL ON :schema_name.:table_name TO :user_name;
GRANT ALL ON :schema_name.:table_name_seq TO :user_name

docker-compose.yaml の作成

docker-compose.yaml には docker の起動情報を記載します。

前回は、以下のコマンドを利用して起動していました。

docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=admin -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgresql

これを docker-compose.yaml に落とし込むと以下のようになります。

version: "3"
services:
  postgres:
    build: ./postgresql
    container_name: postgre
    hostname: postgre
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
      - ./postgresql/init:/docker-entrypoint-initdb.d

docker-compose の起動

以下のコマンドで docker-compose を起動します

docker-compose up -d

起動後の確認には以下のコマンドで確認できます。

docker-compose ps

# 出力
NAME                COMMAND                  SERVICE             STATUS              PORTS
postgre             "docker-entrypoint.s…"   db                  running             0.0.0.0:5432->5432/tcp

また、コンテナの log を確認する場合には、logs オプションで確認可能です。

docker-compose logs [service名]

# 今回は
docker-compose logs postgres

docker-compose の停止

docker-compose の停止は以下のコマンドで行います。

docker-compose down

データベースへのアクセス

PostgreSQL クライアントで接続可能です。

psql -U test -h localhost -d test

データの確認を行います。

# データの確認
test=> select * from users;
 id | username | password | email | created_on
----+----------+----------+-------+------------
(0 rows)


# データの挿入
test=> INSERT INTO users (username, password, email, created_on) VALUES ('Yamada Taro', 'yamadatraro', 'yamada-taro@example.com', now());

# データの確認
test=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-20 15:15:25.074613
(1 row)

docker-compose を停止して、データが引き継がれているかを確認します。

docker-compose down

# 停止の確認
docker-compose ps

# 起動
docker-compose up -d

# 起動の確認
docker-compose ps

データベースの内容を確認します。

psql -U test -h localhost -d test

データを select してみます。

# データの確認
test=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-20 15:15:25.074613
(1 row)

データが引き継がれていることが確認できます。

感想

前回 docker をコマンドで起動していましたが、今回はその起動設定を docker-compose.yaml に記載して、docker-compose を利用してコンテナの起動を行いま した。

これにより、起動設定がファイル化されるので、他の方と共有することもできるようにな ります。

コマンドの手間も省けるので、非常に便利ですね。

是非、使ってみてください。

ではでは、また次回。