Dockerを使ったLaravelプロジェクトのセットアップとトラブルシューティング

## はじめに
Dockerを利用してLaravelプロジェクトをセットアップする過程で、いくつかの問題に直面しました。この記事では、プロジェクトのセットアップ手順とトラブルシューティングの内容を詳細にまとめ、特に問題の背景要因とエラーの原因について分析します。

## 環境設定
### DockerとDocker Composeのインストール
最初にDockerとDocker Composeをインストールしました。公式ドキュメントに従い、以下のコマンドを実行してインストールを完了しました。

```bash
brew install docker docker-compose
```

### Laravelプロジェクトの作成
次に、Laravelプロジェクトを作成しました。プロジェクト名は`productmanagement`とし、以下のコマンドでプロジェクトを作成しました。

```bash
composer create-project --prefer-dist laravel/laravel productmanagement
```

## Docker Composeの設定
### `docker-compose.yml`の作成
LaravelプロジェクトをDockerで動かすために、`docker-compose.yml`ファイルを作成しました。

```yaml
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`を作成しました。

```nginx
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プロジェクトのディレクトリ構造が混乱していたため、以下の手順で整理。
...
1. **新しいプロジェクトディレクトリの作成**

   ```bash
   mkdir ~/Desktop/portfolio/tehyon/clean_productmanagement
   ```
...
2. **必要なファイルのコピー**

   ```bash
   cp -r ~/Desktop/portfolio/tehyon/productmanagement/* ~/Desktop/portfolio/tehyon/clean_productmanagement/
   ```
...
3. **元のディレクトリの削除**

   **注意:** 重要なファイルがないことを確認してから削除してください。

   ```bash
   rm -rf ~/Desktop/portfolio/tehyon/productmanagement
   ```
...
### 背景要因とエラーの原因分析
#### ディレクトリ構造の混乱
複数の場所に同じ名前のディレクトリが存在していたため、どのディレクトリが正しいプロジェクトディレクトリなのかが不明瞭になりました。ボリュームのマウント設定が正しく機能しなかった可能性があります。ディレクトリを整理することで、どのファイルがどのコンテナにマウントされるべきかが明確になりました。

#### OCI Runtime Exec Failedエラー
このエラーは、ホストマシンの現在の作業ディレクトリがコンテナのマウントされたファイルシステムの外部にあることが原因で発生します。Dockerコンテナ内での作業ディレクトリが正しく設定されていない場合に発生することが多いです。この問題を回避するために、以下のコマンドを使用してコンテナにアクセスしました。

```bash
docker exec -w / -it app /bin/sh
```

#### Laravelのログディレクトリが見つからない問題
Laravelのログディレクトリが見つからない場合、マウントされたボリュームの設定に問題があることが多いです。特に、ホストマシンのディレクトリ構造が複雑な場合、正しいパスを指定することが困難になります。この場合、`docker-compose.yml`ファイルの設定を確認し、適切なディレクトリがマウントされていることを確認しました。

### Dockerコンテナの再設定
コンテナを再作成し、ボリュームを正しくマウントするために以下の手順を実行しました。
...
1. **コンテナの停止**

   ```bash
   docker compose down
   ```
...
2. **不要なボリュームの削除**

   ```bash
   docker volume prune
   ```
...
3. **新しい設定でDocker Composeを起動**

   ```bash
   cd ~/Desktop/portfolio/tehyon/clean_productmanagement
   docker compose up -d
   ```
...
### ディレクトリ構造の確認
コンテナ内でディレクトリ構造を確認し、必要なファイルが正しく配置されていることを確認しました。
...
```bash
docker exec -it app /bin/sh
ls -l /var/www
```
...
ディレクトリ構造の確認時に問題がある場合、以下のコマンドを実行して更に詳細を確認します。

```bash
docker exec -it app /bin/sh
find / -name "storage"
```
...
### パーミッションの設定
ストレージとキャッシュディレクトリのパーミッションを設定しました。

```bash
docker exec -it app /bin/sh
cd /var/www
chmod -R 775 storage
chmod -R 775 bootstrap/cache
```
...
### ログの確認
NginxとLaravelのログを確認し、問題の原因を特定しました。
...
1. **Nginxエラーログの確認**

   ```bash
   docker exec -it web /bin/sh -c "cat /var/log/nginx/error.log"
   ```
...
2. **Laravelログの確認**

   ```bash
   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の設定に関する知識を深めることができました。この記事が、同様の問題に直面している方々の参考になれば幸いです。