【Docker】手軽にLaravel11を構築する
Laravel11環境をDockerで作っていきます
動作環境
Windows11
VSCode(コマンド打てるなら何でも)
Docker Desktop v4.12.0
やる気
Laravel11のリリースノートはこちら
フォルダ構成
.
├─ docker
│ ├─ app
│ │ ├─ Dockerfile
│ │ └─ php.ini
│ └─ web
│ ├─ default.conf
│ └─ Dockerfile
├─ src ← コンテナ起動時に勝手に作られるやつ
└─ docker-compose.yml
PHPコンテナを作成
まずはLaravelの開発環境を構築するための、PHPのコンテナを作成します。
docker-compose.ymlの作成
PHPコンテナについての記述は以下の通り
version: "3.9"
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
volumes:
- ./src/:/app
volumesに書いた「./src/:/app」のsrcが後々作成されるフォルダです
(コンテナ内にもappフォルダが作成されます)
Dockerfileの作成
FROM php:8.3-fpm
ENV TZ Asia/Tokyo
# ミドルウェアインストール
RUN apt-get update && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
docker-php-ext-install intl pdo_mysql zip bcmath
COPY ./docker/app/php.ini /usr/local/etc/php/php.ini
# Composerインストール
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer
# Node.jsインストール
COPY --from=node:18 /usr/local/bin/node /usr/local/bin/node
COPY --from=node:18 /usr/local/lib/node_modules /usr/local/lib/node_modules
# RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
# RUN apt-get install -y nodejs
WORKDIR /app
# ユーザーを作成
ARG DOCKER_UID=1000
ARG DOCKER_USER=docker
ARG DOCKER_PASSWORD=docker
ARG ROOT_USER=root
ARG ROOT_PASSWORD=root
RUN useradd -m --uid ${DOCKER_UID} --groups sudo ${DOCKER_USER} \
&& echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd \
&& echo ${ROOT_USER}:${ROOT_PASSWORD} | chpasswd
# 作成したユーザーに切り替える
USER ${DOCKER_USER}
Laravel11はPHP8.2以上が必要なため最新版の8.3を入れました
ミドルウェアは個人的に必要なものを入れていますがbcmathは要らないと思います
ComposerとNode(任意)のインストールはマルチステージビルドを使用しています
権限やらの関係でユーザーも作成しています
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 = /var/log/php/php-error.log
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
php.iniに関してはこちらのサイトの内容を丸々お借りして作成しています。
PHPコンテナのビルド&起動
PHPのコンテナの準備が出来たので、実際に起動してみます
docker-compose up -d --build
起動したコンテナを確認する
コマンドを打ってコンテナを確認します
「omochi」は今回作成するときのルートフォルダの名前です
このタイミングでsrcというフォルダが作成されています
> docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
omochi-app-1 "docker-php-entrypoi…" app running 9000/tcp
>
コンテナの中に入って諸々確認します
$ pwd
/app
$ php -v
PHP 8.3.7 (cli) (built: May 14 2024 12:46:30) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.7, Copyright (c) Zend Technologies
$ composer -v
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.7.6 2024-05-04 23:03:15
~中略~
$ php -m
[PHP Modules]
bcmath
Core
~省略~
要らないって言ってたbcmathもしっかり入ってます
nginxコンテナを作成
webサーバーとなるnginxのコンテナを作成します
docker-compose.ymlの追記
version: "3.9"
services:
app:
~ 中略 ~
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- 8000:80
depends_on:
- app
volumes:
- ./src/:/app
web:から下が追記した内容です
ホスト側とコンテナ間のポート番号の対応付けを設定します。
ホスト側のポート番号 : コンテナのポート番号 で記載します
Dockerfileの作成
FROM nginx:1.20-alpine
ENV TZ Asia/Tokyo
COPY ./docker/web/default.conf /etc/nginx/conf.d/default.conf
default.confの作成
server {
listen 80;
server_name example.com;
root /app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
以下のLaravel 11.xの公式サイトを基に設定しています
rootとfastcgi_passは今回の構成に合わせて変更しています
nginxコンテナのビルド&起動
nginxのコンテナの準備が出来たので、また実際に起動してみます
docker-compose up -d --build
起動したコンテナを確認する
> docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
omochi-app-1 "docker-php-entrypoi…" app running 9000/tcp
omochi-web-1 "/docker-entrypoint.…" web running 0.0.0.0:8000->80/tcp
>
コンテナの中に入って諸々確認します
/ # nginx -v
nginx version: nginx/1.20.2
Laravelのインストール
appコンテナに入ってLaravelをインストールします
composer create-project laravel/laravel .
インストールが完了したらバージョンを確認してlocalhost:8000にアクセスし、しブラウザでLaravelのウェルカムページが表示できることを確認します
php artisan -v
Laravel Framework 11.7.0
Laravel11ではデフォルトのデータベースがSQLiteとなっているためそのままSQLiteを使用します(なのでdbコンテナを作成していませんでした)
プロジェクト作成時にマイグレーションまで完了しています
databaseフォルダ内にdatabase.sqliteというファイルがあるのでこれをHeidi
やA5M2で読み込みます
おわり
なんかいい感じにできました(3回目)
特にエラーが出ることなくサクッと作ることができました
AdminLTEを入れて管理画面でも作ろうと思います
どこか間違っている個所などあればコメントで教えていただければ幸いです…!
おまけ
なぜユーザーを作成するのか
ユーザーを作成せずに作った結果
FROM php:8.3-fpm
ENV TZ Asia/Tokyo
# ミドルウェアインストール
RUN apt-get update && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
docker-php-ext-install intl pdo_mysql zip bcmath
COPY ./docker/app/php.ini /usr/local/etc/php/php.ini
# Composerインストール
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer
# Node.jsインストール
COPY --from=node:18 /usr/local/bin/node /usr/local/bin/node
COPY --from=node:18 /usr/local/lib/node_modules /usr/local/lib/node_modules
# RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
# RUN apt-get install -y nodejs
WORKDIR /app
プロジェクト作成後localhost:8000にアクセスすると
パーミッション弄れば直せますがプロジェクト作った後にいじるのが面倒なのでコンテナ作成時にユーザーを作成しています
(というかユーザー作成はしておいた方がいいっておばーちゃんがいってた)
データベースにMySQLを使いたい
下記を追加して再ビルドするだけです
.
├─ docker
│ ├─ app
│ │ ├─ Dockerfile
│ │ └─ php.ini
│ ├─ db ← 追加
│ │ ├─ Dockerfile ← 追加
│ │ └─ my.conf ← 追加
│ └─ web
│ ├─ default.conf
│ └─ Dockerfile
├─ src
└─ docker-compose.yml ← 追記
docker-compose.yml
version: "3.9"
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
volumes:
- ./src/:/app
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- 8081:80
depends_on:
- app
volumes:
- ./src/:/app
# 以下を追記
db:
build:
context: .
dockerfile: ./docker/db/Dockerfile
ports:
- 3306:3306
environment:
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
TZ: 'Asia/Tokyo'
volumes:
- mysql-volume:/var/lib/mysql
volumes:
mysql-volume:
Dockerfile
FROM mysql:8.4
COPY ./docker/db/my.conf /etc/my.conf
my.conf
[mysqld]
# character
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
ただ、デフォルトがSQLiteになったため、.envの内容やconfig諸々弄る必要があったと思います(未確認)
この記事が気に入ったらサポートをしてみませんか?