Dockerを使用してLaravel開発環境を構築するための完全な手順

Dockerを使用してLaravel開発環境を構築するための完全な手順

序文

この記事では、Docker を使用して、ローカル コンピューターにインストールされている開発スイートに依存しない、高速で軽量で再現性のある Laravel および Vue プロジェクト開発環境を個人のローカル コンピューター上に構築します (開発環境のすべての依存関係は Docker ビルド コンテナーにインストールされます)。Vue が追加されているのは、一部のプロジェクトでは Laravel プロジェクトで Vue を使用してフロントエンドとバックエンドを分離して開発するためです。開発環境では、フロントエンド開発に必要なツール セットをインストールする必要があります。もちろん、フロントエンドとバックエンドを 2 つのプロジェクトに分けて開発することもできます。このトピックはこの記事の範囲外です。

私たちの目標は次のとおりです。

  • Mamp/Wampのようなソフトウェアをローカルにインストールしないでください
  • Vagrantのような仮想マシンは使用しないでください
  • PHP開発に必要なツールセットをローカルコンピュータにグローバルにインストールしないでください。
  • フロントエンド開発に必要なツールセットをローカルコンピュータにグローバルにインストールしないでください。
  • ローカルコンピュータにMysqlとNginxをグローバルにインストールしないでください

始める前に、Docker クライアントをインストールする必要があります。Docker の公式 Web サイトに詳細なインストール手順が記載されています。

ステップ1: Laravelソースパッケージを取得する

Composer がコンピューターにインストールされていないため、Composer を使用して Laravel プロジェクトを作成することはできません。ここでは cURL を使用して、最新の Laravel ソース コード パッケージを GitHub から直接ダウンロードします。wget または git clone を使用してソース コード パッケージを取得することもできます。

curl -L -O https://github.com/laravel/laravel/archive/v5.5.0.tar.gz /
&& tar -zxvf v5.5.0.tar.gz /
&& rm v5.5.0.tar.gz

上記のコマンドは、curl がソース コード パッケージをダウンロードした後に解凍します。解凍後、ソース コード パッケージ v5.5.0.tar.gz を削除します。実行後、laravel-5.5.0 プロジェクト ディレクトリが表示されます。

ステップ2: docker-compose.ymlを追加する

プロジェクトに docker-compose.yml ファイルを作成します。

Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケストレーションを実現することを目的とした、Docker の公式オープン ソース プロジェクトです。 Dockerfile テンプレート ファイルを使用すると、ユーザーは個別のアプリケーション コンテナーを簡単に定義できることがわかっています。ここでは、4 つのコンテナーを使用して、PHP、Mysql、Nginx を 4 つの異なるコンテナーに配置し、Compose を通じて 4 つのアプリケーション コンテナーを関連付けてプロジェクトを形成します。
レイアウト ファイルの冒頭は次のようになります。

バージョン: '2'
サービス:
  # 私たちのサービスはここにあります

オーケストレーション ファイルでは、各コンテナーはサービスと呼ばれ、アプリケーション全体で使用されるすべてのサービス (つまりコンテナー) はサービスの下に定義されます。

アプリサービス

APP サービスのコンテナーはプロジェクト内のコードを実行します。

アプリ:
 建てる:
  コンテクスト: 。/
  dockerfile: app.dockerfile
 作業ディレクトリ: /var/www
 ボリューム:
  - ./:/var/www
 環境:
  - 「DB_PORT=3306」
  - 「DB_HOST=データベース」

注:

  • アプリ コンテナを構築するには、イメージ ファイル app.dockerfile を使用します。イメージ ファイルでは、プロジェクトで使用される PHP モジュール イメージを構成し、フロントエンド コードをビルドするための NPM もインストールします。
  • working_dir: /var/www は作業ディレクトリを /var/www に設定します。コンテナでは、プロジェクト コードは /var/www ディレクトリに配置されます。これには、docker exec app を使用して実行されるコマンドも含まれます。これらのコマンドも /var/www を現在の作業ディレクトリとして使用します。
  • Volumes は、コンテナ内のデータ ボリュームをマウントするためのパス設定です。ここでは、データ ボリュームを 1 つだけ定義し、ホスト プロジェクト ディレクトリをコンテナ内の /var/www にマウントします。このようにして、ローカル コンピュータ上のプロジェクト コードに加えた変更は、すぐにコンテナに同期され、その逆も同様です。コンテナ内のコードに加えた変更も、ローカル コンピュータ上のプロジェクトにすぐにフィードバックされます。
  • environment は環境変数名を設定します。ここでは DB_PORT と DB_HOST を設定して、プロジェクト内の .env ファイルでこれら 2 つの項目の値を変更する必要がないようにしています。もちろん、開発環境で別途設定する必要がある環境変数はここに記述できます。Laravel が設定の読み取りに使用する DotEnv は、システムに指定された環境変数設定があるかどうかを検出します。ある場合は、.env ファイルを読み取りません。

ここで、上記のビルド手順で説明した app.dockerfile ファイルを作成する必要があります。具体的な内容は次のとおりです。

php:7.1.22-fpm より

# パッケージの更新
apt-get updateを実行する

# PHPとcomposerの依存関係をインストールする
apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev を実行します。

# 取得したパッケージファイルのローカルリポジトリをクリアする
# apt-get clean を実行する

# 必要な拡張機能をインストールする
# ここで、テストおよび展開プロセス中に必要なその他の拡張機能をインストールできます
apt-get clean; docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath を実行します。


# PHP 依存関係を簡単に管理できるように Composer をインストールします。
curl --silent --show-error https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer を実行します。

# ノードをインストールする
apt-get update を実行 &&\
  apt-get install -y --no-install-recommends gnupg &&\
  curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
  apt-get アップデート &&\
  apt-get install -y --no-install-recommends nodejs &&\
  npm config レジストリを設定します https://registry.npm.taobao.org --global &&\
  npm インストール --global gulp-cli

コマンドphp-fpm

注:

  • まず、開発中に必要になることが多い NPM と Composer をアプリ コンテナーにインストールしました。本番環境にリリースする場合は、アプリケーションを実行するコンテナーにプロジェクト コードを配置するのではなく、別の Composer を使用してプロジェクト コードをビルドするのが一般的です。コンテナーの中心的なアイデアの 1 つは、コンテナーを単一に保つことです。これにより、同じ役割を持つコンテナーをすばやく追加できます。

ウェブサービス

次に、Web サーバーを構成する必要があります。オーケストレーション ファイルでこのコンテナーに web という名前を付けます。

ウェブ:
 建てる:
  コンテクスト: 。/
  dockerfile: web.dockerfile
 作業ディレクトリ: /var/www
 ボリューム数:
  - アプリ
 ポート:
  -8080:80

注:

  • volumes_from は、アプリサービスで定義されたデータボリュームパスを再利用するために使用されます。
  • ポートを使用して、ローカル コンピューターのポート 8080 を Web コンテナーのポート 80 にマップします。この方法では、開発環境でホスト ファイルを設定する必要がなく、IP とポートを介して直接サービスにアクセスできます。

Web サーバーは nginx を使用するため、このコンテナーを構築するには nginx イメージ ファイルを使用する必要があります。その前に、nginx イメージに基づいてプロジェクトで使用する vhost を設定する必要があるため、次のように定義される web.dockerfile ファイルが必要です。

nginx:1.10から

vhost.conf に /etc/nginx/conf.d/default.conf を追加します。

イメージファイルの定義に従って、プロジェクト内の vhost.conf をコンテナの /etc/nginx/conf.d/default.conf にコピーし、基本的な nginx 構成を構成しました。vhost.conf 内の定義は次のとおりです。

サーバー{
  聞く 80;
  インデックス index.php index.html;
  ルート /var/www/public;

  位置 / {
    try_files $uri /index.php?$args;
  }

  場所 ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_passアプリ:9000;
    fastcgi_index インデックス.php;
    fastcgi_params を含めます。
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

注:

  • 開発環境のため、最もシンプルな構成のみ実行し、チューニングは考慮しません。
  • fastcgi_pass app:9000; nginx は fastcgi を介して PHP のリクエストを app サービスのポート 9000 に渡します。Docker-compose はサービスで定義されたコンテナー サービスに自動的に接続し、各サービスはサービス名で参照されます。

MySQL サービス

次に、Mysql サービスを設定します。上記の 2 つのサービスと少し異なるのは、PHP-FPM および Nginx コンテナーでは、コンテナー アクセスのためにローカル コンピューター上のファイルをコンテナーに同期するように設定することです。これにより、開発中にファイルに変更を加えたときにコンテナー内ですぐにフィードバックが得られるため、開発プロセスがスピードアップします。ただし、データベース コンテナーでは、コンテナー内に作成されたファイルを永続化できることを期待しています (既定のコンテナーが破棄されると、コンテナー内に作成されたファイルも破棄されます)。Docker のデータ ボリュームを通じて上記の機能を実現できますが、今度はローカル コンピューター上のファイルをデータ ボリュームにマウントする必要がなくなりました。Docker クライアントは、作成されたデータ ボリュームのローカル コンピューター上の特定の保存場所を管理します。
以下はオーケストレーションファイル内のデータベースサービスの設定です。

バージョン: '2'
サービス:

 データベース:
  イメージ:mysql:5.7
  ボリューム:
   -dbdata:/var/lib/mysql
  環境:
   - "MYSQL_DATABASE=ホームステッド"
   - "MYSQL_USER=homestead"
   - "MYSQL_PASSWORD=シークレット"
   - "MYSQL_ROOT_PASSWORD=シークレット"
  ポート:
    - 「33061:3306」

ボリューム:
 dbデータ:

注:

  • ファイルの下部では、volumes コマンドを使用して dbdata という名前のデータ ボリュームを作成しました (dbdata の後のコロンは意図的です。これは YML ファイルの構文制限であり、心配する必要はありません)。
  • データ ボリュームを定義した後、上記の <name>:<dir> の形式を使用して、コンテナ内の /var/lib/mysql ディレクトリに dbdata データ ボリュームをマウントするように Docker に通知します。
  • MySQL Docker イメージに必要な 4 つのパラメータが環境に設定されます。
  • ポート マッピングでは、ローカル コンピューターのポート 33061 をコンテナーのポート 3306 にマッピングして、コンピューター上のデータベース ツールを介して docker 内の Mysql に接続できるようにします。

すべてのサービスを統合する

以下は完全な docker-compose.yml ファイルです。オーケストレーション ファイルを通じて、3 つのアプリケーション コンテナーを関連付けて、プロジェクトのサーバーを形成します。

バージョン: '2'
サービス:

 # アプリケーション
 アプリ:
  建てる:
   コンテクスト: 。/
   dockerfile: app.dockerfile
  作業ディレクトリ: /var/www
  ボリューム:
   - ./:/var/www
  環境:
   - 「DB_PORT=3306」
   - 「DB_HOST=データベース」

 # Webサーバー
 ウェブ:
  建てる:
   コンテクスト: 。/
   dockerfile: web.dockerfile
  作業ディレクトリ: /var/www
  ボリューム数:
   - アプリ
  ポート:
   -8080:80

 # データベース
 データベース:
  イメージ:mysql:5.6
  ボリューム:
   -dbdata:/var/lib/mysql
  環境:
   - "MYSQL_DATABASE=ホームステッド"
   - "MYSQL_USER=homestead"
   - "MYSQL_PASSWORD=シークレット"
   - "MYSQL_ROOT_PASSWORD=シークレット"
  ポート:
    - 「33061:3306」

ボリューム:
 dbデータ:

サービスを開始する

上記の手順に従ってオーケストレーション ファイルと指定した Docker イメージ ファイルを設定したら、次のコマンドでサービスを開始できます。実行すると、上記のファイルに定義されている 3 つのサービスが開始されます。

docker-compose を起動 -d

初めて起動する場合、Docker クライアントは上記の 3 つのイメージをダウンロードしてサービスをビルドする必要があるため、起動が遅くなります。イメージのダウンロードとビルドが完了すると、以降の起動は非常に高速になります。

Laravelプロジェクトの初期化

サービスを開始したら、Laravel プロジェクトを初期化できます。手順は公式ドキュメントに記載されているものと同じですが、開始したアプリ サービスのコンテナーで実行する必要があります。

docker-compose exec アプリ composer インストール
docker-compose exec app npm install // フロントエンドプロジェクトが含まれている場合は、関連するコマンドを実行します docker-compose exec app cp .env.example .env
docker-compose exec app php artisan キー:生成
docker-compose exec アプリ php artisan 最適化
docker-compose exec app php artisan migrate --seed
docker-compose exec app php artisan make:controller MyController

注:

  • docker-compose execは指定されたコンテナにコマンドを送信して実行します。
  • appはdocker-compose.ymlで定義されたサービスであり、php-fpmを実行するコンテナです。
  • php artisan migrateはコンテナ内で実行されるコマンドです

nginx ログを表示する方法:

  • docker ps nginxサービスのコンテナIDを見つける
  • docker exec -it <コンテナID> /bin/bash を実行してnginxコンテナに入ります
  • nginx ログの具体的なパスについては、プロジェクト内の vhost.conf を確認してください。

上記のコマンドを実行すると、http://127.0.0.1:8080/ 経由でプロジェクトにアクセスできるようになります。

参考のために、私の Github gist に参照ファイルのセットがあります https://gist.github.com/kevinyan815/fa0760902d29f19a4213b4a16fe0501b

gist 内のファイルは少し古いです。その後、使用中にいくつかの新しい PHP モジュールと Node が追加されました。以前は Composer も別のコンテナーに配置されていました。しかし、これを読んだ後は、必要に応じてこれらのファイルを変更できるほど賢明であると信じています。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Git を使用して Laravel プロジェクトを新しい開発環境に移行する詳細な手順
  • Dockerを使用してLaravelおよびVueプロジェクトの開発環境を構築する詳細な説明
  • dockerでlaravel開発環境をインストールする方法の詳細な説明
  • 4つのWindowsシステムにおけるLaravelフレームワーク開発環境のインストールと展開方法を詳細に解説

<<:  Ubuntu の MySQL のパラメータ ファイル my.cnf の詳細な分析

>>:  Angularコンポーネントライフサイクルの詳細説明(I)

推薦する

PID を作成できないために MySQL が起動できない問題を解決する方法

問題の説明MySQL 起動エラー メッセージは次のとおりです。 mysqld を起動します (sys...

JS関数の呼び出し、適用、バインドの超詳細な方法

目次JS 関数呼び出し、適用、バインドメソッド1. call() メソッド1. call() メソッ...

VScode設定のリモートデバッグLinuxプログラムの問題を解決する

VScode リモートデバッグ Linux プログラムの問題について見てみましょう。具体的な内容は以...

Excel ファイルを MySQL データベースにインポートする方法

この記事では、ExcelファイルをMySQLデータベースにインポートする方法を参考までに紹介します。...

Nginxの現在の制限設定の詳細な説明

この記事では、最も単純なものから最も複雑なものまで、Nginx の現在の制限構成を例を使って説明しま...

JS での Reduce() メソッドの使用の概要

目次1. 文法2. 例3. その他の関連方法長い間、reduce() メソッドの具体的な使い方を理解...

MySQL データベース内の同じテーブルを同時にクエリして更新する方法

通常のプロジェクトでは、1 回の入札で同時にデータを更新および照会する必要があるという問題によく遭遇...

MySQL 8.0 が起動できない 3534 の解決策

MySQL 8.0 サービスを開始できません最近、 cmdで MySQL サービスを起動するときに遭...

Tomcat のメモリ構成の正しい姿勢についての簡単な説明

1. 背景多くのブログや記事を読みましたが、JVM のメモリ割り当て方法に関する包括的な記事は見つか...

startup.bat をダブルクリックすると Tomcat がクラッシュする問題の解決方法の詳細な説明

Tomcat を学習したばかりのプログラマーにとって、これはよくある間違いです。 1. 環境変数の問...

Windows で MySQL のルート パスワードをリセットする方法

今日、WordPress がデータベースに接続できないことがわかりました。ウィンドウ サーバーにログ...

イメージの起動時にdocker runまたはdocker restartが自動的に終了する問題を解決します

コマンドを実行します: docker run --name centos8 -d centos /b...

Mysql はテーブル内の古いデータを定期的にクリアし、いくつかのデータを保持します (推奨)

以下の目標を達成するため: Mysql データベースは、一定の間隔 (2 時間または 1 日、カスタ...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

ページスピードの最適化の概要

インターネットは人々の生活にますます欠かせないものになってきていると思います。 Ajax や fle...