1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Eloquent×Docker】Eloquent単体を最小限のDocker環境で使う

Last updated at Posted at 2023-03-20

Eloquent単体のDocker環境を作成する手順です。
Dockerの設定は可能な限り減らしました。

Dockerは最小限の設定で構成されています。実務で使用するとエラーが発生する可能性がありますので、学習用や簡単な動作確認にのみお使いください。

動作環境

  • MacBook Air M1 2020
  • macOS Ventura 13.2.1
  • Docker Desktop 4.17.0

設定

ゴール

Eloquentを利用してデータの取得を行う

要件

  • PHPはPHP8.2、DBはMySQL8.0.32のDockerイメージを利用する
  • コンテナ起動時にデータベース作成〜テーブル作成〜テストデータ投入まで実行する
  • Eloquentのパッケージilluminate/databasecomposerでインストールする

ファイル・ディレクトリ構成

.
├── Dockerfile
├── app
│   ├── Models
│   │   └── User.php
│   ├── connection.php
│   └── main.php
├── composer.json
├── docker-compose.yml
└── mysql
    └── init
        └── init.sql

ディレクトリ作成

必要なディレクトリを作成します。

% mkdir eloquent_docker
% cd eloquent_docker
% mkdir -p app/Models
% mkdir -p mysql/init

Dockerの設定

docker-compose.yml

各コンテナの設定を記述します。
コンテナはPHP用にweb、MySQL用にdbを用意します。今回composer専用のコンテナは用意していないので、パッケージのインストールもwebコンテナ内で行います。

docker-compose.yml
version: '3'

services:
  web:
    # カレントディレクトリでイメージを構築
    build: .
    # /bin/bashでプロセスを継続させてコンテナの正常終了を防ぐ
    command: bash -c "composer install && /bin/bash"
    # カレントディレクトリをコンテナへマウント
    volumes:
      - .:/usr/src/web
    # プロセスを継続させてコンテナの正常終了を防ぐ
    stdin_open: true

  db:
    image: mysql:8.0.32
    # コンテナが停止しても自動で再起動する
    restart: always
    # ホストの13306番ポートにコンテナの3306番ポートをフォワード
    ports:
      - "13306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
    # コンテナ起動時に実行するSQL群をマウント
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d

Dockerfile

PHPイメージ構築の設定を記述します。
composerのインストール設定は公式サイトからそのまま引用しました。

FROM php:8.2-cli
# パッケージリスト更新後にDockerイメージの構築に必要なパッケージをインストール
RUN apt-get update && apt-get install -y git zip unzip
# PDOを使用するための拡張モジュールをインストール
RUN docker-php-ext-install pdo_mysql
# composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY . /usr/src/web
WORKDIR /usr/src/web

composer.jsonの設定

Eloquentを利用するため、illuminate/databaseのrequireとアプリケーション用の名前空間Appを設定します。

composer.json
{
    "require": {
        "illuminate/database": "^10.4"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

コンテナ起動時に実行されるSQL群を設定

コンテナ起動時に実行されるSQLを記述します。
データベースeloquent_testとテーブルusersを作成し、テストデータを投入します。

mysql/init/init.sql
CREATE DATABASE eloquent_test;
-- 使用するデータベースを設定
USE eloquent_test;
-- テーブル作成
CREATE TABLE users
(
    id INT(10) AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30),
    email VARCHAR(50)
);
-- テストデータ投入
INSERT INTO users (name, email)
VALUES('Taro', 'taro@example.com'), ('Jiro', 'jiro@example.com'), ('Hanako', 'hanako@example.com');

DB接続の設定

DBの接続設定を記述します。
設定は公式サイトを参考にしました。

app/connection.php
use Illuminate\Database\Capsule\Manager as Capsule;

require_once 'vendor/autoload.php';

$capsule = new Capsule;

$capsule->addConnection([
    'driver' => 'mysql',              // mysqlを指定
    'host' => 'db',                   // コンテナ名
    'database' => 'eloquent_test',    // データベース名
    'username' => 'root',             // ユーザー名
    'password' => 'password',         // パスワード
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
]);

// Capsuleインスタンスをグローバル化
$capsule->setAsGlobal();

// Eloquent起動
$capsule->bootEloquent();

Model作成

Userモデルを作成します。
今回はIlluminate\Database\Eloquent\Modelのメソッドを利用するので、クラス定義のみでOKです。

app/models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

require_once 'app/connection.php';

class User extends Model
{
}

メイン処理作成

Userモデル経由でusersのデータを取得する処理を記述します。

app/main.php
use App\Models\User;

require_once 'app/connection.php';

$users = User::all();

foreach ($users as $user) {
    echo "id: {$user->id} name: {$user->name} email: {$user->email}\n";
}

コンテナの起動〜動作確認

コンテナを起動します。

% docker-compose up -d

main.phpを実行するとデータの取得が確認できます。

% docker-compose exec web php app/main.php
id: 1 name: Taro email: taro@example.com
id: 2 name: Jiro email: jiro@example.com
id: 3 name: Hanako email: hanako@example.com

まとめ

EloquentはLaravel経由で利用されることがほとんどです。ですが、Eloquent単体の動作を知ることによってエラーが発生した時に原因の切り分けがしやすくなります。Laravelのありがたみも分かります。

また、Docker環境を最小限の設定にすることにより、個々の設定の理解も深まると思います。

参考になれば幸いです。

参考記事

採用PR

弊社で一緒に働く仲間を募集しています。

Devトークやってます。お気軽にご応募ください(^^)

募集要項はこちらをご覧ください!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?