DockerでLaravelを起動する

どうも。若松です。

前回の記事でLaravelの起動までをまとめました。
https://qiita.com/t_wkm2/items/29b150e52a7c08f0e976

今回DockerでLaravelの起動までをまとめます。

# Dockerfile

```Dockerfile
FROM amazonlinux:2

# PHPインストール
RUN amazon-linux-extras install -y php7.3
RUN yum install -y php-pecl-zip php-mbstring php-dom

# Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

# 環境変数設定
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME "/opt/composer"
ENV PATH "$PATH:/opt/composer/vendor/bin"

# Laravelインストール
RUN composer global require "laravel/installer"

# Laravelプロジェクト作成
WORKDIR /var/www
RUN composer create-project laravel/laravel laravel

# ポートを公開
EXPOSE 8000

WORKDIR /var/www/laravel
CMD ["php","artisan","serve","--host","0.0.0.0"]
```

# Dockerfile詳細

## イメージ

```Dockerfile
FROM amazonlinux:2
```
前回AmazonLinux2を使用していたこともあり、今回のDockerでもAmazonLinux2をベースにDockerイメージを構築します。

## PHPインストール

```Dockerfile
RUN amazon-linux-extras install -y php7.3
RUN yum install -y php-pecl-zip php-mbstring php-dom
```
前回同様、extrasリポジトリからインストールします。

## Composerインストール

```Dockerfile
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
```
こちらも前回同様に、Composerのインストールは公式のコマンドをそのまま使用します。
https://getcomposer.org/download/

## 環境変数設定

```Dockerfile
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME "/opt/composer"
ENV PATH "$PATH:/opt/composer/vendor/bin"
```
環境変数は `RUN` ではなく `ENV` を使用します。
`RUN export` で環境変数を定義するとそのレイヤーのコンテナ内部のみに適用されてしまうため、他のレイヤーで環境変数が効かなくなってしまうためです。

## Laravelインストール

```Dockerfile
RUN composer global require "laravel/installer"
```
こちらも前回同様、Composerを使用してLaravelをインストールします。

## Laravelプロジェクト作成

```Dockerfile
WORKDIR /var/www
RUN composer create-project laravel/laravel laravel
```
前回は `laravel new` を使用してLaravelプロジェクトを作成しましたが、 `Laravel new` では対話型のターミナルが前提になっているようで、Dockerfileからビルドするとエラーになってしまいます。
そのためComposerを用いてLaravelプロジェクトを作成します。
※なぜComposerを用いるのか、なぜComposerでも作成できるかは深く追求していません。

## ポートを公開

```Dockerfile
EXPOSE 8000
```
LaravelではデフォルトでTCP8000をListenするため、8000番を公開します。

## Laravelサーバー起動

```Dockerfile
WORKDIR /var/www/laravel
CMD ["php","artisan","serve","--host","0.0.0.0"]
```
CMDで記述することで、コンテナ起動時にこのコマンドが実行され、サーバーが起動します。

# コンテナビルド

```bash
docker build -t laravel .
```
Dockerfileに従ってコンテナをビルドします。
Dockerfileはカレントディレクトリに配置されている想定です。
成功すると `laravel:latest` という名前のコンテナイメージが作成されます。

# コンテナ実行

```bash
docker run -p 8000:8000 laravel
```
作成したコンテナイメージを実行します。
`-p 8000:8000` オプションでローカルの8000番とコンテナの8000番を繋ぎ、ローカル8000番でコンテナへアクセスできるようにします。

# ブラウザでサンプルを表示
`http://localhost:8000` にアクセスすることで以下のサンプルを表示します。
<img width="1280" alt="スクリーンショット 2019-07-06 22.57.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94816/674320aa-2dfd-f21c-3dd2-990bd1fd869d.png">

# まとめ
DockerでLaravelのサンプルを表示するまでをまとめました。
次回はマルチステージビルドでコンテナサイズのスリム化について書きたいと思います。