【Docker】amazonlinux + nginx + LaravelのDockerfile作ってみた！！

【目的】
amazonlinux(サーバーOS)のLaravel(Laravel7系)の開発環境を作りたい。

まずは完成版のDockerfileをどぞ！
※コードの解説もあるよ＾＾

【前提】
『Docker hub』で"amazonlinux"のimageを取得しているものとする。
↓のコマンドで簡単取得できるぞ

```
docker pull amazonlinux
```

###ディレクトリ構造はこんな感じ。

```
laravel_docker
  |__Dockerfile
  |__nginx.conf
  |__php.ini
  |__run.sh

//Dockerfileでimage制作の時に必要になるファイルを"Dockerfileと同じ階層に入れてる
```

##↓Dockerfileはこちら↓

```
FROM amazonlinux:2

//解説①
#install packeges
RUN yum -y update
RUN amazon-linux-extras install -y nginx1.12 php7.4
RUN yum install -y php-pecl-zip php-mbstring php-xml php-curl php-bcmatch php-gd install vim zip unzip curl less procps
RUN yum -y update

//解説②
#Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --version=1.10.23
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

//解説③
#php.iniのmemory_limitを無制限に変更
COPY  ./php.ini /etc/php.ini

//解説④
#nginxのデフォルトrootの変更
COPY ./nginx.conf /etc/nginx/nginx.conf

//解説⑤
#LaravelProject作成
WORKDIR /var/www/
RUN composer create-project --prefer-dist "laravel/laravel=7.3" {Laravelプロジェクトのディレクトリ名}　//{}は不要だよ＾＾
RUN chmod -R 777 /var/www/Laravelプロジェクトのディレクトリ名/storage/

//解説⑥
#node.js npm install(本番環境とver違う・・・まぁいっか)
RUN curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
RUN yum install -y nodejs

//解説⑦
#nginx起動 + php-fpm起動
COPY run.sh /root/

WORKDIR /root
CMD ["/root/run.sh"]
```

#解説していく！！

##解説①


```
#install packeges
RUN yum -y update
RUN amazon-linux-extras install -y nginx1.12 php7.4
RUN yum install -y php-pecl-zip php-mbstring php-xml php-curl php-bcmatch php-gd install vim zip unzip curl less procps
RUN yum -y update
```

パッケージ関連をモロっとインストールしている。
※この段階で、nginxとphpのインストールを済ませてる。

```
RUN amazon-linux-extras install -y nginx1.12 php7.4
```
※amazonlinuxはこの記述でnginxやらphpやらをインストール(使用可能に)できる

##解説②

```
#Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --version=1.10.23
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
```
深い解説は無いです。
単純にLaravelをインストールするのにComposerが必要だからLaravelを入れる前にComposerをインストールしています。
※諸事情により、今回はVersion指定してインストールしてます。(既にある開発環境と揃えたかった)

##解説③

```
#php.iniのmemory_limitを無制限に変更
COPY  ./php.ini /etc/php.ini
```
初期設定ではLaravelをインストールする際に"memory_limit"制限でインストールできないため設定を変更する。

```
COPY  ./php.ini /etc/php.ini
※COPY ローカルのファイル名 内容を反映させたいコンテナのファイル名
```

※この記事ではファイルの変更部分だけを記述(変更を加えたファイルは自分で作ってね。)

```
;memory_limit = 128M　→デフォルトはこれなのでコメントアウトしとく
memory_limit = -1　→これに変更
```

##解説④

```
//解説④
#nginxのデフォルトrootの変更
COPY ./nginx.conf /etc/nginx/nginx.conf
```
『/』でアクセスした時のページ(デフォルトページ)の設定
例：http://localhost:8000/
にアクセスしたら映る画面を設定していく。

ここではLaravelの初期画面(画像のやつ)を表示したい
![laravel7 default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697150/def27c33-1ab5-cca9-c1e3-2390e4318de0.png)

少し変更が多いので、設定した後のファイルをそのまま載っけますｗ

```
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/Laravelのプロジェクト名/public;　→ここの変更が一番大事
　　　　　　　　　　　　　　　　　※Laravelのプロジェクトはこの後作るよ！
        client_max_body_size 30M;

        # Load configuration files for the default server block.
        # include /etc/nginx/default.d/*.conf;

        location ~* .(html|css|js|jpe?g|png|gif|svg|mpg|flv|swf)$ {
                expires 10d;
                access_log off;
                break;
        }
        location / {
                #if (!-e $request_filename){
                #       rewrite ^(.*)$ /%1 redirect;
                #}
                #if (!-e $request_filename){
                #       rewrite ^(.*)$ /index.php break;
                #}
                index index.php index.htm index.html;
                try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
                fastcgi_pass   unix:/run/php-fpm/www.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/paylove/public$fastcgi_script_name;
                include        fastcgi_params;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}
```
##解説⑤

```
#LaravelProject作成
WORKDIR /var/www/
RUN composer create-project --prefer-dist "laravel/laravel=7.3" {Laravelプロジェクトのディレクトリ名}　//{}は不要だよ＾＾
RUN chmod -R 777 /var/www/Laravelプロジェクトのディレクトリ名/storage/
```

```
WORKDIR /var/www/
```
ここでLaravelプロジェクトをつくりたいディレクトリに移動する。

```
RUN composer create-project --prefer-dist "laravel/laravel=7.3" {Laravelプロジェクトのディレクトリ名}　//{}は不要だよ＾＾
```
ComposerにLaravelのインストールとプロジェクトを作成を同時に行ってもろてます。

```
RUN chmod -R 777 /var/www/Laravelプロジェクトのディレクトリ名/storage/
```
storageの権限を緩くする。
※最適では無い。
※サーバーでユーザーを作ってそのユーザーにディレクトリ権限を明け渡してしまうのがいいのかと、、、
ここは定かではないのでそのうち更新します。

##解説⑥

```
#node.js npm install(本番環境とver違う・・・まぁいっか)
RUN curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
RUN yum install -y nodejs
```

Laravelではnpmでライブラリを利用するので、
Node.jsとnpmを事前にサーバーにインストールしておく。

##解説⑦

```
#nginx起動 + php-fpm起動
COPY run.sh /root/

WORKDIR /root
CMD ["/root/run.sh"]
```

nginx起動 + php-fpm起動を行う。
これらは、サーバーが立ち上がった後にコマンド入力をするので、

```
CMD ["/root/run.sh"]
```
この記述が必要になる。

run.shの中身はこちら。

```
#!/bin/sh
/usr\/sbin\/php-fpm
nginx -g 'daemon off;'
echo 'lounch'
```

```
#!/bin/sh
```
これを記述していれば、シェルでファイルを指定したコマンドを入力すると、
その指定したファイル内のコマンドが実行される。

```
/usr\/sbin\/php-fpm
```
php-fpmの起動

```
nginx -g 'daemon off;'
```
nginxの起動


##終わり
いかがでしょうか、Dockerを触ってからまだ、3日くらいなので便利さはわかるのだが、
実装がなかなかしんどいですｗｗ

また、サーバーに関しての知識がカスカスということも露呈したのでいい機会でした。
これを機にサーバーの知識も増やさなければなーとなりました・
以上。。。。