DockerでLaravelとVueプロジェクトの開発環境を構築する


この記事では、Dockerを介して、ローカルコンピュータにインストールされている任意の開発キットに依存しない高速で軽量なレプリケーション可能なLaravelおよびVueプロジェクトの開発環境(開発環境のすべての依存はDockerコンストラクタにインストールされている)を構築します.Vueを追加するのは、LaravelプロジェクトでVueを使用して前後の分離開発を行うプロジェクトがあるためです.開発環境ではフロントエンド開発に必要なツールセットをインストールする必要があるが,もちろん前後端を2つのプロジェクトに分けて開発することもできるが,この話題は本論文の議論の範囲外である.
私たちの目標は
  • Mamp/Wampのようなソフトウェアをローカルにインストールしない
  • Vagrantのような仮想マシンを使用しない
  • ローカルコンピュータにPHP開発に必要なツールセット
  • をグローバルにインストールしない
  • ローカルコンピュータにフロントエンド開発に必要なツールセット
  • をグローバルにインストールしない.
  • ローカルコンピュータにMysqlとNginx
  • をグローバルにインストールしない
    始める前にDockerクライアントをインストールする必要があります.Dockerの公式サイトには詳細なインストール方法があります.
    ステップ1:Laravelのソースパッケージを取得する
    私たちのパソコンにはComposerがインストールされていないので、Composerを使ってLaravelプロジェクトを作成することはできません.ここではcURLを使ってgithubから最新のLaravelソースパッケージを直接ダウンロードしました.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テンプレートファイルを使用すると、ユーザーが個別のアプリケーションコンテナを簡単に定義できることを知っています.ここでは、PHPMysql、 Nginx compose`をそれぞれ4つのコンテナに関連付けてプロジェクトを構成します.
    編成ファイルの先頭は次のとおりです.
    version: '2'
    services:
       # our services will go here
    編成ファイルでは、各コンテナをサービスと呼び、サービスの下でアプリケーション全体で使用されるすべてのサービス(すなわちコンテナ)を定義します.
    Appサービス
    APPサービスのコンテナは、私たちのプロジェクトのコードを実行します.
    app:
      build:
        context: ./
        dockerfile: app.dockerfile
      working_dir: /var/www
      volumes:
        - ./:/var/www
      environment:
        - "DB_PORT=3306"
        - "DB_HOST=database"
    Notes:
  • app.dockerfileというミラーファイルを使用してAppコンテナを構築し、ミラーファイルではプロジェクトで使用するPHPモジュールをミラー構成し、NPMを追加してフロントエンドコードを構築します.
  • working_dir: /var/www作業ディレクトリは/var/wwwに設定され、コンテナ内のプロジェクトコードは/var/wwwディレクトリの下に配置され、docker exec appを使用して実行されるコマンドも/var/wwwを現在の作業ディレクトリとする.
  • volumesはコンテナ内のデータボリュームにマウントされたパス設定であり、ここでは1つのデータボリュームだけを定義し、ホストプロジェクトディレクトリをコンテナ内の/var/wwwにマウントすることで、ローカルコンピュータでプロジェクトコードに対する変更がすぐにコンテナに同期し、逆にコンテナでコードに対する変更もローカルコンピュータのプロジェクトにタイムリーにフィードバックされます.
  • environment環境変数名を設定します.ここではDB_PORTDB_HOSTを設定します.これにより、プロジェクトの.envファイルのこの2つの値を変更する必要はありません.もちろん、開発環境で個別に設定する必要がある環境変数はここまで書くことができます.Laravel読み取り構成で使用されているDotEnvは、システムに指定された環境変数の設定があるかどうかを検出します.あれば.envのファイルを読み取ることはありません.
  • 次に、上記のbuildセクションで説明したapp.dockerfileというファイルを作成する必要があります.具体的な内容は次のとおりです.
    FROM php:7.1.22-fpm
    
    # Update packages
    RUN apt-get update
    
    # Install PHP and composer dependencies
    RUN apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev
    
    # Clear out the local repository of retrieved package files
    # RUN apt-get clean
    
    # Install needed extensions
    # Here you can install any other extension that you need during the test and deployment process
    RUN apt-get clean; docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath
    
    
    # Installs Composer to easily manage your PHP dependencies.
    RUN curl --silent --show-error https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Install Node
    RUN apt-get update &&\
        apt-get install -y --no-install-recommends gnupg &&\
        curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
        apt-get update &&\
        apt-get install -y --no-install-recommends nodejs &&\
        npm config set registry https://registry.npm.taobao.org --global &&\
        npm install --global gulp-cli
    
    CMD php-fpm
    Notes:
  • 私はここでまずNPMとComposerをappコンテナに入れました.開発時に常に実行する必要があるためです.生産環境に公開されると、アプリケーションを実行するコンテナではなく、プロジェクトコードを個別のcomposerで構築するのが一般的です.コンテナの核心思想の一つは、同じ役割のコンテナを迅速に増やすことです.
  • Webサービス
    次に、このコンテナを編成ファイルにwebと命名するWebサーバを構成する必要があります.
    web:
      build:
        context: ./
        dockerfile: web.dockerfile
      working_dir: /var/www
      volumes_from:
        - app
      ports:
        - 8080:80
    Notes:
  • volumes_fromは、appサービスにおいて定義されたデータボリュームパス
  • を多重化するために使用される.
  • ローカルコンピュータの8080ポートをportsでwebコンテナの80ポートにマッピングすることで、開発環境でhostsファイルを設定することなく、IPプラスポートで直接サービスにアクセスできます.Webサーバはnginxを選択するので、nginxミラーファイルを使用してこのコンテナを構築する必要があります.その前に、nginxミラーに基づいてプロジェクトで使用するvhostを設定する必要があります.そのため、web.dockerfileファイルが必要です.その定義は以下の通りです.
  • FROM nginx:1.10
    
    ADD vhost.conf /etc/nginx/conf.d/default.conf
    ミラーファイルの定義に基づいて、プロジェクトのvhost.confをコンテナの/etc/nginx/conf.d/default.confにコピーし、基本的なnginx構成が構成され、vhost.confの定義は以下の通りです.
    server {
        listen 80;
        index index.php index.html;
        root /var/www/public;
    
        location / {
            try_files $uri /index.php?$args;
        }
    
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    Notes:
  • 開発環境なので、私たちは最も簡単な構成だけを行い、チューニングをしないで考えています.
  • fastcgi_pass app:9000; nginxは、PHPに対する要求をfastcgiを介してappサービスの9000ポートに伝達し、docker-composeはservicesで定義されたコンテナサービスを自動的に接続し、各サービスは互いにサービス名で参照される.
  • Mysqlサービス
    次にMysqlサービスを構成します.上記の2つのサービスとは少し違います.PHP-FPMとNginxのコンテナでは、ローカルコンピュータのファイルをコンテナに同期してアクセスできるように構成しています.これにより、開発時にファイルの変更を迅速にコンデンサでフィードバックすることができ、開発プロセスを速めることができます.ただし、データベースコンテナで作成したファイルを永続化したい(デフォルトのコンテナが破棄されると、コンテナ内で作成したファイルも破棄される)ので、Dockerのデータボリュームで上記の機能を実現できますが、今回はローカルコンピュータのファイルをデータボリュームに掛ける必要はありません.Dockerクライアントは、作成したデータボリュームのローカルコンピュータに具体的に格納されている場所を管理します.
    次は、ファイルのレイアウトにおけるdatabaseサービスの設定です.
    
    version: '2'
    services:
    
      database:
        image: mysql:5.7
        volumes:
          - dbdata:/var/lib/mysql
        environment:
          - "MYSQL_DATABASE=homestead"
          - "MYSQL_USER=homestead"
          - "MYSQL_PASSWORD=secret"
          - "MYSQL_ROOT_PASSWORD=secret"
        ports:
            - "33061:3306"
    
    volumes:
      dbdata:
    Notes:
  • ファイルの一番下にvolumesコマンドでdbdataというデータボリュームを作成しました(dbdataの後ろのコロンは意図的に書かれています.これはYMLファイルの構文制限であり、あまり関心を持たない)
  • データボリュームを定義した後、: のフォーマットを使用してDockerにdbdataデータボリュームをコンテナの/var/lib/mysqlディレクトリに
  • に掛けるように通知します.
  • environmentsにはMysqlのdockerミラーに必要な4つの必要なパラメータが設定されています.
  • portsポートマッピングでは、ローカルコンピュータの33061ポートをコンテナの3306ポートにマッピングし、コンピュータ上のデータベースツールでdocker内のMysqlに接続できます.
  • すべてのサービスを統合
    次は完全なdocker-compose.ymlファイルです.ファイルを編成することで、3つのアプリケーションコンテナを関連付けてプロジェクトのサービス・エンドを構成します.
    version: '2'
    services:
    
      # The Application
      app:
        build:
          context: ./
          dockerfile: app.dockerfile
        working_dir: /var/www
        volumes:
          - ./:/var/www
        environment:
          - "DB_PORT=3306"
          - "DB_HOST=database"
    
      # The Web Server
      web:
        build:
          context: ./
          dockerfile: web.dockerfile
        working_dir: /var/www
        volumes_from:
          - app
        ports:
          - 8080:80
    
      # The Database
      database:
        image: mysql:5.6
        volumes:
          - dbdata:/var/lib/mysql
        environment:
          - "MYSQL_DATABASE=homestead"
          - "MYSQL_USER=homestead"
          - "MYSQL_PASSWORD=secret"
          - "MYSQL_ROOT_PASSWORD=secret"
        ports:
            - "33061:3306"
    
    volumes:
      dbdata:
    サービスの開始
    上記の手順に従ってファイルを編成し、指定したdockerミラーファイルを構成すると、次のコマンドでサービスを起動できます.実行後、上記のファイルで定義した3つのサービスが起動します.
    docker-compose up -d 
    最初の起動時、dockerクライアントは上記の3つのミラーをダウンロードし、サービスを構築するため、起動速度が遅くなり、ミラーをダウンロードして構築が完了すると、以降の起動が非常に速くなります.
    Laravelプロジェクトの初期化
    サービスを開始するとLaravelプロジェクトを初期化できます.手順は公式ドキュメントで説明したようになりますが、起動したappサービスのコンテナで実行する必要があります.
    docker-compose exec app composer install
    docker-compose exec app npm install //                  
    docker-compose exec app cp .env.example .env
    docker-compose exec app php artisan key:generate
    docker-compose exec app php artisan optimize
    docker-compose exec app php artisan migrate --seed
    docker-compose exec app php artisan make:controller MyController
    Notes:
  • docker-compose execは、
  • を実行するために指定されたコンテナにコマンドを送信する.
  • appはdocker-composeに定義されている.ymlのサービスで、php-fpmを実行するコンテナ
  • です.
  • php artisan migrateは、コンテナで実行するコマンド
  • です.
    nginxログを表示する方法:
  • docker ps nginxサービスを見つけたcontainer id
  • docker exec-it/bin/bash nginx容器
  • に入る
  • nginxログの具体的なパスは、プロジェクトのvhostを参照してください.conf
  • 上記のコマンドを実行すると、http://127.0.0.1:8080/を通じてプロジェクトにアクセスできます.
    私のGithub gistで1組の参考書類があって学友達の参考に便利ですhttps://gist.github.com/kevin...
    gistのファイルは少し古いですが、その後、使用中に新しいPHPモジュールとNodeを追加し、前にcomposerも単独で容器に入れましたが、賢いあなたはここが必要に応じてこれらのファイルを変更していると信じています.