Docker for Macを使った開発環境構築(その２）

すっかり書くの忘れてた・・・
結局、実運用では使わなかったのですが、備忘録として書いておきます。

# 前提条件

- MacOS ElCapitan 10.11.6
- homebrew
- iTerm2
- Docker for Mac

# 今回の作業
- Yii2をインストール


# 手順

Yii2のインストール手順は[本家](https://github.com/yiisoft/yii2/blob/master/docs/guide-ja/start-installation.md)の情報を参照。

よく見たらphp-fpm使うって書いてあるしw
composer入れたら簡単そうなので、Dockerfileを変更

```
$ vim docker/php/Dockerfile

FROM php:7.1-fpm

# composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer
```

もう一度buildしてupする

```
$ docker ps
134b263e1290        docker_nginx        "nginx -g 'daemon ..."   7 minutes ago       Up About a minute   80/tcp, 443/tcp          nginx
31f12a55c2af        docker_php          "docker-php-entryp..."   7 minutes ago       Up About a minute   9000/tcp                 php
472f8a3774a4        docker_mysql        "docker-entrypoint..."   7 minutes ago       Up About a minute   0.0.0.0:3306->3306/tcp   mysql
```

出てきたPHPのCONTAINER IDを使って

```
$ docker exec -it 31f12a55c2af bash
```

すると今立ち上げたPHPのコンテナに入ってる（はず）

```
root@31f12a55c2af:/var/www/html# cd ../
root@31f12a55c2af:/var/www# composer global require "fxp/composer-asset-plugin:~1.3.1"
Changed current directory to /root/.composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
    Failed to download fxp/composer-asset-plugin from dist: The zip extension and unzip command are both missing, skipping.
A php.ini file does not exist. You will have to create one.
    Now trying to download from source
  - Installing fxp/composer-asset-plugin (v1.3.1): Cloning 0bfdd307d2

Installation failed, deleting ./composer.json.


  [RuntimeException]
  Failed to clone https://github.com/fxpio/composer-asset-plugin.git, git was not found, check that it is installed and in your PATH env.
  sh: 1: git: not found
```

怒られた・・・
１つはcomposerをrootで実行するなよーってことですが、まぁできないって言われているわけではない。
そのあとが問題。
zip extensionがないからunzipできない。で、代わりにソースをダウンロードしようとする。が、gitコマンドがないからそれも無理。

と言うわけで、zipとgitは入れておいた方が良さげですね。
ついでにpdoとか必要そうなものも追記(mcryptを入れるのにlibmcrypt-devが必要になります）

```
RUN apt-get update && apt-get install -y \
  git \
  zlib1g-dev \
  libmcrypt-dev \
  && docker-php-ext-install zip pdo_mysql mysqli mbstring mcrypt \
```

で、buildしてupする
buildし直すとコンテナのIDが変わってる場合があるのでもう一度調べてから入りましょう。

```
root@a5b45a615b40:/var/www# composer global require "fxp/composer-asset-plugin:~1.3.1"
Changed current directory to /root/.composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing fxp/composer-asset-plugin (v1.3.1): Downloading (100%)
Writing lock file
Generating autoload files
```

今度はいけましたね。

```
root@a5b45a615b40:/var/www# composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Installing yiisoft/yii2-app-basic (2.0.12)
・・・
Could not fetch https://api.github.com/repos/jquery/jquery-dist/commits/1472290917f17af05e98007136096784f9051fab, please create a GitHub OAuth token to go over the API rate limit
Head to https://github.com/settings/tokens/new?scopes=repo&description=XXXXXXX
to retrieve a token. It will be stored in "/root/.composer/auth.json" for future use by Composer.
Token (hidden):
```

Tokenってなんやねん・・・と思って前を読むと、APIのリミットだから、github行ってtoken取得しなさいよって言われてる模様。書かれているパスに追記しておくと今後のcomposerで使えるっぽいけど、とりあえず後回し。
出てきたURL(Xは念のため伏せてますが、日付とか入ってるっぽい）にアクセスすると下の方にgenerate tokenのボタンが出ているのでポチり。
tokenが出てくるので、コピペすれば先に進みます。

```
Writing lock file
Generating autoload files
> yii\composer\Installer::postCreateProject
chmod('runtime', 0777)...done.
chmod('web/assets', 0777)...done.
chmod('yii', 0755)...done.
```

これで/var/wwwの下にbasicディレクトリが作られて・・・
と、ここまでやって気がついた。phpのvolumesに/var/wwwを追加していなかったことに・・・
そして色々エラー吐かれた後に最終的にはこんな感じに。

docker/docker-compose.yml

```
version: '2'
services:
  # DB
  mysql:
    container_name: "mysql"
    build: ./mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: root
  # nginx
  nginx:
    container_name: "nginx"
    build: ./nginx
    ports:
      - "8080:80"
    volumes:
      - ./src/:/var/www/
    links:
      - php
      - mysql
  # php
  php:
    container_name: "php"
    build: ./php
    links:
      - mysql
    volumes:
      - ./src/:/var/www/
    environment:
      TZ: "Asia/Tokyo"
    ports:
      - "9001:9001"
    depends_on:
      - mysql
```

docker/nginx/Dockerfile

```
FROM nginx:1.11

ADD ./server.conf /etc/nginx/conf.d/default.conf
```

docker/nginx/server.conf
nginxのserver.confでcontainer_nameに指定した名前をfastcgi_passに指定する

```
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name localhost;
    root        /var/www/basic/web;
    index       index.php;

    access_log  /var/www/basic/log/access.log;
    error_log   /var/www/basic/log/error.log;

    location / {
        # 本当のファイルでないものは全て index.php にリダイレクト
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # 存在しない静的ファイルの呼び出しを Yii に処理させたくない場合はコメントを外す
    #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    #    try_files $uri =404;
    #}
    #error_page 404 /404.html;

    # /assets ディレクトリの php ファイルへのアクセスを拒否する
    location ~ ^/assets/.*\.php$ {
        deny all;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php:9000;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $uri =404;
    }

    location ~* /\. {
        deny all;
    }
}
```

docker/php/Dockerfile

```
FROM php:7.1-fpm

# composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer

RUN apt-get update && apt-get install -y \
  git \
  zlib1g-dev \
  libmcrypt-dev \
  && docker-php-ext-install zip pdo_mysql mysqli mbstring mcrypt \

```

docker/mysql/Dockerfile

```
FROM mysql:5.6
```

これでbuildしてupした後で、ブラウザから
http://localhost:8080/index.php
にアクセスするとYii2のインストールページにあるCongratulations!と同じようなページが出るはず。

途中でこの構成ではやらないことになったので、自分で確認してるのはここまでです。
Yii2のページにあるrequirements.phpを実行するとgdとか足りないよってwarningが出ていたので、その辺をphpのDockerfileに書いてあげるといいと思います。
（このままでブラウザから「Contact」をクリックすると早速gdがーって叱られるはず）

この設定で書くとdocker/src/basicにcomposerで入れたYii2が入ってると。
basicディレクトリの下にlogディレクトリを作らないと、server.confのログ吐く場所がないのでエラーが出ます。