DockerでcakePHP環境構築(〜ブラウザ表示まで)

CakePHPを触って見ようと思い + Dockerにも慣れたかったので、
DockerでCakePHPの環境を作ってみました。
今回はDockerHubにあるオフィシャルのPHPイメージを元に作成しました。

#PHPベースイメージの取得・作成

```console
$ docker pull php
```

#コンテナ作成

```console
$ docker run -it -v /cakephp:/usr/src/cakephp -p 80:80 --name="cake" [イメージID] bash

root@f36eb81a38bf:/#
```
これでコンテナを作成しbashコマンドまで実行できる。
上記のようにコンテナ内に入れるのでここで必要なパッケージ等のインストールをしていく。


#composerインストール

```console
# cd usr/src/cakephp
# curl -sS https://getcomposer.org/installer | php
```
※実際は`#`の前にパスが表示されますがここでは省略してます。
(参考)[composerドキュメント日本語訳](https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html)
(-s：進捗やエラーを表示しない/ -sS：エラーだけ表示して進捗は表示しない)

#composerコマンドを使えるように
・パスがある場所にcomposer.pharを移動する

```console
# mv composer.phar /usr/local/bin/composer
```
(参考)http://blog.toshimaru.net/how-to-use-composer-autoload/

#gitインストール(Cakeプロジェクト作成に必要)
ベースにしたphpの公式イメージのOSは`alpine`を使っている風な感じでしたが、パッケージ管理は`apt-get`でした。(`apk`は入ってませんでした)
※実際に`cat /etc/issue`でディストリビューションを調べると`Debian`でした。

```console
# apt-get install -y git
```

#vimインストール(ファイル編集用※vi使うならなくてもいい)

```console
# sudo apt-get install -y vim
```

#CakePHPに必要なPHP拡張をインストール

公式に記載されているPHP拡張をインストールします。

##①mbstring拡張
・インストール済み(ベースイメージに含まれていたようです)
(確認方法)
・`aptitude`というパッケージ管理ソフトで調べました。(他に方法あると思う)
 (aptitude：パッケージを検索・更新・削除できるコマンド)

```console
# apt-get install -y aptitude
# aptitude search php-mbstring
p   php-mbstring                                                                     
p   php-symfony-polyfill-mbstring
p   php7.0-mbstring
```

##②intl拡張
・dockerのphp公式イメージが用意した`docker-php-ext-install`で拡張を入れます
・コンテナ内から実行できます。

```console
# docker-php-ext-install intl
```
##③simplexml拡張
・インストール済み(ベースイメージに含まれていたようです)

##④mysql拡張
・これを入れてないと、あとでサーバーを起動した時にmysql拡張が無いと怒られます。

```console
# docker-php-ext-install pdo pdo_mysql
```

##php-zip拡張
・後でcomposerでCakePHPのプロジェクトをインストールする時にphp-zipが無いとdistではなく直接sourceからダウンロードすることになり時間がかかります。

###zlibインストール
・php-zipをインストールするためにzlibが必要なのでまずはzlibをインストール

```console
# apt-get install -y zlib1g-dev
```

###php-zipインストール

```console
# docker-php-ext-install zip
```
・php-zipではなくzip

(参考)[docker-php-ext-install Reference](https://gist.github.com/giansalex/2776a4206666d940d014792ab4700d80)

#composerでCakePHPプロジェクトの作成

```console
# composer self-update && composer create-project -y --prefer-dist cakephp/app my_app_name
```

#サーバー起動
・`bin/cake server`でサーバーを起動します。

##①bin/cakeの実行権限を付与
・デフォルトではrwのみになっている模様。

```console
# cd my_app_name
# chmod +x bin/cake
```


##②サーバー起動

```
# bin/cake server -H 0.0.0.0 -p 80
Welcome to CakePHP v3.5.11 Console
---------------------------------------------------------------
App : src
Path: /usr/src/cakephp/cake-pj/src/
DocumentRoot: /usr/src/cakephp/cake-pj/webroot
---------------------------------------------------------------
built-in server is running in http://0.0.0.0:80/
You can exit with `CTRL-C`
```

引数を指定しないと、`http://localhost:8765/`でアクセスできる。
今回`docker run`の際にポートを`80:80`で指定したので上記のようにホスト、ポートを指定して実行。
これでビルトインサーバーが起動します。
ブラウザから`0.0.0.0:80`でアクセスすると表示されます。

#exitで終了した後再度起動するとき

```console
# exit
$ docker start -i [コンテナID]
# (再度入れる)
```

#おまけ(便利だったパッケージ)
・`apt-file`：特定のファイルが含まれているパッケージを探す
・zlibをインストールする時にパッケージを探す際に使いました。

```console
# apt-file search /usr/include/zlib.h
zlib1g-dev: /usr/include/zlib.h
# apt-get install -y zlib1g-dev
```
(参考)
http://d.hatena.ne.jp/embedded/20081101/p3
http://www.atmarkit.co.jp/ait/articles/1709/08/news020.html

(参考)
[CakePHP インストール](https://book.cakephp.org/3.0/ja/installation.html)

#今後
・作成したコンテナからイメージを作成する
・コンテナの内容をDockerfileにする
・mysqlやApacheイメージを作成してdocker-composeで一つにまとめる

少し時間がかかりましたが、OSやコマンドの理解にも繋がったのでよかったです。