入社して初めてのプロジェクトで docker-compose.yml を使い、Laravel の開発環境を構築してみた (3 / 3)

HBSS 所属の Awano です。前回のブログの続きとなります。

最終回は、 docker-compose.yml によるデータベースの設定方法、および Laravel のインストールとデータベースとの接続方法を解説したいと思います。

docker-compose.yml にデータベースの内容を追加

それでは、docker-compose.yml にデータベースの設定を追加して完成させましょう。下記が最終的なコードとなります。


version: "3"

services:
    php_docker:
        container_name: php_example
        build: ./docker/php
        volumes:
        -   ./application:/var/www/html
        ports:
        -   "3001:3001"

    nginx_docker:
        image: nginx:latest
        container_name: nginx_example
        ports:
        -   8081:81
        volumes:
        -   ./application:/var/www/html
        -   ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            -   php_docker

    db_docker:
        image: mysql:5.7
        container_name: db_example
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: sample_database
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        volumes:
        -   ./database/data:/var/lib/mysql
        -   ./database/my.cnf:/etc/mysql/conf.d/my.cnf
        -   ./database/sql:/docker-entrypoint-initdb.d
        ports:
        -   3310:3306

内容を説明していきます。


db_docker:
    image: mysql:5.7
    container_name: db_example
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sample_database

Docker イメージですが、MySQL 5.7 バージョンを使用します。
container_name はコンテナ名ですが、Laravel でのデータベース接続にて必要となりますので必ず設定しておいて下さい。

environment については、データベース名およびログインユーザーやパスワード等を設定します。ここでは特にユーザーを指定していませんが、その場合は root ユーザーとなります。
また、ログインパスワードは MYSQL_ROOT_PASSWORD で指定します。この場合は「root」がパスワードです。


volumes:
-   ./database/data:/var/lib/mysql
-   ./database/my.cnf:/etc/mysql/conf.d/my.cnf
-   ./database/sql:/docker-entrypoint-initdb.d
ports:
-   3310:3306

volumes で設定したローカル側とサーバー側の URL とファイルですが、こちらは Docker イメージの作成とコンテナの起動が完了すれば自動で生成されますので、あらかじめローカル側にてディレクトリ等を作っておく必要はありません。
Port に関してはサーバー側を 3306 にしたうえで、ローカル側で番号を自由に決められます。ただし、3306 はデフォルトで使用している事がありますので、3307 以上の数値で設定した方が良いでしょう。

これで全てのファイルの準備は完了です。docker-compose.yml があるディレクトリ内にて、ターミナルで下記コマンドを実行しビルドして下さい。


$ docker-compose build

1回目のブログで作成した Dockerfile より、PHP の設定、アプリや composer のインストール等が始まるので完了までにかなり長い時間が掛かりますが根気良く待ちます。


...

Successfully built d03ad0a8eb0b
Successfully tagged simulation_php_docker:latest

上記 Successfully … の結果が出れば OK です(「 d03ad0a8eb0b 」は任意のイメージ ID となりますので人によって異なります)。続いて下記コマンドにてコンテナを立ち上げましょう。


$ docker-compose up -d

成功すると下記結果が得られ、無事にPHP・nginx・MySQL が立ち上がった事が分かります。また、ディレクトリの構成を改めて確認してみて下さい。


Creating db_example    ... done
Creating php_example ... done
Creating nginx_example ... done

新たに application の空ディレクトリと data_base ディレクトリが生成されました。application ディレクトリ内で作成した index.html 及び index.php 等がそのままローカルサーバーのデフォルトとして表示される様になります。
試しに application ディレクトリ内にて index.html を作成し、何かしら文字を挿入したうえで、

localhost:8081

を Web ブラウザのアドレスバーに入力し表示してみましょう。index.html に入力した文字が出力されれば OK です。

Laravel のインストール

それでは最終目標である Laravel をインストールしてみましょう。まずは仮想サーバー内に入る為、docker-compose.yml があるディレクトリにて下記コマンドを実行して下さい。


$ docker-compose exec php_docker bash

php_docker の部分ですが、PHP のサービス名を指定しています。docker-compose.yml 内の「 php_docker 」が該当部分です。成功すると、サーバー内の /var/www/html ディレクトリから開始されますので、早速 composer を使って Laravel をインストールしてみましょう。


root@************:/var/www/html# composer create-project --prefer-dist laravel/laravel ./

カレントディレクトリ配下に Laravel をインストールしたいので、最後に「 ./ (ピリオドのみでも可)」を入力します。バージョンも合わせて指定したい場合は、


root@************:/var/www/html# composer create-project --prefer-dist laravel/laravel ./ "7.*"   //バージョン7の場合

と、バージョンナンバーも入力して下さい。これで Laravel のインストールは完了です。Web ブラウザにて、

localhost:8081:public/

を入力して下さい。Laravel のトップページが表示されれば無事 Laravel が動作出来ています。

Laravel でのデータベースへの接続

最後に、Laravel でデータベースを取り扱う為に、Docker で生成したデータベースへの接続設定を行います。ローカルの application ディレクトリに Laravel のファイルやディレクトリがインストールされていると思いますので、

application → config → database.php

を開いて下記 ‘mysql’ の箇所の一部を変更して下さい(ピンク文字)。


'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'db_example'),
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', 'root'),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],


container_name: db_example
environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: sample_database

username と password の項目については共に docker-compose.yml にて root を設定しているはずですので、「 root 」を入れます。

database の項目ですが、接続する為には docker-compose.yml で設定したデータベースのコンテナ名を指定する必要があります。なのでここでは、「 db_example 」を指定して下さい。

続いて、

application → .env

を編集します。.env ファイルの DB 関連の設定エリアを探し、下記の様に指定して下さい(ピンク文字)。


DB_CONNECTION=mysql
DB_HOST=db_example
DB_PORT=3306
DB_DATABASE=sample_database
DB_USERNAME=root
DB_PASSWORD=root

DB_HOST の項目ですが、IP アドレスではなく docker-compose.yml で設定したコンテナ名( db_example )を入力します。

DB_DATABASE の項目は docker-compose.yml 内の MYSQL_DATABASE が該当します。よって、ここでは「 sample_database 」を入力して下さい。

DB_USERNAME と DB_PASSWORD はそれぞれ共に「 root 」を設定して完了です。

それではデータベースに接続出来ているか確かめる為、デフォルトで存在する migration ファイルを元に migrate しましょう。


root@************:/var/www/html# php artisan migrate


Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (148.86ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (93.09ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (97.50ms)

上記の様に Migration table created successfully. となれば OK です。お疲れ様でした。

…以上、3回に分けて docker-compose による Laravel 開発環境の構築方法を説明させて頂きました。

一度方法が分かってしまえば設定は非常にスムーズとなりますが、当初はネットの情報を見ながら試行錯誤して立ち上げた記憶があります。Docker は非常に便利な仮想サーバーですが、それだけに学習コストも大きいですし、何より書き方に正解がありません。
これにより、同じ開発環境を立ち上げるにも人によってファイル・ディレクトリの構造やソースコードも大きく異なります。よって、当ブログでは基本的な書き方に解説を踏まえて、なるべく Docker 初心者の方に理解出来ればとの想いと、自分自身の理解と復習の為に書いたつもりです。

HBSS にて学んだ事を定期的にブログで公開していこうと思いますので、これからもよろしくお願い致します。