どうも、nippa です。
前回の内容:
docker で postgresql の環境を構築してきましたが、コマンドの長さやコンテナの停止 、削除が非常に煩わしいです。
そこで今回は前回の内容を利用して docker-compose 化を行いと思います。
- 環境
- ディレクトリ構造
- dockerfile の作成
- init.sql の作成
- docker-compose.yaml の作成
- docker-compose の起動
- docker-compose の停止
- データベースへのアクセス
- 感想
環境
- macOS 10.15
- docker-compose 2.1
- PostgreSQL 14
ディレクトリ構造
今回は以下のようなディレクトリ構造です。
. ├── docker-compose.yaml └── postgresql/ ├── data/ ├── dockerfile └── init/ └── init.sql
data
は postgresql のデータが保存されるディレクトリ、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 を利用してコンテナの起動を行いま した。
これにより、起動設定がファイル化されるので、他の方と共有することもできるようにな ります。
コマンドの手間も省けるので、非常に便利ですね。
是非、使ってみてください。
ではでは、また次回。