Dockerでpostgresとpgweb（GUI）を構築した

DockerによるPHP、Apache、PostgreSQLの開発環境を構築した時の流れをまとめようと思います。

また、データベース管理インタフェースを使うと直感的に操作できて便利なので、PostgreSQLについてはモダンなUIであるpgwebも導入してみます。
## 環境
- Mac for Docker
- Apache2.4
- PHP7.1
- PostgreSQL9.6

## 構成
<img width="318" alt="スクリーンショット 2020-08-11 12.15.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415222/5ee30910-169b-d84c-765e-3ead4e026e0d.png">

## ファイル群
docker/web/Dcokerfileに以下を記述します。

```docker/web/Dockerfile
FROM php:7.1-apache

COPY ./php.ini /usr/local/etc/php/

RUN set -ex apk --no-cache add postgresql-dev libpq-dev && \
    apt-get update && apt-get install -y libpq-dev \
    vim \
    less \
    && docker-php-ext-install pdo pdo_pgsql pgsql mbstring
```

docker/web/Dcokerfileと同じ階層にphp.iniを作成します。

```docker/web/php.ini
[Core]
display_errors = On
error_reporting = E_ALL
error_log = /var/log/apache2/error.log
log_errors = On

[Date]
date.timezone = 'Asia/Tokyo'

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = auto
mbstring.http_input = auto
mbstring.http_output = auto
mbsting.encoding_translation = Off
mbstring.detect_order = auto

```


dockerディレクトリにdocker-compose.ymlを作成します。

```docker/docker-compose.yml
version: '3'

services:
  web:
    build: ./docker/web/
    ports:
      - 8110:80
    volumes:
      - .:/var/www/html
    depends_on:
      - db
  db:
    image: postgres:9.3
    container_name: postgres
    ports:
      - 5433:5432
    volumes:
      - ./docker/db:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_DB: test
      POSTGRES_USER: test
  db-gui:
    image: sosedoff/pgweb
    container_name: "pgweb"
    ports:
      - "8081:8081"
    depends_on:
      - db
```

## 表示確認用ファイル作成

dockerディレクトリにindex.phpを作成します。
とりま、phpinfo()のみでOKです。


```docker/index.php
<?php

phpinfo();
```


## コンテナ立ち上げる
以下コマンドで実行します。

```
docker-compose up -d
```

コンテナ確認してみます。

```
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a25edb35c693        sosedoff/pgweb      "/usr/bin/pgweb --bi…"   10 seconds ago      Up 9 seconds        0.0.0.0:8081->8081/tcp   pgweb
e5f1ce8c159f        php_job_web         "docker-php-entrypoi…"   10 seconds ago      Up 9 seconds        0.0.0.0:8110->80/tcp     web
c2ae9b7b2ab6        postgres:9.3        "docker-entrypoint.s…"   11 seconds ago      Up 10 seconds       0.0.0.0:5433->5432/tcp   postgres

```

## ブラウザ確認
[localhost:8110](http://localhost:8110/)にアクセスします。
以下のように表示されればOKです。
<img width="1042" alt="スクリーンショット 2020-08-12 14.17.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415222/64548e3a-eb5a-c348-829e-941e4ed6e453.png">

## pgwebの設定
[localhost:8081](http://localhost:8081/)にアクセスします。
以下のように入力すれば接続できるはずです。

<img width="697" alt="スクリーンショット 2020-08-12 14.05.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415222/a11e1761-9f63-d04b-2c4b-69496710a5fe.png">

| 項目      |       値 | 
|:-----------------|------------------|
| Host    |データベースのコンテナ名| 
| Username    |             environmentのPOSTGRES_USER | 
| Password    |             空欄でOK（セキュリティ的にアウトなので注意）  | 
| Database    |              environmentのPOSTGRES_DB | 
| SSL Mode    |             disable | 

データベース管理ツールのpgwebからデータベースのアクセスするには、DBコンテナのIPが必要なのですが、docker-compose.yml に記載したデータベースコンテナ名でアクセス出来ます。

よって、Host名はデータベースのコンテナ名を指定しています。


## pgwebでテーブルを作ってみる
<img width="1042" alt="スクリーンショット 2020-08-12 14.47.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415222/146e76db-09d7-7054-10a7-8922f0eb98d0.png">

```
create table users (
  id integer, 
  name varchar(10)
);
```
をRunQueryしたらUsersテーブルの出来上がりです。

## まとめ
ご紹介したものは、あくまでローカルでの開発時を想定しており、本番利用には適さないです。

また、ローカルとはいえ、データベース認証をしっかり行うこと（ユーザー名・パスワードを分かりにくい文字列にするなど)を推奨します。

間違いがありましたらご指摘いただけますと幸いです。