PostgreSQL と PGAdmin の docker-compose

# docker-compose
何も考えずに PostgreSQL と PostgreSQL の管理ツール PGAdmin を起動する docker-compose を記載します。

:::note info
Docker がインストールされていることを前提としています。
:::

## docker-compose でDockerコンテナ起動 

下記の docker-compose.yml ファイルを任意の場所に配置し、ターミナルからコマンド一つで postgreSQL と  PGAdmin が使用できるようになります。


```docker-compose.yml
version: '3.8'

services:
  service_postgres:
    image: postgres:14
    container_name: container_postgres
    environment: 
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: testdb01
    ports: 
      - "5433:5432"
    volumes:
      - volume_postgres:/var/lib/postgresql/data
      - ./postgres_service/initdb.d:/docker-entrypoint-initdb.d

  service_pgadmin:
    image: dpage/pgadmin4:6.11
    container_name: container_pgadmin
    ports:
      - 8080:80
    volumes:
      - volume_pgadmin:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - service_postgres

volumes:
  volume_postgres:
    name: vpg
  volume_pgadmin:
    name: vpga

```

docker-compose.yml を任意のディレクトリ（ここでは C:/dev/labo/test-container01） の下に置き、ターミナルから「docker-compose up -d」コマンドを実行します。

```
PS C:\dev\labo\test-container01> docker-compose up -d  
Creating network "test-container01_default" with the default driver
Creating volume "vpg" with default driver
Creating volume "vpga" with default driver
Pulling service_pgadmin (dpage/pgadmin4:6.11)...
6.11: Pulling from dpage/pgadmin4
Digest: sha256:2b1ed86bdde8088129c93f652d8601a31ce9660decab1314a50c2eb18240f3e1
Status: Downloaded newer image for dpage/pgadmin4:6.11
Creating container_postgres ... done
Creating container_pgadmin  ... done
PS C:\dev\labo\test-container01> 

```

PostgresSQL と PGAdmin のコンテナが立ち上がりました。

次に「docker-compose ps」コマンドで立ち上がっているコンテナの一覧を確認します。

```
PS C:\dev\labo\test-container01> docker-compose ps
       Name                     Command              State               Ports
------------------------------------------------------------------------------------------
container_pgadmin    /entrypoint.sh                  Up      443/tcp, 0.0.0.0:8080->80/tcp
container_postgres   docker-entrypoint.sh postgres   Up      0.0.0.0:5433->5432/tcp
PS C:\dev\labo\test-container01> 
```

## PGAdmin

pgadminを使ってデータベースに接続します。
まずはブラウザで「http://localhost:8080」を表示します。

![FireShot Capture 001 - pgAdmin 4 - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345460/993ae069-4f8f-7ef2-782a-653bb9861a22.png)

Email Adress に [example@example.com]
Password に [password]
を入力してログインします。

![FireShot Capture 002 - pgAdmin 4 - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345460/1ebcd9f4-6f7a-0d32-34c4-589414ca9e65.png)


Serversを右クリック⇒登録⇒サーバ...

![FireShot Capture 003 - pgAdmin 4 - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345460/61cbfc84-7553-662d-03ab-f6cecff7ad47.png)

名前：service_postgres


![FireShot Capture 004 - pgAdmin 4 - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345460/7278d261-a10c-0051-d1cc-8da892705c08.png)

ホスト名：service_postgres
ポート番号：5432
管理用データベース：postgres
ユーザ名：postgres
パスワード：postgres
を入力し「保存」ボタンを押下します。


![FireShot Capture 005 - pgAdmin 4 - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345460/0306bf47-b763-cfbd-d185-be216f4e5d15.png)

作成したデータベースに接続できました。

## ポートフォワーディング

```
    ports: 
      - "5433:5432"
```
上記の記載でホストの 5433 ポートから service_postgres コンテナの 5432 ポートにフォワードしてます。
ホスト（ローカル端末）の 5433 にアクセスすると service_postgres コンテナの 5432 ポートにフォワードされます。 
気を付けるのは同じ docker-compose の内部（ここではservice_pgadmin コンテナ）からアクセスする場合はホストを経由しないで直接 service_postgres コンテナに接続するので 5432 ポートを指定します。

ローカル端末に A5 などのデータベース管理ツールを入れてデータベースに接続する場合は 5433 ポートを指定します。

## データの永続化
通常コンテナ内のデータはコンテナ内部に保存されるため、コンテナを削除するとデータも消えてしまいます。
コンテナが削除されてもデータベースのデータは残しておきたいシチュエーションは多いと思います。
そこでデータの保存先ディレクトリをコンテナの外側にマウントしておき、コンテナが消えてもデータが消えないようにしておきます。
```
～～～
    volumes:
      - volume_postgres:/var/lib/postgresql/data
～～～

volumes:
  volume_postgres:
    name: vpg
```

上記の指定では volume_postgres という ボリューム を定義し、 volume_postgres という ボリューム に service_postgres コンテナの /var/lib/postgresql/data ディレクトリをマウントしています。
/var/lib/postgresql/data ディレクトリは PostgreSQL がデータを保存するディレクトリです。
ボリューム は service_postgres コンテナの外側に存在しているため service_postgres コンテナを削除しても消えることはありません。