Laradockを用いてDocker + CentOS + Apache + PHP7 + PostgreSQLな環境を作る

# はじめに
業務でCodeIgniter用の環境を作る必要があり、Laradockを使用することにしました。
今回は純粋なサーバーサイドPHPのためNode.jsをインストールしない環境を構築します。

やりたいことは次の通りです。

* PHPの実行環境を作成する
* 作成したPHPのファイルにWebサーバー（Apache）でアクセスする
* DBにPostgreSQLを採用する
* PHPのリモートデバッグをする

それでは以下手順です。
Dockerやgitのインストールは済んでいるものとします。
テキストエディタはVisual Studio Codeを想定しています。

# Laradockの設定ファイルを編集する

まずはプロジェクトのディレクトリを作成し、そのディレクトリ内でLaradockをクローンします。

```
# ディレクトリを作成し移動する
$ mkdir dockerProject && cd dockerProject

#　Laradockをクローンする
$　git clone https://github.com/laradock/laradock.git

# Laradockのgit管理をやめる
$ rm -rf ./laradock/.git

# 後々必要となるディレクトリを先に作成する
$ mkdir web && mkdir db
```

.envファイルを作成し、内容を編集します。

```bash
# テンプレートをコピーしてenvファイルを作成する
$ cp ./laradock/env-example ./laradock/.env
```

```diff:dockerProject/laradock/env
# ローカル上のソースを置くディレクトリを指定する（8行目）
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../web

# ローカル上のソースをマウントするサーバー上のディレクトリを指定する（11行目）
- APP_CODE_PATH_CONTAINER=/var/www:cached
+ APP_CODE_PATH_CONTAINER=/var/www/html:cached

# データの保存先を変更する(14行目)
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=../db

# PHPのバージョンを変更する(35行目)
- PHP_VERSION=7.2
+ PHP_VERSION=7.1

# Nodeをインストールしない(75行目)
- WORKSPACE_INSTALL_NODE=true
+ WORKSPACE_INSTALL_NODE=false

# Yarnをインストールしない(78行目)
- WORKSPACE_INSTALL_YARN=true
+ WORKSPACE_INSTALL_YARN=false

# Redisをインストールしない(80行目)
- WORKSPACE_INSTALL_PHPREDIS=true
+ WORKSPACE_INSTALL_PHPREDIS=false

# Xdebugをインストールする(83行目)
- WORKSPACE_INSTALL_XDEBUG=false
+ WORKSPACE_INSTALL_XDEBUG=true

# PostgreSQLクライアントをインストールする(107行目)
- WORKSPACE_INSTALL_PG_CLIENT=false
+ WORKSPACE_INSTALL_PG_CLIENT=true

# Xdebugをインストールする(127行目)
- PHP_FPM_INSTALL_XDEBUG=false
+ PHP_FPM_INSTALL_XDEBUG=true

# PostgreSQLドライバーをインストールする(136行目)
- PHP_FPM_INSTALL_PGSQL=false
+ PHP_FPM_INSTALL_PGSQL=true

# PostgreSQLクライアントをインストールする(140行目)
- PHP_FPM_INSTALL_PG_CLIENT=false
+ PHP_FPM_INSTALL_PG_CLIENT=true

# PostgreSQLドライバーをインストールする(145行目)
- PHP_WORKER_INSTALL_PGSQL=false
+ PHP_WORKER_INSTALL_PGSQL=true

# HTTP, HTTPSのポートを変更する(158, 159行目)
- APACHE_HOST_HTTP_PORT=80
- APACHE_HOST_HTTPS_PORT=443
+ APACHE_HOST_HTTP_PORT=8080
+ APACHE_HOST_HTTPS_PORT=8443

# DocumentRootを変更する(165行目)
- APACHE_DOCUMENT_ROOT=/var/www/
+ APACHE_DOCUMENT_ROOT=/var/www/html
```

Apache2のDockerfileを編集します。

```diff:dockerProject/laradock/apache2/Dockerfile
# OSをUbuntuからCentOSに変更する(1行目)
- FROM webdevops/apache:ubuntu-16.04
+ FROM webdevops/apache:centos-7
```

PostgreSQLのDockerfileを編集します。

```diff:dockerProject/laradock/postgres/Dockerfile
# PostgreSQLのバージョンを指定してインストールする(1行目)
- FROM postgres:alpine
+ FROM postgres:9
```

# Dockerでコンテナを立ち上げる

イメージをビルドしてコンテナを起動します。

```bash
# docker-compose.ymlのあるディレクトリに移動する
$ cd laradock

# イメージをビルドしてコンテナをバックグラウンドで起動する(初回は時間が掛かります)
$ docker-compose up -d --build workspace postgres php-fpm apache2
```

ブラウザでlocalhost:8080にアクセスします。

![スクリーンショット 2018-06-10 22.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/237863/63b1dfcf-5cb7-1eb3-4506-4cdf6d7e2270.png)

# PHPを実行する

webディレクトリ配下にindex.phpを作成します。

```php:dockerProject/web/index.php
<?php
echo 'Hello from docker!<br>';
phpinfo();
```

作成できたら再度ブラウザでlocalhost:8080にアクセスします。

![スクリーンショット 2018-06-10 22.49.39.png](https://qiita-image-store.s3.amazonaws.com/0/237863/76968d90-65be-d20b-5a5a-ff218685256a.png)

# DBに接続する

PHPでPostgreSQLに接続してみます。

```diff:dockerProject/web/index.php
  <?php
  echo 'Hello from docker!<br>';

+ $connection_string = "host=postgres dbname=default user=default password=secret port=5432";

+ $link = pg_connect($connection_string);

+ if ($link) {
+   $db_name = pg_dbname($link);
+   echo '接続に成功しました。<br>';
+   echo '現在接続しているDBは' . $db_name . 'です。<br>';
+ } else {
+   echo '接続に失敗しました。<br>';
+ }

+ $close_flg = pg_close($link);

+ if ($close_flg) {
+   echo '切断に成功しました。<br>';
+ }

  phpinfo();
```

![スクリーンショット 2018-06-16 11.17.52.png](https://qiita-image-store.s3.amazonaws.com/0/237863/2a264915-c020-4148-bab9-22a3f1411da6.png)

コマンドラインからpsqlコマンドを使用してみます。

```
workspaceコンテナのbashを起動する
$ docker-compose exec workspace bash

ホスト名（コンテナ名）とユーザ名（ロール名）を指定してpsqlモードに入る
# psql -h postgres -U default
Password for user default: secret
```
![スクリーンショット 2018-06-15 2.15.25.png](https://qiita-image-store.s3.amazonaws.com/0/237863/2f2d8e2b-783b-d038-1a36-d1e654b8496a.png)

# DBを切り替える（自分で作成したDBに接続する）

デフォルトではなく、自分で作成したデータベース・ユーザーで接続してみます。

```
# psql -h postgres -U default
Password for user default: secret

# create user testuser with password 'testpassword';

# create database testdb with owner testuser;

# \du

# \l

# \q
```

![スクリーンショット 2018-06-16 11.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/237863/53119e1f-77fc-5636-aa84-5ec5dd17c8f8.png)
![スクリーンショット 2018-06-16 11.37.32.png](https://qiita-image-store.s3.amazonaws.com/0/237863/4004896a-1c5a-d2c8-7093-43091e7386c7.png)

index.php を編集します。

```diff:dockerProject/web/index.php
  <?php
  echo 'Hello from docker!<br>';

- $connection_string = "host=postgres dbname=default user=default password=secret port=5432";
+ $connection_string = "host=postgres dbname=testdb user=testuser password=testpassword port=5432";

  $link = pg_connect($connection_string);

  if ($link) {
    $db_name = pg_dbname($link);
    echo '接続に成功しました。<br>';
    echo '現在接続しているDBは' . $db_name . 'です。<br>';
  } else {
    echo '接続に失敗しました。<br>';
  }

  $close_flg = pg_close($link);

  if ($close_flg) {
    echo '切断に成功しました。<br>';
  }

  phpinfo();
```

![スクリーンショット 2018-06-16 11.40.43.png](https://qiita-image-store.s3.amazonaws.com/0/237863/24ac662b-24db-3e4e-a540-a78b3621a554.png)

# PHPのリモートデバッグを行う

php-fpmディレクトリ配下のxdebug.iniを編集します。

```diff:dockerProject/laradock/php-fpm/xdebug.ini
# 3行目
- ; xdebug.remote_host=dockerhost
+ xdebug.remote_host=docker.for.mac.localhost  (Docker for Macの場合)
+ xdebug.remote_host={Vagratのホストマシンの接続IPアドレス}  （Vagratの場合）

# 4行目
- xdebug.remote_connect_back=1
+ xdebug.remote_connect_back=0

# 5行目
- xdebug.remote_port=9000
+ xdebug.remote_port=9001

# 8行目
- xdebug.remote_autostart=0
+ xdebug.remote_autostart=1

# 9行目
- xdebug.remote_enable=0
+ xdebug.remote_enable=1

# 10行目
- xdebug.cli_color=0
+ xdebug.cli_color=1

# 最終行に追加
+ xdebug.remote_log="/tmp/xdebug_log"
```

workspaceディレクトリ配下のxdebug.iniを編集します。

```diff:dockerProject/laradock/workspace/xdebug.ini
# 3行目
- ; xdebug.remote_host=dockerhost
+ xdebug.remote_host=docker.for.mac.localhost  (Docker for Macの場合)
+ xdebug.remote_host={Vagratのホストマシンの接続IPアドレス}  （Vagratの場合）

# 4行目
- xdebug.remote_connect_back=1
+ xdebug.remote_connect_back=0

# 5行目
- xdebug.remote_port=9000
+ xdebug.remote_port=9001

# 8行目
- xdebug.remote_autostart=0
+ xdebug.remote_autostart=1

# 9行目
- xdebug.remote_enable=0
+ xdebug.remote_enable=1

# 10行目
- xdebug.cli_color=0
+ xdebug.cli_color=1

# 最終行に追加
+ xdebug.remote_log="/tmp/xdebug_log"
```

設定ファイルを編集し終わったらコンテナを停止・削除し、再びイメージをビルドしてコンテナを起動します。

```
$ docker-compose down

$ docker-compose up -d --build workspace postgres php-fpm apache2
```

Visual Studio Code で PHP Debug の拡張をインストールします。
![スクリーンショット 2018-06-16 21.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/237863/db9c9418-9637-293d-c2d2-79b4e91615ba.png)

インストールしたら左のサイドメニューからデバッグのアイコンをクリックし、上部の歯車アイコンをクリックします。
![スクリーンショット 2018-06-16 21.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/237863/09dc7c57-4e5b-b566-ba9e-7c504c3d0b8f.png)
PHPを選択します。
![スクリーンショット 2018-06-16 21.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/237863/a6204b0e-984b-1c2a-f52d-ff0d53e2911c.png)

launch.jsonというファイルが作成されるので下記のように編集します。

```diff:dockerProject/.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
+     "pathMappings": {
+       "/var/www/html": "${workspaceRoot}/web",
+     },
-     "port": 9000
+     "port": 9001

    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "program": "${file}",
      "cwd": "${fileDirname}",
      "port": 9000
    }
  ]
}
```

ステップ実行で止めたい部分にブレイクポイントを貼ります。

![スクリーンショット 2018-06-17 2.43.21.png](https://qiita-image-store.s3.amazonaws.com/0/237863/373e31ce-7bf8-be28-3f16-b4b0dedc7236.png)

F5キーを押してデバッグを起動します。

![スクリーンショット 2018-06-17 2.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/237863/50f205a8-3385-e53b-6ee5-c957af87d81a.png)

ブラウザでlocalhost:8080にアクセスします。
するとブレイクポイントを張った箇所でストップしてデバッグができます。

![スクリーンショット 2018-06-17 2.45.44.png](https://qiita-image-store.s3.amazonaws.com/0/237863/f6d61074-1a34-6f62-db7b-10e7071c0c61.png)


以上で Laradock を使ったPHPの実行環境が作成できました。