はじめに
あまりLaravelについて書いてなかったので、今回は顧客管理システムをDocker+Laravelで作ってみたいと思います。
いろいろと内容が多くなる予定なので、シリーズでいくつかに分けて書いていきます。
分かりやすさを心がけますので、最後までお付き合いください。
今回は記事執筆時点で最新のLaravel9.3.8を使っていきます。
事前準備
まずはPCに以下が入っているか確認してください。
- Composer
- PHP
- Node
- NPM
- Docker Desktop
これらはLaravel開発で使う基本セットみたいなもので、また、Laravel以外でも使うことがありますので、まだの方は各自インストールしてください。
インストール方法は僕のコーディング環境公開(Mac環境)の記事内にて、MAMPを導入してローカルの仮想サーバーを立てるで書いていますので、そちらをご参照ください。
本記事は内容が多いので、Docker(Docker Desktop)のインストール方法は割愛します。
Dockerのインストール方法については、【Mac】dockerでWordPressを構築を参照してください。
コンテナを作る
では本記事のメインとなる、Laravel用のコンテナを作成します。
今回はプロジェクトを~/docker/customer-management
に作成して、プロジェクトフォルダへ移動します。
手作業で新規フォルダを作成してもいいですが、折角なのでプログラミング(?)らしくターミナルを使っていきましょう。
# ホームディレクトリへ戻る
cd ~/
# 複数のプロジェクトをまとめる docker フォルダを作成
mkdir docker
# 今回のプロジェクトである customer-management フォルダを作成
mkdir docker/customer-management
# customer-management へ移動
cd docker/customer-management
フォルダが作成されたので、VSCodeなどでcustomer-managementフォルダを開いてみましょう。
まだフォルダを用意しただけなので、中にはファイルなどは一切存在しません。
ここから、Dockerの設定ファイルなどを用意します。
まずはターミナルに以下を打ち込んで、必要なファイルとフォルダを作成します。
# コンテナをビルド(コンテナの起動や停止などを簡単に操作)するためのファイル
touch docker-compose.yml
# オリジナルのイメージを作成
mkdir php
touch php/Dockerfile
# Virtual hostの設定ファイル
mkdir apache
touch apache/default.conf
# Laravelをインストールするフォルダ
mkdir src
ここまではコピペなのでエラーは発生しないはずです。
では次に、コマンドで作成した3つのファイルに設定を書き込んでいきましょう。(コピペOK)
docker-compose.ymlには、さくらレンタルで公開するつもりで、データベースには同じMySQL5.7を指定しています。
XServerでは2021年3月24日から、以後の新規申し込みをするとMariaDBになっているそうです。
それ以前で契約しているとMySQLになるので、契約済みの人は自分のデータベースがMySQLとMariaDBのどちらかを確認しておきましょう。
version: "3.8"
services:
database:
image: mysql:5.7
container_name: db_customer_management
restart: unless-stopped
environment:
MYSQL_DATABASE: db_mysql_customer_management # データベース名
MYSQL_ROOT_PASSWORD: root # rootパスワード(任意)
MYSQL_USER: admin # ユーザー名(任意)
MYSQL_PASSWORD: password # ユーザーのパスワード(任意)
volumes:
- ./volumes/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- ./volumes/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "5432:5432"
php-apache:
container_name: php_apache_customer_management
build:
context: ./php
ports:
- "8000:80" # localhost:8000でアクセスできる
volumes:
- ./src:/var/www/customer_management
- ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
depends_on:
- database # databaseに後に実行する
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- db
environment:
- PMA_ARBITRARY=1
- PMA_HOSTS=db_mysql_customer_management # データベース名
- PMA_USER=admin # phpMyAdminのユーザー名
- PMA_PASSWORD=password # phpMyAdminのパスワード
ports:
- "3000:80" # localhost:3000でアクセスできる
volumes:
- ./volumes/docker/phpmyadmin/sessions:/sessions
depends_on:
- php-apache # php-apacheの後に実行する
さて、ここでdocker-compose.ymlについてちょっと解説してきます。
過去記事のdocker-compose.ymlの解説でも基本的なことは解説していますが、今回はMySQL、Apache、phpMyAdminの3つのイメージを使ってコンテナを構成しています。
Laravel自体はcomposerコマンドでインストールするので、イメージには含まれません。
さて、docker-compose.ymlではパラメータの一部に:(コロン)で区切っているものがあります。
例えばphpmyadminのvolumesには./volumes/docker/phpmyadmin/sessions:/sessionsとパラメータが記述されています。
このパラメータを:(コロン)の箇所で分解すると、./volumes/docker/phpmyadmin/sessionsと/sessionsの2つに分かれます。
これは何を表しているかというと、:(コロン)から見て左のパラメータ(実際に存在するフォルダ)を、右のパラメータ(コンテナ内のパス)へマウントするという意味です。
または、ボリュームデータの永続化とも言います。
ちなみに、コンテナをビルドした際にコンテナ上でもデータが一旦は初期化されますが、ボリュームを指定することでローカルのデータがコンテナ上にコピーされます。
これにより、コンテナやイメージを誤って削除しても、本体であるローカルのデータは残るため、再度ビルドしてあげれば元に戻ります。
編集するのはローカルのファイルですが、Dockerでページが表示されるときに使われるのは、コンテナ内に格納されたファイルです。
volumesを設定しなければ、コンテナ上には表示に使われるファイルなどが存在しない(初期状態のまま)ため、実際に表示させることはできません。
そこで、ローカルにあるファイルなどをコンテナ上へマウント(PCにUSBメモリを差し込んで認識された状態に近い)することで、コンテナが残っている限りはローカルからコピーしてきたファイルがコンテナ内に用意され、実際に表示させることができるのです。
また、同じくvolumes:などのローカルのパスには先頭に./volumes/~と記述されている箇所がいくつかありますが、これはプロジェクトフォルダ直下に操作してはいけないフォルダなどが生成されるので、わざとvolumesフォルダへ格納するようにしています。
つまり、見た目と誤操作防止用です。
なお、パスと同じフォルダが存在しなければ、ビルド時に自動でフォルダが作られます。
depends_on:は指定のイメージが処理された後に実行しろという順番を指定しています。
FROM php:8.0-apache
RUN apt update \
&& apt install -y \
g++ \
libicu-dev \
libpq-dev \
libzip-dev \
zip \
zlib1g-dev \
npm \
nodejs \
vim \
&& docker-php-ext-install \
intl \
opcache \
pdo \
pdo_pgsql \
pgsql
WORKDIR /var/www/customer_management
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
※ \(バックスラッシュ)は改行した次の行を繋げる意味を持ちます。
<VirtualHost *:80>
ServerName customer_management
DocumentRoot /var/www/customer_management/public
<Directory /var/www/customer_management>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3つともコピペでいいので書き込んだら、保存して次のコマンドを実行します。
このコマンドは上で作った3つのファイルを元に、イメージの作成、コンテナの作成と立ち上げ、つまり、コンテナをビルドしてくれます。
docker-compose up -d --build
ここで問題発生。
docker-composeを実行すると、最後に以下のエラーが出ました。
Error response from daemon: driver failed programming external connectivity on endpoint db_customer_management (3dff02b1ecd708e3a5ad60b2f532c38d4ebac209f4ac3f77c242b1c6653ff163): Bind for 0.0.0.0:5432 failed: port is already allocated
英語は苦手なのでDeepLにぶち込んで要約すると、『(コンテナはビルドしたけど)ポート番号がダブってるぞ』と怒られていました。
原因は、他に立ち上げているコンテナと同じポート番号を使っていたからです。
ポート番号のダブっている他のコンテナを停止して、再度docker-composeを実行すると、エラーなく通過できました。
[+] Building 2.2s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/php:8.0-apache 2.1s
=> [auth] library/php:pull token for registry-1.docker.io 0.0s
=> [1/4] FROM docker.io/library/php:8.0-apache@sha256:5319147a86802b082ab169907feef57f17d3eda7e02c2e10f28006e0eb508d3a 0.0s
=> CACHED [2/4] RUN apt update && apt install -y g++ libicu-dev libpq-dev libzip-dev zip zlib1g-dev && docker-php-ext-install 0.0s
=> CACHED [3/4] WORKDIR /var/www/customer_management 0.0s
=> CACHED [4/4] RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:7f27a715427e761065fe5c86b043439889f06515d42f26c2e8f76b7af688a036 0.0s
=> => naming to docker.io/library/customer-management-php-apache 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 2/2
⠿ Container db_customer_management Started 0.4s
⠿ Container php_apache_customer_management Started
念のためDocker Desktopを見ると、customer-managementコンテナが起動しているのが確認できます。
案外簡単でしたね。
ここまででコンテナの用意はできたのでは、次はLaravelを実際にインストールしてみましょう。
Laravelをインストール
それではさっそくLaravelをインストールしていきます。
php-apache内でコマンドを実行する必要があるので、まずはphp-apacheコンテナでコマンドが使えるようにします。
docker-compose exec php-apache /bin/bash
# root@02e437097106:/var/www/customer_management#
CLIが開いたので、Laravelをインストールします。
# 行末のドットは、ターミナル上の現在位置をカレントディレクトリとして、中身のファイル群だけを作れという命令
# ドットを消して実行すると、srcフォルダ内にlaravelフォルダを作り、さらにその中にファイル群が作られる。
composer create-project laravel/laravel=9.3.8 .
# 最新のバージョンをインストールする場合は=9.3.8を削除する
# composer create-project laravel/laravel .
インストールが完了したら、srcフォルダにLaravelのファイル群がインストールされているのが確認できます。
※srcフォルダ直下にlaravelフォルダがあると失敗です。コマンドの行末にスペース+ドットが正しく入力されているか確認してください。
Laravelがちゃんと動くか確認するため、http://localhost:8080へアクセスしてみましょう。
もし403エラーが出たら、srcフォルダにlaravelフォルダが作られていないか確認してみてください。
default.confのパスと、実際のsrcフォルダからのパスが異なっている可能性があるので、srcフォルダ内部を一旦削除して再度composer create-project〜を実行してください。
さあ、これでDockerとLaravelの構築は完了です!
あとはいつもどおりのLaravelです。
ちなみに、artisanコマンドを使うときは、必ずdocker-compose exec php-apache /bin/bashでphp-apacheのCLIから実行してください。
それでは次回は、顧客管理を作る前に基本となるLaravelの使い方を解説していきます。
Laravelの初期設定
続けて、データベースのパラメータなどを設定していきます。
src/.envファイルを開いてください。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:M1f6GUrgEuOaQMAy1WrmqlPTZ43diUUpMAdZ0bIZF5c=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
いろいろと訳の分からない記述ですが、とりあえず以下のAPP_○○○○とDB_○○○○の2つをコピペして上書きしてください。
なお、APP_KEY=英数字の文字列=
はインストール時にランダムで生成される暗号化用のキーですので、APP_KEYの行だけは書き換えないでください!
APP_NAME=customer-management
APP_ENV=local
APP_KEYは元の記述を残してください。書き換えてはいけません!
APP_DEBUG=true
APP_URL=http://localhost:8000
(省略)
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=5432
DB_DATABASE=db_mysql_customer_management
DB_USERNAME=admin
DB_PASSWORD=password
(省略)
コメント