Dockerで開発環境構築（Mac + Nginx + PHP-FPM）

#Dockerで開発環境構築
この記事は[Dockerによる開発環境構築（Mac + Nginx + PHP-FPM + MySQL）Part 1](https://www.no-title.com/web/docker-mac-nginx-php-fpm)をそのまま実行しています。
その中で、分からなかったコードや概念を備忘録として記事にしています。

##まずDockerって何よ？
[Dockerとは](https://knowledge.sakura.ad.jp/13265/)
>
1,Dockerはミドルウェアのインストールや各種環境設定をコード化して管理します。
2,コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
3,作成した環境を配布しやすい。
4,スクラップ＆ビルドが容易にできる。

ふむふむ。
そして**コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。**このメリットは大きそうだなと思います。
というのも、行きたい企業がDockerを使っていたのでDockerをキャッチアップし出したというだけで、実務というかチーム単位では使用したことがないので、大きなメリットを感じられていないのです。

とりあえず進めます。

Dokerはインストールできている前提で進めます。

###コンテナとイメージって何よ？

`イメージ`・・・ファイル
`コンテナ`・・・イメージを実行したもの

といったざっくりした認識でございます。
間違っていたら教えてください。

なので、コンテナを実行するにはイメージが必要です。
欲しいイメージがないときは[Docker hub](https://hub.docker.com/)からpullしてきましょう。
`$ docker pull centos`
これでCentosがpullされます。


少し話は飛びますが
`$ docker images`と`$ brew list`は似ているな〜と感じます。


##さて本題
さて本題に入ります。
###nginxコンテナ作成
お好きなディレクトリに移動して以下のコマンドを入力。
目に見えた方がわかりやすいので僕はDesktop上で行いました。

```
$ mkdir docker
$ cd docker
$ docker container run -d -p 8000:80 --name web nginx:latest
```

こちらがコンテナを作成する際のコマンドです。
`docker container run -d -p 8000:80 --name web nginx:latest`

**-d**・・・バックグラウンドでDockerコンテナを実行
**-p**・・・ポート指定
**--name**・・・コンテナに名前をつける

と言った感じです。

```
$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
dde74e29d594        nginx:latest        "nginx -g 'daemon of…"   9 seconds ago       Up 7 seconds        0.0.0.0:8000->80/tcp   web
```
コンテナが作成されプロセスが立ち上がったのが分かります。

[http://localhost:8000/](http://localhost:8000/)
にアクセスしてNginxの画面が表示されていれば成功です。

とりあえず確認できたら止めておきます。

```
$ docker container stop web
```
次ーーー。

###docker-composeでnginxサーバーを起動

nginxを起動できましたが、phpを扱うとなるとphp-fpmのコンテナも作成しなくてはいけません。
※立ち上げる順番も気にしないといけないそうな・・・

そこで、コンテナ同士の依存関係をyml形式のファイルで管理できる`docker-compose`というものを使用します。
先ほど作成したディレクトリ内で、`docker-compose.yml`を作成します。

```
$ vi docker-compose.yml
```

```docker-compose.yml
version: '3'             #フォーマットのバージョン。現在は3が最新。
services:                #アプリケーションを動かせるための記述
  web:                   #コンテナ名
    image: nginx:latest  #イメージ名
    ports:               #使用ポート
      - "8000:80"
```
記述後にnginxを起動させます。

```
$ docker-compose up -d
```
[http://localhost:8000/](http://localhost:8000/)
アクセスして、nginxの画面が出れば成功。

$一旦ストップさせます。

```
$ docker-compose stop
```
###Hello World!!
次はDockerでHello Worldを表示させます。

```
$ mkdir src
$ cd src
$ vi index.html
```
```
<h1>Hello World !!</h1>
```
次は設定ファイルを記述します。

```
$ cd ../
$ mkdir web
$ cd web
$ vi default.conf
```
nginxの設定をdefault.confに記述していきます。

```default.conf
server {
    listen 80;

    root  /var/www/;
    index index.html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
}
```

その後、docker-compose.ymlの最終行にこちらを追記します。

```docker-compose.yml
#version: '3'
#services:
#  webserver:
#    image: nginx:latest
#    ports:
#      - "8000:80"
    volumes: #以下を追記　[ホストのファイルパス]:[コンテナファイルパス]
      - ./webserver/default.conf:/etc/nginx/conf.d/default.conf
      - ./src:/var/www/
```
volumesは、ホストのファイルパスをコンテナのファイルパスへマウントします。
つまり、コンテナ側の`/etc/nginx/conf.d/default.conf`はホスト側の`./webserver/default.conf`を認識するようなります。
マウントすることによって、コンテナ内で変更した内容を、ホスト側にリアルタイムで同期することができます。

再びdockerを立ち上げます。

```
$ docker-compose up -d
```
[http://localhost:8000/](http://localhost:8000/)
アクセスして、Hello Worldが表示されれば成功。

$一旦ストップさせます。

```
$ docker-compose stop
```
###PHPを動作させるAPサーバーの設定
phpを扱うためにはAPサーバーが必要です。

docker-compose.ymlを編集します。

```docker-compose.yml
#version: '3' 
#services:
#  web:
#    image: nginx:latest
#    ports:
#      - "8000:80"
    depends_on: #追記
      - app
#    volumes:
#      - ./web/default.conf:/etc/nginx/conf.d/default.conf
#      - ./src:/var/www/
  app: #以下を追記
    image: php:7.2.15-fpm
    volumes:
        - ./src:/var/www/
```
`depends_on`で依存関係を設定します。
これを設定しないとphpは動きません。

次にdefault.confを編集します。

```default.conf
#server {
#    listen 80;
#    root  /var/www/;
#    index index.php index.html;
#    access_log /var/log/nginx/access.log;
#    error_log  /var/log/nginx/error.log;
    location / { #以下を追記
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass   app:9000;
          fastcgi_index  index.php;
          include        fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO $fastcgi_path_info;
      }
#}
```

その後srcに移動しindex.phpを作成し中にphpinfo();を記述します。

```index.php
<?php

phpinfo();

?>
```
再びdockerを立ち上げます。

```
$ docker-compose up -d
```
[http://localhost:8000/](http://localhost:8000/)
アクセスして、PHPの設定情報が表示されればOKです。