MacでLaravel × Docker 環境構築

## 初めに
この記事ではざっくりLaravel×Dockerの環境構築手順についてご紹介していきます。

## Dockerとは
そもそもDockerとは？
構築前に軽くDockerがどういうものなのか理解しておいた方が良いかと思うので簡単にまとめてみました。
以下の記事で基本的なことが紹介されてます。

https://udemy.benesse.co.jp/development/system/docker.html



### Docker
簡単に言うと、`コンテナ型の仮想サーバー`。
ポイントとしては、完全に仮想化されているわけではなく、`コンテナ型`という点。
この`コンテナ`はサーバの`カーネル（OSの中核となる部分）`を使って、`プロセスやユーザなどをサーバごとに隔離`することで、あたかも`別のマシンがOS上に動いているかのよう`に動かすことができる仕組みになってます。

Dockerについて調べてると、`コンテナ`、`イメージ`、`ビルド`、`DockerHub`等の単語を目にするかと思います。
それぞれの役割は以下のような感じです。

### コンテナ
`Dockerイメージ`を元に作成されたWebサーバやDBサーバが動く`仮想環境`のこと。

### イメージ
コンテナを立ち上げるのに必要な`設定ファイル`のようなもの。
イメージには、コンテナ立ち上げに必要な`ミドルウェア（アプリケーションが要求する特定の機能を提供するもの）`などの設定や`実行コマンド`がまとめられている。
その為、通常であればソフトウェアをインストール、初期設定、諸々詳細設定をする流れになるところ、イメージを使うことでそれらの各作業を省略することができる。

### DockerHub
`Dockerのイメージが公開されているサイト。`
フリーのソフトウェアのイメージから、個人で作成したイメージまで公開されている。
`コンテナからDockerHubにアクセスしてイメージをダウンロード`することにより、サーバやDBの設定をあまり気にすることなくソフトウェアを使ったシステムを構築することが可能。

### build（ビルド）
`Dockerfile`というファイルで指定した命令に従って、Dockerイメージがビルド（作成）される。

### Dockerのメリット
・`システムの導入が高速化`
OSは既に共有して利用しているため毎回設定する必要がなく、システムを構築するために必要となる最低限のプログラムだけインストールすればOK。

・`起動時間の短縮化と多くの処理実装が可能`
OSは既に立ち上がっているため、その分サーバの起動時間を短縮化。
リソースの使用量が少なく済むためサーバへの負荷が低く、1度に多くのプログラム処理を実装することが可能

・`コンテナ設定の再利用が可能`
1度作成したコンテナは、Dockerイメージを作成して他のコンテナへ適用することにより再利用が可能。

## 環境構築
参考記事を元に以下の手順で進めていくとDocker環境を構築できます。

https://www.chickensblog.com/laravel-docker/

1.Laravelの環境構築をDockerで簡単に構築する方法【Mac / M1Mac対応】
2.Dockerをインストールする
3.デスクトップにプロジェクトフォルダを作る
4.ファイルを新規作成する
5.ファイルにコードを書き込む
6.Docker上でコンテナを立ち上げる
7.Laravelをインストールする
8.Laravelの基本設定
9.環境構築終了

1~4、7~9に関しては省略するので参考記事の通り進めてみてください。
こちらの記事ではDockerfileとdocker-compose.ymlの内容のみ記載しておきます。

### ファイルにコード書き込む
自分の場合は以下のような内容でコードを書き込みました。

・Dockerfile
AWSCLIを使う機会があったのでawscliv2のインストールを書き込んでいますが、Laravelを起動させるという点ではここは無くても大丈夫です。
それ以外は最低限必要かなと思います。

```
# ベースイメージを指定
FROM php:7.4-fpm-buster 
# コマンドのシェル形式に使用されるデフォルトのシェルをオーバーライド
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

# 環境変数設定
ENV COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

# composerインストール
COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer

# Laravelの実行に必要なライブラリのインストール
RUN apt-get update && \
  apt-get -y install git unzip libzip-dev libicu-dev libonig-dev \
  zlib1g-dev \ 
  libjpeg-dev \
  libpng-dev \
  libfreetype6-dev \
  libjpeg62-turbo-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*
  
# PHP拡張ライブラリのインストール
RUN docker-php-ext-install pdo_mysql zip bcmath
# PHP拡張用モジュールの設定 GDのfreetypeとjpegを有効
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
# PHP拡張モジュールのGD（画像変換モジュール）をインストール
RUN docker-php-ext-install -j$(nproc) gd 
RUN pwd

# PHP設定ファイルを設置
COPY ./php.ini /usr/local/etc/php/php.ini
RUN pwd

# sshキーを設置
RUN mkdir /root/.ssh
COPY .ssh/ /root/.ssh/
RUN pwd


WORKDIR /var/www/html
# ファイルダウンロード
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# 解凍実施
RUN unzip awscliv2.zip
# インストール
RUN ./aws/install
RUN pwd

WORKDIR /work
```

・docker-compose.yml
docker-compose.ymlの書き方については以下の記事が参考になります。

https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa


```
version: "3.8"
volumes:
  db-store:
services:
  # dbコンテナ
  db:
　　　　　　　　# ダウンロードするイメージ
    image: mysql:8.0
　　　　　　　　# 接続ポート
    ports:
      - 33060:3306
　　　　　　　　# 　A:B Aをコンテナ上のBにマウント
    volumes:
      - db-store:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    # 環境変数設定
    environment:
      - MYSQL_DATABASE=sample_db
      - MYSQL_USER=sample
      - MYSQL_PASSWORD=?????
      - MYSQL_ROOT_PASSWORD=?????
      - TZ=Asia/Tokyo

　　　　# appコンテナ
  app:
    # Dockerfileのあるディレクトリのパスを指定
    build: ./docker/php
    volumes:
      - ./backend:/work
　　　　　　　# appコンテナをdbコンテナに依存させる
    depends_on:
      - db
  
  # webコンテナ
  web:
    image: nginx:1.18-alpine
    ports:
      - 8000:80
    volumes:
      - ./backend:/work
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
　　　　　　　　# コマンドを実行する作業ディレクトリ指定
    working_dir: /work
    depends_on:
      - app

  # phpMyAdminコンテナ
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5
    # コンテナ名
    container_name: phpmyadmin
    # dbコンテナを繋げる
    links:
      - db
    ports:
      - 8080:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
  
  #AWS CLIコンテナ
  aws-cli-container:
    build: ./docker/php
    container_name: awscli-container
    volumes:
      - .:/workdir
　　　　　　　 # .envが配置されてるパス
    env_file:
      - ./backend/.env
    environment:
      AWS_DEFAULT_REGION: ap-northeast-1
      AWS_DEFAULT_OUTPUT: json
```

## コンテナ立ち上げ
Dockerfileとdocker-compose.ymlの書き込みができたらビルドしてコンテナを立ち上げます。
doneと表示されれば成功です！

```
$ docker build # コンテナ作成
$ docker-compose up -d # 作成したコンテナを起動
```

デスクトップのGUIの方から確認すると以下のような感じで立ち上がってるのがわかります。
![スクリーンショット 2022-04-07 3.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/8a3c990c-1645-1def-bb46-40cae94a7aff.png)