DockerでのLAMP環境構築手順(Amazon Linux 2/PHP8.1(Laravel9)) ①作成する環境の確認(全8回)

# はじめに

かくかくしかじかで、Docker で Amazon Linux 2 ベースの LAMP 環境を構築する機会がありましたので、手順についてアウトプットします。
![スクリーンショット 2022-11-30 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/930bcd24-38e9-316e-bebd-cef83aea5924.png)

## 記事の目的

- 手順の詳細を書いていくことで、似たような環境を構築する方の一助となれば幸いです。
  - 作成する過程では、つまずく箇所が山ほど出てきましたが、調べながら進んでいくことで、色々な学びを得ましたので、なるべく記事に落とし込めたらと思います。
- さらに記事として書き出す上で、よくわかっていないことに気づいた点を調べながら補足することで、インプットの機会にもしたいというのが目的です。

## 投稿内容（全 8 回）

全 8 回に分けて、投稿します。

**① 作成する環境の確認**
[② Apache の導入](https://qiita.com/ryamate/items/e5ca19aece61717b6a01)
[③ PHP 8.1 系のインストール](https://qiita.com/ryamate/items/7a38eb11d64d504a7a22)
[④ Composer のインストール](https://qiita.com/ryamate/items/a8bbd003c6c2abceedc9)
[⑤ timezone, locale の設定](https://qiita.com/ryamate/items/d148bcdbdb27c5b80ad8)
[⑥ docker-compose.yml の作成 & MySQL の導入](https://qiita.com/ryamate/items/ac52b152757141f443e3)
[⑦ Laravel 9 系のインストール](https://qiita.com/ryamate/items/79875e22906cfb51af67)
[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)

今回は、 具体的な手順に入る前に、**① 作成する環境の確認** をします。

## 目次

[1. Docker で構築する LAMP 環境](#1-docker-で構築する-lamp-環境)
　[1-1. 構成のイメージ](#1-1-構成のイメージ)
　[1-2. LAMP 環境の内容](#1-2-lamp-環境の内容)
[2. ディレクトリ構成](#2-ディレクトリ構成)
[3. 主要なファイル](#3-主要なファイル)


# 1. Docker で構築する LAMP 環境

Docker で構築する LAMP 環境を確認します。

## 1-1. 構成のイメージ

今回構築する Docker での LAMP 環境について、簡単なイメージ図を作成しました。

![スクリーンショット 2022-11-30 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/930bcd24-38e9-316e-bebd-cef83aea5924.png)

:::note alert
追記 2023/01/17 ： **M1 Mac の場合、 Docker コンテナが起動しません**
- AmazonLinux2、PHP8.1だと remi リポジトリが必要
→ remi7 は M1 対応していない
→ 現状対処できない様子
:::

## 1-2. LAMP 環境の内容

LAMP 環境についての詳細です。

- **web コンテナ**
  - Amazon Linux 2（ベースイメージ: `amazonlinux:2`）
  - Apache 2.4
  - PHP 8.1.x
    - Laravel 9.x
- **db コンテナ**
  - MySQL 8.0.28（ベースイメージ: `mysql/mysql-server:8.0.28`）

# 2. ディレクトリ構成

全 8 回の手順の完了時点のディレクトリ構成は以下の通りです。

```bash:ディレクトリ構成
.
├── .env
├── .env.example
├── backend
├── docker-compose.yml
└── infra
    └── docker
        ├── apache
        │   ├── rewrite.conf
        │   └── vhost.conf
        ├── mysql
        │   ├── Dockerfile
        │   └── my.cnf
        └── php
            ├── Dockerfile
            └── php.ini
```

# 3. 主要なファイル

今回作成する主要なファイル全てです。

## 3-1. docker-compose.yml

以下は、 **docker-compose.yml** です。

```yaml:docker-compose.yml
version: "3.8"
volumes:
  db-store:
services:
  web:
    build:
      context: .
      dockerfile: ./infra/docker/php/Dockerfile
    ports:
      - ${WEB_PORT:-80}:80
    volumes:
      - ./backend:/work/backend

    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=${DB_NAME:-laravel_local}
      - DB_USERNAME=${DB_USER:-phper}
      - DB_PASSWORD=${DB_PASS:-secret}

  db:
    build:
      context: .
      dockerfile: ./infra/docker/mysql/Dockerfile
    ports:
      - ${DB_PORT:-3306}:3306
    volumes:
      - db-store:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${DB_NAME:-laravel_local}
      - MYSQL_USER=${DB_USER:-phper}
      - MYSQL_PASSWORD=${DB_PASS:-secret}
      - MYSQL_ROOT_PASSWORD=${DB_PASS:-secret}
```

以下の GitHub リポジトリと Qiita 記事を参考にさせていただきました。

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

## 3-2. web サーバー（PHP）の関連ファイル

以下、web サーバー（PHP）の関連ファイルです。

次回以降の手順では、この **infra/docker/php** ディレクトリの **Dockerfile** を編集していくことがメインの作業です。

```docker:infra/docker/php/Dockerfile
FROM amazonlinux:2

# timezone environment
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8

RUN yum update -y \
  && yum install -y \
  glibc-langpack-ja \
  zip \
  unzip \
  vim \
  httpd

RUN amazon-linux-extras install -y epel
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

RUN yum clean metadata \
  && yum install -y \
  php81 \
  php81-php \
  php81-php-mbstring \
  php81-php-pdo \
  php81-php-xml \
  php81-php-fpm \
  php81-php-mysqlnd \
  php81-php-gd

RUN alternatives --install /usr/bin/php php /usr/bin/php81 1

# composer のインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

# ファイルのコピー
COPY ./infra/docker/php/php.ini /etc/opt/remi/php81/php.ini
COPY ./infra/docker/apache/vhost.conf /etc/httpd/conf.d/vhost.conf
COPY ./infra/docker/apache/rewrite.conf /etc/httpd/conf.modules.d/rewrite.conf

CMD [ "apachectl", "-D", "FOREGROUND" ]

WORKDIR /work/backend
```

```ini:infra/docker/php/php.ini
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = "Asia/Tokyo"

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese
```

## 3-3. MySQL の関連ファイル

以下、 MySQL の関連ファイルです。

```docker:infra/docker/mysql/Dockerfile
FROM mysql/mysql-server:8.0.28

RUN microdnf install yum \
  && yum install -y glibc-langpack-ja glibc-locale-source git

ENV TZ=Asia/Tokyo \
  LANG=ja\_JP.UTF-8

COPY ./infra/docker/mysql/my.cnf /etc/my.cnf
```

```conf:infra/docker/mysql/my.cnf
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
```

## 3-4. Apache の設定ファイル

以下は、 **Apache** の設定ファイルです。 **[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)** で触れますが、 Laravel を動作させるための設定をしています。

```conf:infra/docker/apache/rewrite.conf
LoadModule rewrite_module modules/mod_rewrite.so
```

```conf:infra/docker/apache/vhost.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAdmin webmaster@localhost
    DocumentRoot /work/backend/public

    ErrorLog logs/error.log
    CustomLog logs/access.log combined

    <Directory /work/backend/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```


## 3-5. .env ファイル

以下、**.env** ファイルです。

```bash:.env
WEB_PORT=8080
DB_PORT=3306
DB_NAME=laravel_local
DB_USER=phper
DB_PASS=secret
```

# おわりに

今回は、 **① 作成する環境の確認** についてでした。

次回は、 **[② Apache の導入](https://qiita.com/ryamate/items/e5ca19aece61717b6a01)** の手順です。

ありがとうございました。

## 参考にしたサイト

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

https://github.com/dokugaku-engineer/server-side/tree/master/part8