Docker Composeを用いてLAMP環境構築 -- php.iniの設定とmysqlへのアクセス

## はじめに
[前回の記事](https://qiita.com/NNKK1234/items/8daff05e83a2673edaab)では、Docker Composeを使用してLAMP環境を構築してみました。しかし、実際にphpからmysqlを操作するためには、php.iniの設定や必要なパッケージのインストールを行わなくてはいけません。今回は、それらをDockerの機能を利用して行います。

## ファイル準備
###### ディレクトリ構成
```
/ -- docker-compose.yml
               web-php/ -- Dockerfile
                           php.ini

                  html/ -- index.php
                           sqlTest.php
```

###### docker-compose.yml
前回と同じ内容を使用します。

###### web-php / Dockerfile
```Dockerfile:Dockerfile
FROM php:7.3-apache

# コマンドを連続して記述したい場合は \ && で区切る
RUN docker-php-ext-install pdo_mysql \
    && docker-php-ext-enable pdo_mysql

# COPY コピー元ファイル コピー先ディレクトリ
COPY ./php.ini /usr/local/etc/php/
```

###### web-php / php.ini
```ini:php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese
```

###### html / index.html
```php:index.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Test Page Welcome!</h1>
    <div>----------------------------------------------------------------------------</div>
    <?php phpinfo() ?>
</body>
</html>
```

###### html / sqlTest.php
```php:sqlTest.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>SQL Test Page</h1>

    <?php 
        $dsn = 'mysql:dbname=test_db;host=db';
        $user = 'root';
        $password = 'password';

        try {
            $dbh = new PDO($dsn, $user, $password);

            print("接続成功<br>");

            $dbh->query('SET NAMES sjis');

            $sql = "select * from test_tb";

            $dbData = $dbh->query($sql);
        }catch (PDOException $e) {
            print('接続不可:'.$e->getMessage());
            die();
        }

        $dbh = null;
    ?>

    <p>DB取得データ</p>
    <ul>
        <li>
            <?php 
            
                foreach ($dbData as $item) {
                    print($item['id']);
                    print(" | ");
                    print($item['name'].'<br>');
                }
            
            ?>
        </li>
    </ul>
</body>
</html>
```

###### ポイント
- web-php / Dockerfile
RUNを使用してパッケージ「pdo_mysql」をインストールし、有効化しています。
COPYを使用してローカルに作成したphp.iniをコンテナ内にコピーする。

- html / sqlTest.php
PDO関数に渡す引数でhostの設定に関して、hostネームはdockerのコンテナ名になります。今回は、mysqlのコンテナを「db」という名称で構築しているため、host=dbとします。

## LAMP環境を構築する
###### コンテナを作成する
以下のコマンドでコンテナを作成しましょう。
```
docker-compose up -d
```
コンテナが起動した状態で、すでにphp.iniの設定ファイルとpdoメソッドを利用するためのパッケージのインストールなどは完了しています。

###### mysqlにテストデータを用意する
次にデータベースにテスト用にデータを用意しましょう。mysqlを直接操作したいので、mysqlを立ち上げているコンテナに入ります。
コンテナへの入り方については、[こちら](https://qiita.com/Keitaroooo/items/a30bf4eb9310d7b3f7cd)の記事がわかりやすく書いてくださっています。
コンテナに入れたらmysqlにデータを用意していきます。
```sql
-- データベースを作成
create database test_db

-- テーブルを作成
create table test_tb (id int, name varchar(15));

-- データを追加
insert into test_tb values (1, 'taro');
```

###### 確認
以下にアクセスするとphpでmysqlのデータを取得できていることが確認できます。
```
http://localhost:8080/sqlTest.php
```

## 今後の課題
Docker-Composeを使用してLaravel環境を構築する

## 参考文献
- [【PHP・Laravel】peclとは何か？pecl install と docker-php-ext-installの違い。docker-php-ext-enableなどの使い方を実例で解説（pearとの違い）](https://prograshi.com/language/php/pecl-install-docker-php-ext-install/)
- [dockerのコンテナの中に入る - Qiita](https://qiita.com/Keitaroooo/items/a30bf4eb9310d7b3f7cd)
- [PDOの利用 - PHP入門](https://www.javadrive.jp/php/pdo/)