VirtualBox上のCentOS7にdockerでpostgresql+PHP+Apache環境を構築

## はじめに
かなり期間が空いてしましましたが、
ローカル環境にVirtualBoxを使用して開発環境を構築する作業の3回目です。
[前々回](https://qiita.com/spaciba_h_t/items/e9dac4de27c7d44c5be6)はDBサーバ、
[前回](https://qiita.com/spaciba_h_t/items/5c68211ed715e684de67)はWEBサーバを構築しました。
今回は、DBサーバ＋WEBサーバ＋PHPアプリの環境を構築します。
イメージとしては、DBの値を取得して、WEBサーバ上にPHPで表示します。

## 作業環境
- MacOS X Yosemite 10.10.5 

## 1.Docker Compose
今回は「Docker Compose」を使用して、複数のサーバを一度に操作する手順でまとめます。
インストール手順は、[公式サイト](https://docs.docker.com/compose/install/)の手順を参考に実施してください。


## 2.ディレクトリ構成
今回は以下の構成で各ファイルを用意しました。

```
docker-php-postgres
┣ docker-compose.yml   // Docker Composeの設定ファイル(3.参照)
┣ docker-file
┃ ┣ db
┃ ┃ ┣ Dockerfile   // DBサーバ用のDockerfile(4.参照)
┃ ┃ ┣ docker-entrypoint-initdb.d
┃ ┃   ┣ 01_createdb.sql   // DB作成用SQL
┃ ┣ web
┃   ┣ Dockerfile   // WEBサーバ用のDockerfile(６.参照)
┃   ┣ php.ini      // PHP設定ファイル(７.参照)
┣ volumes
  ┣ web
    ┣ html
      ┣ index.php   // PHPファイル(８.参照)
```

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

services:

  web:
    build: ./docker-file/web/
    ports:
      - 8080:80
    volumes:
        - ./volumes/web/html/:/var/www/html:z   // :zを忘れないように。
    depends_on:
      - db

  db:
    build: ./docker-file/db/
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=testuser
      - POSTGRES_PASSWORD=password
```

## 4. DBサーバ用Dockerfile
```
FROM postgres:9.3

RUN apt-get update

RUN apt-get install -y vim less

COPY ./docker-entrypoint-initdb.d/01_createdb.sql /docker-entrypoint-initdb.d/

EXPOSE 5432
```

## ５. DB作成用SQL
DB作成用SQLとテーブル作成SQLファイルをdocker-entrypoint-initdb.d配下に作成します。
今回は「01_createdb.sql」という名称で
testdbというDB、test_tableというテーブルを作成します。
test_tableテーブルには、idカラムとkeywordカラムを用意して、
適当な値を設定しておきます。

## ６. WEBサーバ用Dockerfile
```
# Apache モジュールが同梱された PHP コンテナイメージ
FROM php:apache

RUN apt-get update

RUN apt-get install -y vim less

# Postgres関連のPHPエクステンションをインストール
RUN set -ex apk --no-cache add postgresql-dev libpq-dev

RUN apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql pgsql mbstring

# PHPの設定ファイルをコピー
COPY ./php.ini /usr/local/etc/php/
```

## 7. PHP設定ファイル
```
[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
```

## 8. PHPファイル
DBのテーブル内容を取得して、出力する単純なPHPファイルです。

```
$conn = "host=docker-php-postgres_db_1 port=5432 dbname=testdb user=testuser password=password";
$link = pg_connect($conn);
if (!$link) {
    exit('接続失敗です。'.pg_last_error());
}

pg_set_client_encoding("sjis");

$result = pg_query('SELECT id, keyword FROM test_table');
if (!$result) {
    exit('クエリーが失敗しました。'.pg_last_error());
}

for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
    $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
    print('id='.$rows['id']);
    print(',keyword='.$rows['keyword'].'<br>');
}

$close_flag = pg_close($link);

if (!$close_flag){
    print('切断に失敗しました。<br>');
}

?>
</body>
</html>
```

## 9. コンテナ起動
3.〜8. のファイルが準備でき次第、以下のコマンドを実行します。
このコマンドはビルドまで行ってくれます。

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

ビルドのみ行いたい場合は、以下のコマンドを実行します。

```
$ docker-compose build
```

コマンドを実行した後、コンテナが起動したかどうかを以下のコマンドで確認します。

```
$ docker-compose ps
root@localhost docker-php-postgres]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
f078f9167ad6        docker-php-postgres_web   "docker-php-entryp..."   41 seconds ago      Up 36 seconds       0.0.0.0:8080->80/tcp     docker-php-postgres_web_1
c51a280c6d44        docker-php-postgres_db    "docker-entrypoint..."   45 seconds ago      Up 41 seconds       0.0.0.0:5432->5432/tcp   docker-php-postgres_db_1
```

起動ができたら、ブラウザから起動したWEBサーバのindex.phpにアクセスしてみます。
アクセスして、テーブルの内容が表示されていたら、完了です。

http://【VirtualBox IPアドレス】：８０８０/index.php


![スクリーンショット 2019-09-29 19.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32142/5b8d6531-984e-46b8-aaa9-a96ed7f0ce6d.png)


## 10. コンテナの停止
コンテナの停止は以下のコマンドを実行します。

```
$ docker-compose stop
```

 ---
これでDBサーバ＋WEBサーバ＋PHPアプリの環境を構築できました。
今回の学習したものをベースに、
dockerを使用した様々な環境構築を実施していきたいと思っています。

## 参考URL
https://www.key-p.com/blog/staff/archives/106755
https://docs.docker.com/compose/install/
https://qiita.com/uhooi/items/fb14d99d3323bd2eee9d
https://mizominton.hatenablog.jp/entry/docker-cakephp1.3
https://qiita.com/nagi244/items/e5de6fc062fdcc5004e9