0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel×Docker挙動を軽くする方法_修正版

Last updated at Posted at 2024-04-16

作成背景

  • 以前書いた記事が情報不足でわかりづらいため補足する

サンプルプロジェクト

最終形態を載せたプロジェクトを置いておくので適宜参照してほしい

以前の記事

最新版

Laravelが重くなる原因

/var/www/html/storage/framework/var/www/html/vendorが悪さをしているため、ローカルフォルダにマウントしないことで解決する

一筋縄でいかない理由

単純に事前に、マウントを外せばよいと考え実行すると、Laravelをsrcディレクトリにインストールしようとしたタイミングでディレクトリが空でないとエラーが出てしまう、、

フォルダをDockerイメージ作成時にマウントしないようにするとsrcディレクトリに空のディレクトリが作成されてしまうのが原因である

おそらく、srcに作成されている/var/www/html/storage/framework/var/www/html/vendorのボリューム先を別の場所に指定することができれば一度で解決するはず、、?

自分のDocker習熟度が低いため今回は、Laravelを導入した後に改めてイメージをビルドしなおして修正する方法を取ろうと思う

作業実施

手順1-Dockerfile, compose.yamlの作成

まずはこのレポジトリから、containerディレクトリ配下すべてとcompose.yamlを取得してください。

今回主に編集するのはcompose.yamlになりますがバージョンの変更やほかに必要なもののインストール、MySQLからPostgreSQLへの変更など適宜必要に応じて改変してご利用ください。

手順2-compsoe.yamlの変更

現在のcompose.yamlは通常実行用のものとなっているため、新しいプロジェクトを作成する場合にはcompose.amlを修正する必要があります。

試していないですがローカルディレクトリでLaravelをインストールして、新たにビルドすれば問題なく現在のcompose.yamlでも問題なく実行が可能なはずです

変更点は2つです。

compose.yaml
  # PHPサーバー
  php:
    # コンテナ名
    container_name: "php"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/php/Dockerfile"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - ./src:/var/www/html
      # - storage-volumes:/var/www/html/storage/framework
      # - vendor-volumes:/var/www/html/vendor
compose.yaml
# volumes: 
  # storage-volumes:
  # vendor-volumes:
Laravelインストール前用_完全版
compose.yaml
# コンテナ定義
services:
  # webサーバー
  web:
    # コンテナ名
    container_name: "web"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/web/Dockerfile"
    # ホスト側のポート:コンテナ側のポートを指定
    ports:
      - "8080:80"
    # src配下のファイルをコンテナ内の~/va/www/html配下に配置
    volumes:
      - "./src:/var/www/html"

  # PHPサーバー
  php:
    # コンテナ名
    container_name: "php"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/php/Dockerfile"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - ./src:/var/www/html
      # - storage-volumes:/var/www/html/storage/framework
      # - vendor-volumes:/var/www/html/vendor

  # DBサーバー
  db:
    # コンテナ名
    container_name: "db"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/db/Dockerfile"
    # ホスト側のポート:コンテナ側のポートを指定
    ports:
      - "3306:3306"
    # 環境変数の指定
    environment:
      - "MYSQL_ROOT_PASSWORD=password"
      - "MYSQL_DATABASE=database"
      - "MYSQL_USER=laravel"
      - "MYSQL_PASSWORD=password"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - "./container/db/data:/var/lib/mysql"
# volumes: 
#   storage-volumes:
#   vendor-volumes:

手順3-ビルド

docker compose up -d

手順4-Laravelのインストール

Laravelをインストールします。

docker-compose exec php composer create-project --prefer-dist "laravel/laravel=10.*" .

少し待ち時間が長いですが、気長に待ちましょう。

手順5-compose.yamlの修正

先ほどコメントアウトした部分を戻します。

修正
compose.yaml
# コンテナ定義
services:
  # webサーバー
  web:
    # コンテナ名
    container_name: "web"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/web/Dockerfile"
    # ホスト側のポート:コンテナ側のポートを指定
    ports:
      - "8080:80"
    # src配下のファイルをコンテナ内の~/va/www/html配下に配置
    volumes:
      - "./src:/var/www/html"

  # PHPサーバー
  php:
    # コンテナ名
    container_name: "php"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/php/Dockerfile"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - ./src:/var/www/html
      - storage-volumes:/var/www/html/storage/framework
      - vendor-volumes:/var/www/html/vendor

  # DBサーバー
  db:
    # コンテナ名
    container_name: "db"
    # コンテナの作成に使用するDockerfileのパス
    build:
      dockerfile: "./container/db/Dockerfile"
    # ホスト側のポート:コンテナ側のポートを指定
    ports:
      - "3306:3306"
    # 環境変数の指定
    environment:
      - "MYSQL_ROOT_PASSWORD=password"
      - "MYSQL_DATABASE=database"
      - "MYSQL_USER=laravel"
      - "MYSQL_PASSWORD=password"
    # srcディレクトリ内のファイルをコンテナ内の~/var/www/html配下にマウント
    volumes:
      - "./container/db/data:/var/lib/mysql"
volumes: 
  storage-volumes:
  vendor-volumes:

手順6-リビルドする

今の状態は、先ほど説明した原因部分も併せてマウントしてしまっているため、動作が軽くなるように再度ビルドし直します。

docker compose build
docker compose up -d

手順7-マウントしないことで起こるエラーを解決する

にアクセスすることでエラーを確認できます。
今回の場合は、以下のようになっているはずです。

error
Warning: require(/var/www/html/public/../vendor/autoload.php): Failed to open stream: No such file or directory in /var/www/html/public/index.php on line 34

Fatal error: Uncaught Error: Failed opening required '/var/www/html/public/../vendor/autoload.php' (include_path='.:/usr/local/lib/php') in /var/www/html/public/index.php:34 Stack trace: #0 {main} thrown in /var/www/html/public/index.php on line 34

ファイルがないと怒っているので、ファイルをコピーすることで解決します。

# PHPコンテナのIDを取得します
docker container ls

次のようにコピーします。

# idは適宜変更してください。
docker cp ./src/vendor cdd242978d2e:/var/www/html
docker cp ./src/storage cdd242978d2e:/var/www/html

手順8-アクセス権の設定

もう一度アクセスすると今度は、権限エラーが発生していることが分かります

error
file_put_contents(/var/www/html/storage/framework/sessions/iKVv2XjaoEEY8msML26fhhGBCwh9mKqG4VnFPGjS): Failed to open stream: No such file or directory

ファイルやディレクトリがないと言っていますが、実際には権限エラーとなっています。
気になる方は、ディレクトリが実際にあるかを確認してください。

今回は開発環境なので、フル権限を与えていますが実際に運用する場合は最低限必要なだけの権限を与えるようにしてください。

docker-compose exec php chmod -R 777 /var/www/html/storage

手順9-起動確認

最後に、dockerを落とした場合でも再度起動できるかを確認します

docker-compose down
docker-compose up -d

アクセスしたところ、正常に起動しない場合はyamlファイルの修正を行いビルドし直したあたりから再度やってみると解決が速いでしょう。

まとめ

以前の記事が分かりづらくあったので、今回改めてわかりやすくプロジェクトを立ち上げやすくなるように修正した。

実際のところ現在指定したバージョンのPHPやLaravelを利用するのであれば、GitHubから引っ張るだけでよいので、以前よりもずいぶんと楽にLaravelプロジェクトを始めることができるようになったと思う。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?