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権限
私たちが行うこと:
- DockerとDockerComposeをインストールする
- Laravelをダウンロードして依存関係をインストールする
- Laravelプロジェクトのドッキング
- Laravelアプリサービスを定義する
- NginxHTTPサービスを定義する
- MySQLデータベースサービスを定義する
- Laravel用のNginx仮想ホストを作成する
- Laravelアプリ用のDockerfileを作成する
- Laravelプロジェクトを構築する
- Laravelのインストール後
まず、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のインストールが完了しました。
このステップでは、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
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プロジェクトをビルドし、定義したコンテナサービスを実行する準備が整いました。
次のコマンドを使用して、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」状態になります。
この段階まで、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が正常に完了しました。