はじめに
Dockerを利用してLaravelプロジェクトをセットアップする過程で、いくつかの問題に直面しました。この記事では、プロジェクトのセットアップ手順とトラブルシューティングの内容を詳細にまとめ、特に問題の背景要因とエラーの原因について分析します。
環境設定
DockerとDocker Composeのインストール
最初にDockerとDocker Composeをインストールしました。公式ドキュメントに従い、以下のコマンドを実行してインストールを完了しました。
brew install docker docker-compose
Laravelプロジェクトの作成
次に、Laravelプロジェクトを作成しました。プロジェクト名はproductmanagementとし、以下のコマンドでプロジェクトを作成しました。
composer create-project --prefer-dist laravel/laravel productmanagement
Docker Composeの設定
docker-compose.ymlの作成
LaravelプロジェクトをDockerで動かすために、docker-compose.ymlファイルを作成しました。
version: '3.8'
services:
app:
image: php:8.0-fpm
container_name: app
working_dir: /var/www
volumes:
- .:/var/www
- ./php.ini:/usr/local/etc/php/php.ini
networks:
- app-network
web:
image: nginx:alpine
container_name: web
working_dir: /var/www
volumes:
- .:/var/www
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
networks:
- app-network
db:
image: mysql:8.0
container_name: db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: productdb
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
volumes:
- clean_productmanagement_db-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
clean_productmanagement_db-data:
Nginx設定ファイルの作成
Nginxの設定ファイルnginx.confを作成しました。
server {
listen 80;
index index.php index.html;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
トラブルシューティング
ディレクトリ構造の問題
Laravelプロジェクトのディレクトリ構造が混乱していたため、以下の手順で整理。
...
-
新しいプロジェクトディレクトリの作成
mkdir ~/Desktop/portfolio/tehyon/clean_productmanagement
...
2. 必要なファイルのコピー
cp -r ~/Desktop/portfolio/tehyon/productmanagement/* ~/Desktop/portfolio/tehyon/clean_productmanagement/
...
3. 元のディレクトリの削除
注意: 重要なファイルがないことを確認してから削除してください。
rm -rf ~/Desktop/portfolio/tehyon/productmanagement
...
背景要因とエラーの原因分析
ディレクトリ構造の混乱
複数の場所に同じ名前のディレクトリが存在していたため、どのディレクトリが正しいプロジェクトディレクトリなのかが不明瞭になりました。ボリュームのマウント設定が正しく機能しなかった可能性があります。ディレクトリを整理することで、どのファイルがどのコンテナにマウントされるべきかが明確になりました。
OCI Runtime Exec Failedエラー
このエラーは、ホストマシンの現在の作業ディレクトリがコンテナのマウントされたファイルシステムの外部にあることが原因で発生します。Dockerコンテナ内での作業ディレクトリが正しく設定されていない場合に発生することが多いです。この問題を回避するために、以下のコマンドを使用してコンテナにアクセスしました。
docker exec -w / -it app /bin/sh
Laravelのログディレクトリが見つからない問題
Laravelのログディレクトリが見つからない場合、マウントされたボリュームの設定に問題があることが多いです。特に、ホストマシンのディレクトリ構造が複雑な場合、正しいパスを指定することが困難になります。この場合、docker-compose.ymlファイルの設定を確認し、適切なディレクトリがマウントされていることを確認しました。
Dockerコンテナの再設定
コンテナを再作成し、ボリュームを正しくマウントするために以下の手順を実行しました。
...
-
コンテナの停止
docker compose down
...
2. 不要なボリュームの削除
docker volume prune
...
3. 新しい設定でDocker Composeを起動
cd ~/Desktop/portfolio/tehyon/clean_productmanagement
docker compose up -d
...
ディレクトリ構造の確認
コンテナ内でディレクトリ構造を確認し、必要なファイルが正しく配置されていることを確認しました。
...
docker exec -it app /bin/sh
ls -l /var/www
...
ディレクトリ構造の確認時に問題がある場合、以下のコマンドを実行して更に詳細を確認します。
docker exec -it app /bin/sh
find / -name "storage"
...
パーミッションの設定
ストレージとキャッシュディレクトリのパーミッションを設定しました。
docker exec -it app /bin/sh
cd /var/www
chmod -R 775 storage
chmod -R 775 bootstrap/cache
...
ログの確認
NginxとLaravelのログを確認し、問題の原因を特定しました。
...
-
Nginxエラーログの確認
docker exec -it web /bin/sh -c "cat /var/log/nginx/error.log"
...
2. Laravelログの確認
docker exec -it app /bin/sh -c "cd /var/www/storage/logs && tail -f laravel.log"
...
学んだこと
ホストマシン上のディレクトリとコンテナ内のディレクトリのマウント設定に誤りがあると、ファイルが正しくマウントされず、結果として必要なファイルが見つからない問題が発生しました。この問題を解決するために、docker-compose.ymlファイルのボリューム設定を修正しました。
これらの手順を実行することで、Dockerコンテナが正常に動作し、Laravelプロジェクトが正しくセットアップされました。ブラウザでhttp://localhost:8080にアクセスして、Laravelのデフォルトページが表示されることを確認しました。
まとめ
Dockerを使用してLaravelプロジェクトをセットアップする過程で、ディレクトリ構造やボリュームのマウント、パーミッションの設定など、いくつかのトラブルシューティングを行いました。これらの経験を通じて、DockerとLaravelの設定に関する知識を深めることができました。この記事が、同様の問題に直面している方々の参考になれば幸いです。