docker-compose up -dでphp-fpm nginx mysql の環境構築(laravel環境構築)

#前提
docker-compose up -dの実行だけでlaravelの環境をローカルで作りたかった
laravel用のコンテナの記載情報があまりなかったのでここに記載しておく(laradoc以外でね)


※超自分用のメモなので適当な箇所がありますがご容赦ください。
自分で読みにくかったら更新します。

#作成する環境
コンテナ３つ
・php(app)　--laravelの資材置き
・nginx(web)
・mysql(db)

##ディレクトリ構成
```
laravel_project
├── docker-compose.yml
├── docker-nginx
│   ├── Dockerfile
│   └── default.conf
└── docker-php
    └── Dockerfile
```

#作業
###1.作業用のディレクトリ作成 & 移動(laravel_projectという名前にします。)

```
mkdir laravel_project　&& cd laravel_project
```


###2.docker-compose.ymlを作成

```docker-compose.yml
version: '3'

services:
 web:
    build: ./docker-nginx
    ports:
        - 80:80
    depends_on:
        - app
    volumes:
        - ./:/var/www/html
        - ./docker-nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
        - app
 app:
    build: ./docker-php
    depends_on:
        - db
    links:
        - db
    volumes:
        - ./:/var/www/html
 db:
    image: mysql:5.7.19
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root         #ここにroot用のパスワードを記載
      MYSQL_DATABASE: myblog_db         #ここにデータベースを記載
      MYSQL_USER: myblog_user           #ここにユーザ名を記載
      MYSQL_PASSWORD: myblog_password   #ここにユーザ用パスワードを記載
```


###3.Dockerfileの記載
docker-compose.ymlの```build```にディレクトリを記載するとそのディレクトリのDockerfileをみてイメージを起動する


■docker-nginx/Dockerfile

```
FROM nginx:1.11
RUN apt-get update && apt-get install -y \
    vim \
    unzip \
    zip \
    git 
```
FROMに起動イメージ、RUNに起動時に実行させるコマンドを記載

コンテナ作成時にupdateと必要なコマンドをインストールするようにすると便利だと思います。



■docker-php/Dockerfile

```
FROM php:7-fpm
RUN apt-get update && apt-get install -y \
   vim \
   zip \
   unzip \
   iputils-ping \
   git
RUN docker-php-ext-install pdo_mysql
```
PHPはPDOがないのでインストールします。

###4.docker-nginx/default.confの記載

```docker-nginx/default.conf
server {
    listen       80;
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/myblog/public;

    location / {
        root /var/www/html/myblog/public;
        index  index.php index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/html/myblog/public;
    }

    location ~ \.php$ {
        try_files $uri =404;
        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;
    }
}

```

今回はlaravelにてmyblogという新規プロジェクトを作成するのでドキュメントルートには
```/var/www/html/myblog/public```と記載しておきましょう

■20181007追記
上記のnginxの設定だとrootディレクトリ以外は404のエラーとなってしまった。
なので以下のようにdefault.confを書き直す。

```default.conf
server {
    listen       80;
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/myblog/public;

    location / {
	 try_files $uri $uri/ @laravel;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/html;
    }

    location ~ \.php$ {
	try_files $uri $uri/ @laravel;
        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;
    }

    location @laravel {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/html/myblog/public/index.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```

■以下のリンク参考
[nginxでwordpressのパーマリンクをデフォルト以外に対応する](https://qiita.com/egnr-in-6matroom/items/a08f4851bf16d0131e60)

###5.docker-compose up -d

ここまで準備したらDockerを起動します。

```
docker-compose up -d
```


起動までに時間がかかりますが、以下文言が出れば起動できたと思います。

```
Starting laravel_db_1 ... done
Starting laravel_app_1 ... done
Starting laravel_web_1 ... done
```

一応以下コマンドで起動できているか確認しましょう

```
$ docker-compose ps

    Name                   Command              State                    Ports                  
------------------------------------------------------------------------------------------------
laravel_app_1   docker-php-entrypoint php-fpm   Up      9000/tcp                                
laravel_db_1    docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp                  
laravel_web_1   nginx -g daemon off;            Up      0.0.0.0:80->80/tcp
```

`State`が`Up`となっていれば起動できていますね。

###6.Dockerコンテナ内でlaravelの準備


Dockerコンテナ内に入る

```
docker-compose exec app /bin/bash

root@fdb72742f724:/var/www/html# 
```

以下公式のcomposerのサイトからcomposerをインストールするコマンドを実施
https://getcomposer.org/download/

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

composerがインストールされているか確認

```
ls -la 

composer.phar
```


Dockerのプロジェクトを作成する

```
php composer.phar create-project --prefer-dist laravel/laravel myblog
```

少し時間がかかるがmyblogができていれば成功

```
ls -la 

myblog
```

あとはブラウザで`localhost`にアクセスしてLaravelの文字が出ていればokです。


<img width="70%" alt="スクリーンショット 2018-10-02 23.44.51.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/82746/cda3c229-bb93-9ada-5129-ef78c88e38b1.jpeg">


今回はここまで！