Amazon Linux2023イメージを使用したコンテナでLaravel環境を構築する
記事の目的・ゴール
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 を作成します。
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
を実行します。
起動できてますね!
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 コンテナの考えに則っていないので、今回のように構築することはないかもしれませんが…何かの役に立てば幸いです 😸
Discussion