DockerでのLAMP環境構築手順(Amazon Linux 2/PHP8.1(Laravel9)) ⑥docker-compose.ymlの作成&MySQLの導入(全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 回を予定しています。

[① 作成する環境の確認](https://qiita.com/ryamate/items/47183e1ffd4843ef18fa)
[② 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 の導入**
[⑦ Laravel 9 系のインストール](https://qiita.com/ryamate/items/79875e22906cfb51af67)
[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)

今回は、 **⑥ docker-compose.yml の作成 & MySQL の導入** についてです。今回の作業完了時点で、LAMP環境についてはひと通り揃うことになります。

## 環境

以下の Docker 環境を構築します。

- Amazon Linux 2
- Apache 2.4
- MySQL 8.0.28
- PHP 8.1.x
- Laravel 9.x

## 目次

[1. Docker コンテナの削除](#1-docker-コンテナの削除)
[2. Dockerfile の確認](#2-dockerfile-の確認)
[3. docker-compose.yml の作成](#3-docker-composeyml-の作成)
[4. MySQL の Docker 関連ファイルの作成・編集](#4-mysql-の-docker-関連ファイルの作成編集)
[5. Docker イメージとコンテナの作成](#5-docker-イメージとコンテナの作成)

# 1. Docker コンテナの削除

Docker コンテナを削除します。

```bash
docker container rm -f advent-calendar
```

# 2. Dockerfile の確認

これまで編集した web サーバー用の 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 \
  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

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

# 3. docker-compose.yml の作成

前回に引き続き、以下のリポジトリを参考に、 Docker 関連ファイルを作成・編集します。

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

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

今回は、 docker-compose.yml を作成し、web コンテナ、 db コンテナを定義して、まとめて実行できるようにしていきます。

ここまで作成した Dockerfile は、 web コンテナ の Dockerfile として起動するようにします。

## 3-1. ディレクトリ構成の確認

今回の記事の完了時点のディレクトリ構成は以下の通りです。

```
.
├── .env
├── .env.example
├── docker-compose.yml
└── infra
    └── docker
        ├── mysql
        │   ├── Dockerfile
        │   └── my.cnf
        └── php
            └── Dockerfile
```

## 3-2. docker-compose.yml の作成

docker-compose.yml を作成・編集します。

編集内容については、web コンテナとしてこれまでに編集した Web サーバーの Dockerfile（Amazon Linux 2 / Apache / PHP） について記述し、 db コンテナとして MySQL の導入 について記述します。

```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}
```

- `services:` → サービス（コンテナ）の定義
- `build:` → ビルドコンテキストのパス（Dockerfile 設置場所のパス）
- `ports:` → 開放するポート
- `volumes:` → ホストのファイルをコンテナにマウント
    - ボリュームを使用して、ホストのファイルをコンテナにマウントしておきます。コンテナの外にあるディレクトリ、ファイルをマウントすることでコンテナの中から利用できるようになります。

## 3-3. .env ファイルの作成

環境変数についての .env ファイルを作成しておきます。

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

# 4. MySQL の Docker 関連ファイルの作成・編集

MySQL の Docker 関連ファイル（Dockerfile, my.cnf）を作成・編集します。

## 4-1. Dockerfile の作成・編集

MySQL を起動させるための **Dockerfile** を作成・編集します。

```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
```

ベースイメージには、以下のイメージを使用しています。

https://hub.docker.com/r/mysql/mysql-server

インストールするパッケージについては、利用している動画教材の環境を参考にさせていただいています。

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

## 4-2. my.cnf の作成・編集

**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
```

# 5. Docker イメージとコンテナの作成

docker compose で、 web コンテナと db コンテナを作成・起動します。

```bash
docker compose up -d --build
```

# おわりに

今回は、 **⑥ docker-compose.yml の作成 & MySQL の導入** についての手順でした。

次回は、 **[⑦ Laravel 9 系のインストール](https://qiita.com/ryamate/items/79875e22906cfb51af67)** の手順です。

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

## 参考にしたサイト

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

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

https://hub.docker.com/r/mysql/mysql-server

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