Docker + Laravelで顧客管理を作る①【環境構築編】

Docker + Laravelで顧客管理を作る①【環境構築編】
あわせて読みたい
Docker + Laravelで顧客管理を作る①【環境構築編】 https://kuro-suke.com/prod/1459/ https://kuro-suke.com/prod/1514/ 【はじめに】 あまりLaravelについて書いてなかったので、今回は顧客管理システムをDocker+Larave...
あわせて読みたい
Docker + Laravelで顧客管理を作る②【基本設定編】 https://kuro-suke.com/prod/1459/embed/#?secret=tMRexugGGl https://kuro-suke.com/prod/1514/embed/#?secret=rQjn4grGH1 【はじめに】 前回のDocker + Laravelで顧客...
目次

はじめに

あまりLaravelについて書いてなかったので、今回は顧客管理システムをDocker+Laravelで作ってみたいと思います。

いろいろと内容が多くなる予定なので、シリーズでいくつかに分けて書いていきます。

分かりやすさを心がけますので、最後までお付き合いください。

今回は記事執筆時点で最新のLaravel9.3.8を使っていきます。

事前準備

まずはPCに以下が入っているか確認してください。

  • Composer
  • PHP
  • Node
  • NPM
  • Docker Desktop

これらはLaravel開発で使う基本セットみたいなもので、また、Laravel以外でも使うことがありますので、まだの方は各自インストールしてください。

インストール方法は僕のコーディング環境公開(Mac環境)の記事内にて、MAMPを導入してローカルの仮想サーバーを立てるで書いていますので、そちらをご参照ください。

あわせて読みたい
僕のコーディング環境公開(Mac環境) 【はじめに】 今回は僕がここしばらく使っているコーディング開発環境と、構築方法を紹介したいと思います。 いきなりですがCSSコーディングするとき、皆さんは何を使っ...

本記事は内容が多いので、Docker(Docker Desktop)のインストール方法は割愛します。

Dockerのインストール方法については、【Mac】dockerでWordPressを構築を参照してください。

あわせて読みたい
【Mac】dockerでWordPressを構築 【はじめに】 Web制作の現場では以前からDockerを使われてる方々が多くいましたが、遅ればせながら、この度私もMAMPからDockerへ移行を始めました! \Docker先生よろし...

コンテナを作る

では本記事のメインとなる、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の解説でも基本的なことは解説していますが、今回はMySQLApachephpMyAdminの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コンテナが起動しているのが確認できます。

Docker Desktop

案外簡単でしたね。

ここまででコンテナの用意はできたのでは、次は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〜を実行してください。

Laravel9.x

さあ、これで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

(省略)
Docker + Laravelで顧客管理を作る①【環境構築編】

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次