docker-composeでphp + nginxの環境を作りました

##前置き
phpとnginxが入っている環境をdocker-composeで作成しました。
慣れないことばかりで戸惑いましたが、備忘録代わりに手順を残しておこうと思います。

*docker for macをインストールしている前提で手順を進めていきます。

##フォルダ構成
フォルダの構成はこのようになってます。

```
phpsql
│  docker-compose.yml
├─data
│ │
│ └─www
│   　　index.php
│ 
│   
│  
├─nginx
│    Dockerfile
│    server.conf
│
└─php5
     Dockerfile
     php.ini
```

docker-compose.ymlですが、プロジェクトの作業ディレクトリのルートに置く方法が一般的らしいです。
ではdocker-compose.ymlの中身を見ていきましょう。

##docker-compose.yml

``````php:docker-compose.yml
version: '2'
services:
  nginx:
    build: ./nginx
    ports:
      - "9000:80"
    links:
      - php5
    volumes:
      - ./data/www:/var/www/html
      - ./nginx/server.conf:/etc/nginx/nginx.conf

  php5:
    build: ./php5
    volumes:
      - ./data/www:/var/www/html
      - ./php5/php.ini:/usr/local/etc/php/php.ini

  smtp:
      image: schickling/mailcatcher
      ports:
        - "1090:1080"
        - "1025:1025"
 ```
###各種詳細
#####version: '2'
これでymlの記述を決めています。version1は廃止が決定されており、今後記述していくなら2が無難らしいです。
#####build
Dockerfileがあるディレクトリのパスを指定します。nginxのコンテナの場合、

``````php:docker-compose.yml
build: ./nginx
```
となっています。パスの./nginxはdocker-compose.ymlがある場所からの相対パスになります。
docker-compose buildをした際に、ディレクトリ直下のDockerfileを読み込んでコマンドを走らせます。
#####ports
ポートの公開内容です。

``````php:docker-compose.yml
ports:
 - "9000:80"
```
上記ならホスト側が9000でコンテナ側が80となっています。ホスト側は他のサービスで使っているポートと被らないように注意しましょう。
#####links
```
links:
  - php5
```
コンテナを他のコンテナにリンクさせます。上記のnginxはphp5とリンクさせていますね。
#####volumes
ホストとコンテナのフォルダを同期させている場所です。
例えば
ymlファイル上には

```
volumes:
 - ./data/www:/var/www/html
```

と記載されています。

ホスト側の./data/www、コンテナ側の/var/www/htmlのどちらにもindex.phpがあるとします。
ホスト側のindex.phpが編集されるとコンテナ側のindex.phpが同期されます。
ちなみにこの同期のことをマウントといいます。


次は各コンテナのDockerfileを見ます。
##Dockerfile
``````php:nginx/Dockerfile
FROM nginx:latest

RUN apt-get update
RUN apt-get install -y vim less

MAINTAINER XXXXXX
```

``````php:nginx/dockerfile
FROM php:5-fpm
RUN apt-get update
MAINTAINER XXXXXX
```
#####From
Dockerイメージを構築する際に、元になるイメージを指定します。
#####Run
コンテナ内で実行するコマンドです。docker-compose buildした際にこのコマンドが走ります。

次はserver.confをみます。

##server.conf

``````php:server.conf
user nginx;

worker_processes auto;
pid /var/run/nginx.pid;

events{
    worker_connections 2048;
    multi_accept on;
    use epoll;
}


http {
    charset UTF-8;
    server_tokens off;
    include /etc/nginx/mime.types;
    default_type text/plain;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    server {
            listen 80 default;
            server_name localhost;
            root /var/www/html;
            index index.php;
            charset utf-8;
            access_log /var/log/nginx/access.log;
            error_log  /var/log/nginx/error.log;

            location / {
             try_files $uri /index.php;
            }

            location ~ \.php$ {
            fastcgi_pass phpsql_php7_1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include       fastcgi_params;
            }
    }
}
```

location / {
try_files $uri /index.php;
 }

try_filesには存在をチェックするファイルやディレクトリを指定します。
$uriのパスに対するファイルが存在すれば、ファイルを返します。この場合ではindex.phpを返します。

##実行
後はindex.phpに何かしら記述してdocker-compose buildをしてからdocker-compose upをすれば環境構築出来ると思います。

##参考サイト
参考にさせていただいたサイトはこちらです。
https://qiita.com/naga3/items/be1a062075db9339762d
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
https://qiita.com/zembutsu/items/891c7ffd2c36097400b1
https://heartbeats.jp/hbblog/2012/04/nginx05.html
https://gtrt7.com/blog/nginx/docker-compose2#i-2
https://unskilled.site/%E4%BD%BF%E3%81%84%E6%96%B9%E5%9F%BA%E6%9C%AC%E7%89%88dockercompose%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%83%BB%E9%80%A3%E6%90%BA%E3%82%92%E6%A5%BD/