【環境構築】Docker×Laravel×MySql 


docker×laravel×mysqlを使った環境構築を行ったのでその手順をご紹介します。
初めてdockerで環境構築を行ったので、少しでも参考になればと思います。

<h1>環境</h1>

| 環境　　　　 | バージョン
|:-----------|------------
| PHP        | 7.0.27       
| FW    | CakePHP3.2.13   
| Apache       | 2.2.15       
| OS       | CentOS6.9       
| DB      | MySQL5.6.39       
 


<h1>手順</h1>
1. DockerフォルダDL
2. Git　Clone
3. Docker コンテナに入る
4. Apache起動
5. ドキュメントルート設定
6. Composer install
7. mysql起動
8. データベース作製
9. app.phpの設定
10. データベース接続

<h1>環境構築してみよう</h1>

<h2>DockerフォルダDL</h2>
今回は元々用意していたDockerFile,ymlファイルなどをまとめてダウンロードしてます。
下記、フォルダ構造になります。

<pre>
-/
 |- docker-compose.yml
 |- docker
    |- db
    |   |- Dockerfile
    |   |- files
    |      |- entry.sh
    |      |- my.cnf
    |     
    |
    |- web
        |- Dockerfile
        |- files
           |- composer.phar
           |- dev.conf
           |- php.ini
           |- ssl.conf
 
</pre>

<h2>Git Clone</h2>
githubにてプロジェクトの取得。
フォルダ構造は下記のようになりました。
<pre>
-/
 |- project
 |- docker-compose.yml
 |- docker
</pre>

<h2>Dockerコンテナに入る</h2>

コンテナに入る前にイメージの作製、コンテナを起動します。
コマンドラインで下記を実行する。

+ ビルド
<pre>
docker build
// ビルドすることでdocker fileからイメージが得られます。
</pre>

+ コンテナの起動
<pre>
$ docker-compose up -d
// コンテナを起動します。
</pre>
　下記のコマンドで、ビルドとコンテナの起動を一度に行えます。

+ ビルドとコンテナの起動
<pre>
$ docker-compose up -d --build
// イメージのビルドから始めてコンテナを起動します。
</pre>

<pre>
$ docker ps
//起動中のコンテナの確認
</pre>

　<h4>オプション-dについて</h4>
<pre>
$ docker-compose up
// ターミナルでコンテナを起動しているため、同じターミナルでは作業できない。

$ docker-compose up -d
// コンテナをバックグラウンドで起動するため、同じターミナルで作業ができる。
</pre>

下記のコマンドでコンテナに入ります。
<pre>
$ docker exec -it CONTAINER ID /bin/bash
//CONTAINER IDは docker psをした際に確認できます。
</pre> 
<h2>Apache起動</h2>
webコンテナ内で、下記コマンドでApache起動する。

<pre>
service httpd start
Apache起動

service httpd stop
Apache停止

service httpd restart
Apache再起動

/etc/init.d/httpd status
Apache状態確認
</pre>
<h2>ドキュメントルート設定</h2>
web内のhttpd.confのドキュメントルートの設定を確認します。
今回のディレクトリ構造だとvar/www/htmlで問題なさそうです。

<h2>composer install</h2>
composer installができませんでした。
アクセス権限の問題だと思い、アクセス権限777に変更しました。
アクセス権限に関しては下記の記事を参考にしました。
https://qiita.com/t-a-run/items/239ed690ece7a011804a

下記、実行できました。
因みに、composer installはprojectフォルダで行いました。
<pre>
compser install
</pre>

この状態でアクセスするとデータベースエラーとブラウザに表示されます。
エラーの内容は、そのような（接続した）ファイルは見つからない。
<pre>
database error(SQLSTATE[HY000] [2002] No such file or directory
</pre>

<h2>mysql起動</h2>
mysqlを動作させます。
webコンテナに入った時、同様にdbコンテナに入ります。

<pre>
service mysqld status
//mysqlの起動状態の確認
service mysqld start
//mysqlの起動
</pre>
ログイン前に初期のユーザー名とパスワードを確認します。
DBコンテナ内でmysqld.logを確認します。
<pre>
cat mysqld.log
</pre>
A temporary password is〜に書いてあるユーザー名パスワードを取得。
ユーザー名:root

データベースにログインします。
<pre>
docker exec -it コンテナID mysql -u root -p
</pre>

パスワード再設定->データベース作製->テーブル作成をおこないます。

<h2>app.phpの設定</h2>
git clone時には、app.phpは含まれていません。作成しましょう。
<pre>
-/
 |- project
    |- config
        |-app.php
</pre>
app.phpの書き方はネットで検索すると出てきます。今回は他で使っていたファイルをそのままコピーして中身を編集しました。主にデータベースのしか触っていないです。
<pre>
 'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'root',
            'password' => 'データベース作成時に設定したパスワード',
            'database' => 'データベース作成時に設定したパスワード',
            'port' => ポート番号,
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
</pre>

cat mysqld.log
A temporary password isに書いてあるパスワードを取得
->dbコンテナでmysqlをrestartし、ログイン->パスワード再設定->データベース作製->テーブル作成->


<h2>データベース接続</h2>
sequel proを使い、クイック接続にて接続テストを実行しました。
無事に接続完了しました。

ブラウザでlocalhostと検索すると無事開けました。

<h1>参考資料</h1>

docker-compose.yml の内容を理解しよう
https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/

Docker compose ことはじめハンズオン
https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a

Dockerfileの書き方と使い方
https://blog.codecamp.jp/docker-file-how-to

起動中の docker コンテナのシェルに入る
https://qiita.com/sekizo/items/27cc9b406332afc674f6

データベース作製
https://noumenon-th.net/programming/2019/04/01/docker-entrypoint-initdb01/

chmodで設定する権限の書き方
https://qiita.com/irasally/items/6ebc3c68e22905fb7330