🕊️

Amazon Linux2023イメージを使用したコンテナでLaravel環境を構築する

2023/12/17に公開

記事の目的・ゴール

Amazonlinux2023 イメージを使用したコンテナで Laravel を使用できるようにする試みです 😺

具体的には ↓ の構成になります。

  • AmazonLinux2023 のコンテナ
    • Nginx
    • PHP-FPM・Laravel アプリケーション
    • Supervisor で Nginx, PHP-FPM を稼働させる
  • MySQL のコンテナ

1 つのコンテナで複数のサービスを稼働させるため、Docker の「1 つのコンテナに 1 つのサービス」という考え方からはズレてしまっています…。

ただ、開発環境ではこういった特殊なこともあるかと思い、記事にします 🙏
何かおかしな点などあればご指摘いただけると嬉しいです 🙇

compose.yml の作成

services:
  app:
    build: ./docker
    volumes:
      - ./app/:/var/www/html
    ports:
      - 8080:80
  db:
    image: mysql:8.2
    volumes:
      - ./db-data/:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: Gg62zWrT
      MYSQL_USER: laravel
      MYSQL_PASSWORD: nNi3RqmY

AmazonLinux2023 のコンテナと MySQL のコンテナを作成します。

db-dataという謎のディレクトリは、コンテナを削除したときにも DB のデータを保持するためにマウントしています。

Dockerfile の作成

AmazonLinux2023 のコンテナで使用する Dockerfile を作成します。

docker/Dockerfile
FROM amazonlinux:2023

# 必要なパッケージのインストール
RUN dnf update \
    && dnf install -y nginx php8.2-fpm php8.2 php8.2-pdo php8.2-mysqlnd git

# DNFではsupervisorをインストールできなかったのでpip経由でインストール
RUN dnf install -y python3-pip \
    && pip3 install supervisor

# supervisor, nginxの設定ファイルをコンテナにコピー・ソケットファイルを保存するためのディレクトリを作成
COPY ./supervisord.conf /etc/supervisor/conf.d/
COPY ./nginx.conf /etc/nginx/conf.d/
RUN mkdir /run/php-fpm

# Composerのインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { 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

WORKDIR /var/www/html

# supervisorを起動する
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

パッケージのインストールにDNFを使用しています。
公式には、↓ のように記載されています。
(yum の後継のようなので、基本的にはこちらを使う感じですかね 🧐)

In Amazon Linux 2023 (AL2023), the default software package management tool is DNF. DNF is the successor to YUM, the package management tool in Amazon Linux 2.
DNF is similar to YUM in its usage. Many DNF commands are the same and with the same options as YUM commands. In a Command Line Interface (CLI) command, in most cases dnf replaces yum.
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/package-management.html

Amazon Linux 2023(AL2023)では、デフォルトのソフトウェア・パッケージ管理ツールは DNF だ。DNF は、Amazon Linux 2 のパッケージ管理ツールである YUM の後継である。
DNF は YUM と使い方が似ている。多くの DNF コマンドは、YUM コマンドと同じであり、同じオプションを持つ。コマンドラインインターフェイス(CLI)コマンドでは、ほとんどの場合、dnf が yum に取って代わる。

nginx の設定ファイルの作成

server {
    # リクエストを受け付けるアドレスとポート
    listen 80;

    # laravelのpublic/index.phpを指定
    root /var/www/html/example-app/public;
    index index.php;

    # ファイルをチェックする順番
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
	# 同じコンテナ内のため、Unixソケット通信?をする
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

supervisor の設定ファイル作成

[supervisord]
# フォアグラウンドで実行(バックグラウンドだとコンテナが終了するため)
nodaemon=true

[program:nginx]
command=nginx -g "daemon off;"
autostart=true
autorestart=true

[program:php-fpm]
command=php-fpm -F
autostart=true
autorestart=true

コンテナ&Laravel アプリケーションの作成

docker compose up -dでコンテナを作成&立ち上げます。
コンテナの中に入り、composer create-project laravel/laravel example-appを実行します。
Laravelスタート画面

起動できてますね!

DB との接続確認

↓ のような適当なデータを作成します。

CREATE DATABASE laravel_test;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');

.envの設定も忘れずにしておきます(同じ docker compose のネットワーク内なので HOST を db としています。)

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_test
DB_USERNAME=root
DB_PASSWORD=Gg62zWrT

Laravel Tinker で DB からデータを取得できるかチェックしてみます。

sh-5.2# php artisan tinker
Psy Shell v0.11.22 (PHP 8.2.9 — cli) by Justin Hileman
> DB::table('users')->get();
= Illuminate\Support\Collection {#6283
    all: [
      {#6286
        +"id": 1,
        +"name": "Charlie",
        +"email": "charlie@example.com",
        +"created_at": "2023-12-17 11:33:09",
        +"updated_at": "2023-12-17 11:33:09",
      },
    ],
  }

取得できてますね 😺

ディレクトリ構成

最終的なディレクトリ構成は ↓ になります。

- /app
- /db-data
- /docker
  - Dockerfile
  - nginx.conf
  - supervisord.conf
- .gitignore
- compose.yml

終わり

AmazonLinux2023 のコンテナに Nginx, PHP-FPM をインストールし、Supervisor で管理して Laravel アプリケーションの環境を構築しました。+おまけで MySQL コンテナとの接続も。

冒頭でも書いたように、コンテナの 1 プロセス 1 コンテナの考えに則っていないので、今回のように構築することはないかもしれませんが…何かの役に立てば幸いです 😸

https://github.com/Masato0405/al2023-laravel

GitHubで編集を提案

Discussion