検証環境
Windows11 Home Edition (version 24H2)
$ wsl --version
WSL バージョン: 2.6.1.0
カーネル バージョン: 6.6.87.2-1
WSLg バージョン: 1.0.66
MSRDC バージョン: 1.2.6353
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26100.6584
# WSL にインストールした Linux
Ubuntu 22.04.5 LTS
# Ubuntu にインストールした Docker
Docker version 28.3.3, build 980b856
Docker Compose version v2.39.1
$ php --version
PHP 8.2.29 (cli) (built: Jul 1 2025 16:29:21) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.29, Copyright (c) Zend Technologies
with Zend OPcache v8.2.29, Copyright (c), by Zend Technologies
$ composer --version
Composer version 2.8.5 2025-01-21 15:23:40
$ minikube version
minikube version: v1.36.0
commit: f8f52f5de11fc6ad8244afac475e1d0f96841df1-dirty
$ kubectl version
Client Version: v1.33.4-dispatcher
Kustomize Version: v5.6.0
Server Version: v1.33.1
Laravel のインストール
$ composer create-project laravel/laravel laravel-project "12.*"
正しくインストールされたか確認
$ cd laravel-project
$ php artisan --version
Laravel Framework 12.30.1
storage フォルダ以下のパーミッションを 777 に変更
$ chmod 777 -R ./storage
正常に動作するか確認するため開発用サーバーを起動
$ php artisan serve
WEBブラウザで http://localhost:8000 を開いて以下の welcome ページが表示されるか確認する

Ctrl+C で開発用サーバーを終了させる
composer install 時の PHP バージョンの指定
下記コマンドで composer.json に PHP バージョン指定情報を追加する
$ composer config platform.php 8.2.29
下記コマンドで composer.lock に反映する
$ composer update platform.php 8.2.29
docker イメージビルドの準備
下記のファイルをプロジェクトフォルダ以下に作成する
laravel-project/.dockerignore
strage/framework/cache/**
strage/framework/sessions/**
strage/framework/testing/**
strage/framework/views/**
strage/logs/**
laravel-project/Dockerfile
FROM php:8.2.29-apache as devapp
EXPOSE 8080
COPY --chown=www-data:www-data . /var/www
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
RUN chmod 777 -R /var/www/storage/ && \
echo "Listen 8080" >> /etc/apache2/ports.conf && \
echo "ServerName 127.0.0.1" >> /etc/apache2/apache2.conf && \
a2enmod rewrite
laravel-project/000-default.conf
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/public/
<Directory /var/www/>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
laravel-project/docker-compose.build.yml
services:
app:
build:
context: .
dockerfile: ./Dockerfile
target: devapp
image: "laravel-project/app"
ports:
- "8080:8080"
docker イメージのビルド
下記コマンドで docker イメージをビルドする
$ docker compose -f docker-compose.build.yml build app
ビルドが成功するとイメージが作成される
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
laravel-project/app latest 50377b1aa8d9 27 minutes ago 564MB
作成したイメージを使ってコンテナが起動するか確認する
$ docker compose -f docker-compose.build.yml up -d
WEBブラウザで http://localhost:8080 を開いて先ほどと同様の welcome ページが表示されるか確認する
下記コマンドでコンテナを終了させる
$ docker compose -f docker-compose.build.yml down
minikube で動かすための準備
minikube を起動する
$ minikube start
kubectl のコンテキストが minikube になっているか確認
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* minikube minikube minikube default
docker のリポジトリを minikube のものに切り替える
$ eval $(minikube docker-env)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.k8s.io/kube-scheduler v1.33.1 398c985c0d95 4 months ago 73.4MB
registry.k8s.io/kube-controller-manager v1.33.1 ef43894fa110 4 months ago 94.6MB
registry.k8s.io/kube-apiserver v1.33.1 c6ab243b29f8 4 months ago 102MB
registry.k8s.io/kube-proxy v1.33.1 b79c189b052c 4 months ago 97.9MB
registry.k8s.io/etcd 3.5.21-0 499038711c08 5 months ago 153MB
registry.k8s.io/coredns/coredns v1.12.0 1cf5f116067c 10 months ago 70.1MB
registry.k8s.io/pause 3.10 873ed7510279 16 months ago 736kB
gcr.io/k8s-minikube/storage-provisioner v5 6e38f40d628d 4 years ago 31.5MB
minikube のリポジトリに Laravel のイメージを作成する
$ docker compose -f docker-compose.build.yml build app
laravel-project の直下に k8s フォルダを作成してマニフェストを配置する
$ cd laravel-project
$ mkdir k8s
laravel-project/k8s/myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myapp
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
strategy: {}
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: laravel-project/app:latest
name: app
imagePullPolicy: Never
ports:
- containerPort: 8080
resources: {}
status: {}
laravel-project/k8s/myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: myapp
name: myapp
spec:
ports:
- name: "8080"
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: myapp
type: LoadBalancer
status:
loadBalancer: {}
アプリケーションの起動
$ cd laravel-project
$ kubectl apply -f k8s/myapp-deployment.yaml
$ kubectl apply -f k8s/myapp-service.yaml
リソースが作成されたか確認
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/myapp-58b77d6f4f-rc86b 1/1 Running 0 12s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27d
service/myapp LoadBalancer 10.98.235.87 <pending> 8080:32538/TCP 7s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 12s
NAME DESIRED CURRENT READY AGE
replicaset.apps/myapp-58b77d6f4f 1 1 1 12s
動作確認
minikube tunnel を実行
$ minikube tunnel
✅ Tunnel successfully started
📌 NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...
🏃 Starting tunnel for service myapp.
WEBブラウザで http://localhost:8080 を開いて先ほどと同様の welcome ページが表示されるか確認する
Ctrl+C で minikube tunnel を終了させる
後始末
$ kubectl delete -f k8s/myapp-service.yaml
$ kubectl delete -f k8s/myapp-deployment.yaml
$ eval $(minikube docer-env -u)
$ minikube stop
参考サイト
kubernetes.io
qiita.com