GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu18.04LTSでNginxMySQLとDockerComposeを使用してLaravelをDocker化する

Laravelは、MVC(Model-View-Controller)デザインパターンを実装する無料のオープンソースPHPフレームワークです。使いやすさを考慮して設計されており、開発者は簡単なアプリケーションと複雑なアプリケーションの両方を短時間で作成できます。 Laravelは、CodeIgniter(CI)フレームワークの高度な代替手段を提供する試みとして、2011年にTaylorOtwellによって作成されました。 2011年にLaravelはバージョン1とバージョン2をリリースし、最新バージョン5.6には、「artisan」という名前のコマンドライン(CLI)サポート、さまざまなデータベースシステムのサポート、ルートの改善など、より多くの改善された機能が付属しています。

このガイドでは、Ubuntu Server18.04でDockerComposeを使用して、PHP-FPM、MySQLデータベース、およびNginxWebサーバーでLaravelプロジェクトをDocker化する方法を紹介します。 Laravelプロジェクトの新しいDockerイメージを作成してから、App / Laravel自体、Nginx Webサーバー、MySQLデータベースなどのサービスを含むdocker-compose.ymlスクリプトを作成します。

前提条件

  • Ubuntu 18.04
  • root権限

私たちが行うこと:

  1. DockerとDockerComposeをインストールする
  2. Laravelをダウンロードして依存関係をインストールする
  3. Laravelプロジェクトのドッキング
    • Laravelアプリサービスを定義する
    • NginxHTTPサービスを定義する
    • MySQLデータベースサービスを定義する
    • Laravel用のNginx仮想ホストを作成する
    • Laravelアプリ用のDockerfileを作成する
  4. Laravelプロジェクトを構築する
  5. Laravelのインストール後
ステップ1-DockerとDockerComposeをインストールします

まず、DockerおよびDockerComposeパッケージをUbuntuシステムにインストールします。そして、公式のUbuntuリポジトリからDockerパッケージを使用します。

先に進む前に、Ubuntuシステムのリポジトリを更新する必要があります。次のコマンドを実行するだけです。

sudo apt update

次に、以下のaptコマンドを使用してDockerおよびDockerComposeパッケージをインストールします。

sudo apt install docker.io -y
sudo apt install docker-compose -y

DockerおよびDockerComposeパッケージがシステムにインストールされているはずです。次のコマンドを使用して確認してください。

docker version
docker-compose version

その結果、システムにDockerとDockerComposeのバージョンが表示されます。

次に、root以外のユーザーに対してDockerコンテナを実行するために、root以外のユーザーをdockerグループに割り当てる必要があります。

この場合、次のコマンドを実行して、「hakase」というユーザーをdockerグループに追加します。

usermod -a -G docker hakase

その後、「hakase」ユーザーシェルにログインし、docker「hello-world」コマンドを実行します。

su - hakase
docker run hello-world

これで、Dockerからの「HelloWorld」メッセージが表示され、Dockerのインストールが完了しました。

ステップ2-Laravelをダウンロードして依存関係をインストールする

このステップでは、Laravelウェブフレームワークを「hakase」ホームディレクトリにダウンロードしてから、PHPの「composer」dockerイメージを使用してLaravelの依存関係をインストールします。したがって、root以外のユーザーとしてサーバーにログインしていることを確認してください。

Laravelプロジェクトを「myapp」ディレクトリにダウンロードして移動します。

git clone https://github.com/laravel/laravel.git myapp/
cd myapp/

次に、Laravelの依存関係をインストールするには、次のdockerコマンドを実行します。

docker run --rm -v $(pwd):/app composer install

上記のコマンドを使用して、新しい一時的なDockerコンテナーを実行し、「myapp」プロジェクトディレクトリをコンテナーの「/app」ディレクトリにマウントします。 'composer' docker imageに基づくコンテナーであり、その一時コンテナー内で'composer'コマンドを使用してLaravelの依存関係をインストールしています。

Laravel依存関係のインストールが完了したら、以下のsudoコマンドを使用して、「myapp」ディレクトリの所有者を自分のユーザーに変更する必要があります。

sudo chown -R $USER:$USER ~/myapp

ステップ3-LaravelプロジェクトのDocker化

Laravelをダウンロードしてその依存関係をインストールした後、新しいdocker-compose.ymlスクリプトを作成し、Laravelプロジェクト用の新しいDockerfileを作成します。

cd myapp/
vim docker-compose.yml

-Laravelアプリサービスを定義する

まず、Laravelプロジェクト自体を定義し、Dockerfileを使用してLaravelプロジェクトのDockerイメージをビルドします。

dockercomposeスクリプトを貼り付けます。

version: '3'
services:

  #Laravel App
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hakase-labs/laravel
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - mynet

Laravelコンテナサービスの詳細:

  • Laravelコンテナサービスは「app」という名前になります。これは、「Dockerfile」で作成されるカスタムDockerイメージに基づいており、新しいイメージには「hakase-labs/laravel」という名前が付けられます。
  • 「myapp」プロジェクトディレクトリをコンテナサービス内の「/var/ www/html」にマウントします。
  • セットアップにはカスタムDockerネットワークを使用しており、ネットワークの名前は「mynet」になります。

-NginxHTTPサービスを定義する

次に、nginxコンテナサービスを定義します。

'app'コンテナサービスラインの後に次の設定を貼り付けます。

  #Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

nginxコンテナサービスの構成の詳細:

  • Dockerイメージ「nginx:alpine」に基づいて「nginx」という名前の新しいコンテナを作成します。
  • コンテナサービスはHTTPポートとHTTPSポートを開きます。
  • コンテナは3つの異なるボリュームをマウントします。 'myapp'プロジェクトディレクトリを'/var/www/html'ディレクトリに、nginx仮想ホスト構成'nginx / conf.d/'を'/etc/nginx/conf.d'ディレクトリに、マウント証明書ファイル' nginx / ssl/'をコンテナの'/etc / nginx/ssl'ディレクトリに移動します。
  • コンテナサービスは「mynet」と呼ばれる同じネットワークを使用します。

-MySQLデータベースサービスを定義する

最後に、MySQLデータベースサービスを定義します。

'nginx'コンテナサービスラインの後に次の構成を貼り付けます。

  #MySQL Service
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laraveldb
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravelpassworddb
      MYSQL_ROOT_PASSWORD: rootpasswordmysql
    volumes:
      - mysqldata:/var/lib/mysql/
    networks:
      - mynet

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  mysqldata:
    driver: local

構成を保存して閉じます。

詳細MySQLコンテナサービス:

  • MySQLコンテナサービスは、「mysql:5.7」Dockerイメージに基づいて「db」という名前になります。
  • 「db」サービスはデフォルトのMySQLポート「3306」を開きます。
  • Laravelプロジェクトは、データベース、ユーザー、および「db」サービスの環境変数に基づくパスワードを使用します。
  • MySQLの「db」サービスは「mysqldata」という名前のボリュームをマウントし、同じネットワーク「mynet」を持ちます。
  • カスタムネットワーク「mynet」を「bridge」ドライバーで定義し、「mysqldata」ボリュームは「local」ドライバーを使用します。

以下は、完成した「docker-compose.yml」構成です。

version: '3'
services:

  #Laravel App
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hakase-labs/laravel
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - mynet

  #Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

  #MySQL Service
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laraveldb
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravelpassworddb
      MYSQL_ROOT_PASSWORD: rootpasswordmysql
    volumes:
      - mysqldata:/var/lib/mysql/
    networks:
      - mynet

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  mysqldata:
    driver: local

-Laravel用のNginx仮想ホストを作成

'myapp'プロジェクトディレクトリ内に、他の2つのディレクトリ'conf.d'と'ssl'を含む'nginx'という名前の新しいディレクトリを作成します。次に、「conf.d」ディレクトリ内に新しいnginx仮想ホスト構成「laravel.conf」を作成します。

次のコマンドを実行します。

mkdir -p nginx/{conf.d,ssl}
vim nginx/conf.d/laravel.conf
server {
    listen 80;
    server_name laravel.hakase-labs.io;

    return 301 https://laravel.hakase-labs.io$request_uri;
}


server {
    listen 443 ssl http2;
    server_name laravel.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Laravel web root directory
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }

    # Nginx Pass requests to PHP-FPM
    location ~ \.php$ {
        try_files $uri =404;
        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;
    }
}

保存して閉じます。

その後、ssl証明書ファイルを「nginx /ssl/」ディレクトリにコピーします。

sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/

-LaravelアプリのDockerfileを作成します

次に、Laravelプロジェクト用の新しいDockerfileを作成します。

次のコマンドを実行します。

vim Dockerfile

以下に構成を貼り付けます。

# Set master image
FROM php:7.2-fpm-alpine

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/html/

# Set working directory
WORKDIR /var/www/html

# Install Additional dependencies
RUN apk update && apk add --no-cache \
    build-base shadow vim curl \
    php7 \
    php7-fpm \
    php7-common \
    php7-pdo \
    php7-pdo_mysql \
    php7-mysqli \
    php7-mcrypt \
    php7-mbstring \
    php7-xml \
    php7-openssl \
    php7-json \
    php7-phar \
    php7-zip \
    php7-gd \
    php7-dom \
    php7-session \
    php7-zlib

# Add and Enable PHP-PDO Extenstions
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql

# Install PHP Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Remove Cache
RUN rm -rf /var/cache/apk/*

# Add UID '1000' to www-data
RUN usermod -u 1000 www-data

# Copy existing application directory permissions
COPY --chown=www-data:www-data . /var/www/html

# Change current user to www
USER www-data

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
を起動します

構成を保存して閉じます。

これで、「myapp」Laravelプロジェクトをビルドし、定義したコンテナサービスを実行する準備が整いました。

ステップ4-NginxおよびMySQLサービスを使用してLaravelをビルドする

次のコマンドを使用して、LaravelプロジェクトのカスタムDockerイメージをビルドします。

docker-compose build

次に、次のコマンドを再度実行します。

docker-compose up -d

必要に応じてすべてのDockerイメージをダウンロードし、「docker-compose.yml」構成に基づいてコンテナーサービスを構築します。

完了したら、以下のdocker-composeコマンドを使用して確認します。

docker-compose ps

その結果、3つのコンテナサービスが稼働します。デフォルトポート「9000」PHP-FPMで実行されている「app」、サービス「nginx」はHTTPおよびHTTPSポート上にあり、MySQL「db」サービスはデフォルトポート「3306」上にあります。

その後、使用可能なすべてのDockerイメージとシステムで開いているポートを再度確認します。

docker-compose images
netstat -plntu

リストにカスタムDockerイメージ「hakase-labs/laravel」が表示され、HTTPおよびHTTPSポートは「LISTEN」状態になります。

ステップ5-Laravelのインストール後

この段階まで、LaravelプロジェクトはDockerコンテナとして稼働しています。次に、新しい「.env」ファイルを作成し、キーを生成し、Laravelコマンドライン「artisan」を使用してLaravelデータを移行します。

'.env'ファイルの例をコピーして、コンテナ内で編集します。

cp .env.example .env
docker-compose exec app vim .env

以下のようにデータベース構成を変更します。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb

保存して閉じます。

次に、Laravelアプリケーションキーを生成し、キャッシュ構成をクリアします。

docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cache

その後、次のコマンドを使用してデータベースを移行します。

docker-compose exec app php artisan migrate

エラーがないことを確認してください。

次に、Webブラウザーを開き、プロジェクトのドメイン名を入力します。

http://laravel.hakase-labs.io/

そして、安全なHTTPS接続にリダイレクトされ、以下のようなデフォルトのLaravelホームページが表示されます。

最後に、NginxWebサーバーとMySQLデータベースを使用したLaravelプロジェクトのDockerizingが正常に完了しました。


Ubuntu
  1. Ubuntu 20.04:NginxがインストールされたWordPress

  2. Ubuntu18.04LTSにNginxを使用してPhorumをインストールする方法

  3. Ubuntu11.10にPHP5とMySQLを使用してNginxをインストールする方法

  1. UbuntuでDockerとDockerComposeを使用してRubyonRails開発環境をセットアップする

  2. Ubuntu16.04でNginxとPHP-FPMを使用してWordpressをDocker化する

  3. Ubuntu18.04LTSにNginxを使用してSeafileをインストールする方法

  1. Ubuntu 14.04 LTSにPHP5(およびPHP-FPM)とMySQLサポート(LEMP)を使用してNginxをインストールする

  2. Ubuntu 16.04 LTSにNginx、MariaDB、HHVMを使用してWordpressをインストールする方法

  3. Ubuntu16.04LTSにNginxを使用してLaravel5PHPフレームワークをインストールする方法