これから実務レベルで使われる開発環境をDockerで構築していきます。
これまでにもMAMPやVagrantなどを利用した開発環境を紹介してきましたが、やはり個人間はもとより企業でのチーム開発の現場にそくした環境に慣れておくことはとても有効かと思います。 この情報は2022年6月現在のものです。
ホストコンピュータのOSやバージョンの違いに左右されることなく、本番環境と全く同じ様に動く仮想環境をチーム全体で利用できることは大変便利なことです。
特にリモートワークが重視されつつある昨今ではGitHubやSlackも同時に利用されており、場所や時間の制約が無い状況になりつつありますので、体験も兼ねてご一緒に構築してみましょう。
* 講座を進める上での前提条件としてDockerをインストール完了していることと、Dockerdesktopが起動していることが必要です。
構築するコンテナのバージョンは以下のとおりです。
・webserver apach2
・laravel v9.16.0
・PHP v8.1.6 (apachと共にインストールされます)
・mysql v8.0.29
・phpmyadmin v5.2.0
目次
PHPの環境構築とLaravelのインストール
エディタはVScodeを利用します。
新しいターミナルを開いて、手始めに作業ディレクトリを作っておきます。
今回はlaravel-deというディレクトリを作ります。
mkdir laravel-de
作成したディレクトリに移動します。
cd laravel-de
この中にPHP用のディレクトリを作成します。
mkdir -p Docker/php
Dockerコマンドにオプションをつなげてコンテナを作る方法ではなく、dockerfileとdocker Composeを使って実用に耐えうる環境を構築していきます。
phpディレクトリに移動して以下の様にDockerfileという名前でファイルを作成してください。
Dockerfile
FROM php:8.1-apache
ENV APACHE_DOCUMENT_ROOT /var/www/html/study/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
&& sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
&& a2enmod rewrite
RUN apt-get update && apt-get install -y \
libicu-dev \
zip \
unzip \
&& docker-php-ext-install -j$(nproc) intl \
&& docker-php-ext-install -j$(nproc) pdo_mysql
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
COPY . /var/www/html
ENV COMPOSER_ALLOW_SUPERUSER 1
COPY --from=composer /usr/bin/composer /usr/bin/composer
次はルートディレクトリ直下にdocker-compose.ymlファイルを作ります。
docker-compose.yml
version: '3'
services:
web:
container_name: laravel-de-web
build:
context: .
dockerfile: ./Docker/php/Dockerfile
volumes:
- .:/var/www/html:cached
ports:
- "8080:80"
2つのファイルの作成が完了しましたら、以下のコマンドを実行してコンテナを作成・実行します。
docker-compose up -d
-dオプションはバックグラウンドで実行するためのものです。
コンテナーが起動されているかを確認するには以下のコマンドを実行して下さい。
docker container ls
以下の様に表示されていれば成功です。

これでPHP の実行環境ができましたので、次はlaravelをコンテナの中にインストールします。
コンテナ内に入るには以下のコマンドを実行します。
docker container exec -it laravel-de-web bash
-itオプションの後はコンテナ名です。
コンテナ内に移動すると以下の様に表示が変わります。
root@16505c220655:/var/www/html#
この中にどの様なファイルやディレクトリがあるか確認してみましょう。
以下のコマンドを実行します。
ls
以下の様に2つのファイルとディレクトリしかないのが確認できます。
Docker docker-compose.yml
laravelのインストール
では続いてlaravelをインストールします。
laravel-de-webコンテナにログインしている状態で以下のコマンドを実行して下さい。
composer create-project --prefer-dist laravel/laravel ./study
実行が完了するとVScodeのエクスプローラー内のstudyフォルダが作成され、その中に以下の様なディレクトリ群が作成されているのが確認できます。

では実際にブラウザでアクセスしてみましょう。
docker-compose.ymlで設定したポート番号を指定して開いてみます。
URLはlocalhost:8080です。
以下の様にlaravelのスタートページが表示されたら成功です。

studyというフォルダ名でlaravelをインストールしたのはdockerfileで指定したapacheサーバーのドキュメントルートを/var/www/html/study/publicしたからです。
もしもstudyとは違う名前に変更するのでしたら、一度laravel-deコンテナとlaravel-de-webイメージを削除した後にあらためてdockerfileのドキュメントルートを変更して、コンテナを再構築する必要があります。
laravelの初期設定
初期ではさほど設定を変更する必要はありませんが、タイムゾーンと日本語を扱えるように設定しておく必要があるかと思います。
/study/config/app.phpを開いて72行目あたりにあるtimezoneの’UTC’を’Asia/Tokyo’に変更して下さい。
次に85行目あたりにあるlocalの’en’を’ja’に変更して保存で完了です。
MySQLの環境構築
webアプリを作成する上で欠かせないのがデータベースですので、laravel-deコンテナの中にMySQL環境を作ってみましょう。
Dockerディレクトリ内にmysqlディレクトリを作成します。
もしもVScodeのターミナルでlaravel-de-webコンテナ内にいる様でしたらexitコマンドで元に戻り、cd ..でカレントディレクトリをlaravel-deに戻ったのちに以下のコマンドを実行して下さい。
mkdir -p Docker/mysql
作成したmysqlディレクトリにDockerfileを作成します。
Dockerfile
FROM mysql:8.0
ADD ./Docker/mysql/conf.d/my.cnf /etc/mysql/conf.d/my.cnf
次はconf.dディレクトリを作成します。
ターミナルで以下のコマンドを実行します。
mkdir Docker/mysql/conf.d
次にconf.dディレクトリ内にmy.cnfファイルを作成します。
my.cnf
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
最後にdocker-compose.ymlファイルにデータベースサービスの情報を追記します。
docker-compose.yml
version: '3'
services:
web:
container_name: laravel-de-web
build:
context: .
dockerfile: ./Docker/php/Dockerfile
volumes:
- .:/var/www/html:cached
ports:
- "8080:80"
db:
container_name: laravel-de-mydb
build:
context: .
dockerfile: ./Docker/mysql/Dockerfile
volumes:
- ./Docker/mysql/data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "13306:3306"
db:から下の部分が追記箇所です。
ymlファイルはPython言語のようにインデント(字下げ)重要なので最初に書かれているweb:と同じ様にインデントを合わせて下さい。
VScodeのymlファイル作成の拡張機能をインストールしておくと良いでしょう。
コンテナ名はlaravel-de-mydbにしました。
MYSQL_ROOT_PASSWORDは自由に設定して下さい。
ここではrootとしていますが、共有や公開には変更必須です。
では以下のコマンドを使ってmydbコンテナを立ち上げてみましょう。
docker-compose up -d db
Dockerのダッシュボードを見ると以下の様にmydbコンテナが作成されています。

ではターミナルで確認してみましょう。
以下のコマンドでmydbコンテナに入ります。
docker container exec -it laravel-de-mydb bash
入りましたら以下のコマンドを続けてデフォルトで作られているデータベースを見てみましょう。
mysql -u root -p
途中パスワードを聞かれますので、docker-compose.ymlで設定したパスワードを入れます。
入力文字は表示されないので、そのままリターンキーを押せばmysqlと対話形式でのログインが完了します。
終了するにはquit;コマンドでログアウトできます。
show databases;
これで以下の様にターミナル内に表示されれば成功です。
phpMyAdminを使ってGUI環境を作りましょう。
上記の様にコマンドラインでの確認や操作に慣れておくことも必要ですが、できるだけ見やすい形で確認や操作ができることはとても重宝しますので、作っておきましょう。
初めにマウントポイントになるフォルダを作成しておきます。
作るフォルダ名はphpmyadminフォルダとその中にsessionsフォルダを作っておきます。
VScodeのターミナルでmysqlにログイン状態でしたらログアウトして下さい。
そしてコンテナからもexitコマンドでログアウトします。
そして以下のコマンドでフォルダを作成します。
mkdir -p phpmyadmin/sessions
フォルダが作成できたら次はdocker-compose.ymlファイルに必要な情報を追記します。
phpmyadmin:からが追記箇所になります。

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: laravel-de-myadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
- PMA_USER=root
- PMA_PASSWORD=root
ports:
- 8880:80
volumes:
- ./phpmyadmin/sessions:/sessions
25行目から36行目までが追記箇所です。
image:はphpMyAdminを取り込むためのプルリクエスト部分です。
container_name:はlaravel-de-myadminにしました。
ホストはdbです。このホスト名は15行目に表示されているサービス名になっています。
ports:は8880:80でアパッチと重ならないように変更しておきます。
次は以下のコマンドを実行します。
docker-compose up -d phpmyadmin
これで新たにphpmyadminのコンテナが追加されています。
Dockerのダッシュボードで確認してみましょう。

このように起動表示されていたら成功です。
次はブラウザで確認してみましょう。
URLをhttp://localhost:8880でアクセスしてみましょう。
以下の様な表示が出れば完了です。

ここまででDockerのコンテナ作成による開発環境は概ね完了ですが、肝心のlaravelからデータベースへの接続が完了していませんので、それを完了させてしまいましょう。
laravelからMySQL への接続
まずはVScodeに戻ってstudyフォルダの中の.envファイルを確認してみましょう。
デフォルトではこの様になっているかと思います。
よくつまずくのはDB_DATABASE=laravelの箇所です。
初めてフレームワークから接続するわけですからmysqlにはそもそもlaravelなどという名前のデータベースは作成されていません。
このまま接続しようとすれば当然エラーになります。
mysqlのコマンドラインで作成も良いですが、ここではせっかくですから先ほどのphpMyAdminを利用して空のデータベースだけでも作成しておきましょう。
* 講座の記載上で記載順のミスがありましたのでデータの恒久保存の章を先に終了してから以下に進んでください。
データベース名は自由に命名していただいて結構ですが、できるだけ作ろうと思うアプリに関連した名前で簡潔なものが良いです。

左上部の新規作成をクリックして右画面の表示のようになりましたら、左に表示されているフォームに任意のデータベース名を記述します。
ここではquestion_boxとしています。
右の欄には文字コードの設定をする場所になります。
utf8mb4_general_ciを選択して下さい。
昨今、絵文字などを活用することが増えておりますので文字化け対策に必要です。
入力が完了したら作成ボタンを押して完了です。
では元に戻って先へと進みましょう。
VScodeに戻ってエクスプローラーに表示されているstudyフォルダの中の.envファイルを書き換えます。
デフォルトの.envファイルと書き換え後の.envファイルを縦に並べて表示しておきます。


.envの書き換えが完了しましたら、セーブを忘れない様にしてターミナルよりwebコンテナに以下のコマンドでログインします。
docker container exec -it laravel-de-web bash
ログイン完了で来ましたらstudyフォルダに移動し、以下のコマンドを実行します。
laravelにはstudy/database/migrationsにデフォルトで作られているマイグレーションファイルがあり、migrations以外に4つのテーブルと各テーブル内にカラムを作成する記述がされています。
後に作成するアプリにも流用できますのでテストを兼ねてデータベースにテーブルとカラムを作成してみましょう。
以下のコマンドを実行してみましょう。
php artisan migrate
接続が完了していればphpMyaAdminをブラウザからアクセスして確認してみて下さい。
URLはhttp://localhost:8880でした。
もしもブラウザが開いた状態でしたらリロードしてみて下さい。
以下の様にquestion_boxというデータベースの中にテーブル等が作成されていたら、完了です。

今後の注意点ですが、通常のファイルへの書き込みなどはVScodeで良いです。
それはご自身がお使いのコンピュータ(ホスト)のlaravel-deフォルダがlaravel-de-webサーバーコンテナにマウント(共有)されるように設定されているからです。
ですが、WEBサーバーやMySQL サーバーを操作する場合は必ず各サーバーにログインして操作する必要があります。
特にlaravelでartisanコマンドを実行する場合はログインしていない状態でコマンドを実行しようとするとエラーになります。
同じコンピュータ内なのでイメージしづらいかと思いますが、レンタルサーバーなどの遠隔地にあるコンピュータを操作しているのだとイメージしてもらえば理解が進むかもしれません。
チームで使える環境の設定
DockerHubでイメージの共有についてはDocker公式サイトを参考に各自で作成して下さい。
この講座では筆者のリポジトリからコンテナ作成に必要なイメージをダウンロードできるコマンドを紹介しておきます。
Laravel フレームワークでのwebアプリ開発で最も基本的な内容のコンテナ作成イメージですので、適宜改変してご利用いただければと思います。
・laravelとApache(webサーバー)
docker pull chockey11117/laravel-de-web
・MySQL(データベースサーバー)
docker pull chockey11117/laravel-de-mydb
・phpMyAdmin(GUIでデータベースを操作できるwebアプリ)
docker pull chockey11117/laravel-de-myadmin
データの恒久保存
今後データベースに多くのデータが保存されていくことになりますが、Dockerではコンテナが削除されるとMySQL に保存されているデータベースとその中のデータも同時に失われてしまいます。
開発上データが頻繁に失われるのは効率が悪いのでデータが任意に削除しない限り永続的に残るように設定しましょう。
作業ディレクトリlaravel-deです。
もしもstudyディレクトリになっている様でしたら、ターミナルから’cd ..’でカレントディレクトリをルートディレクトリに変更して下さい。
/Docker/mysqlにdataディレクトリが作成されているかと思います。
無ければ作成しましょう。
git管理する上でコミットされないようにする事とdataディレクトリが失われないようにするためdataディレクトリに.gitkeepという名前で空のファイルを作成して下さい。
.gitkeepファイルを作成できましたら、次はlaravel-de(ルートディレクトリ)に.gitignoreファイルを以下の画像の様に作成・記載して下さい。

/Docker/mysql/data/*
!/Docker/mysql/data/.gitkeep
次はdocker-compose,ymlファイルにマウントポイントの設定を追記します。
以下の様に追記して下さい。
すでにvolumes:の記載があるようでしたら、そのままでOKです。

20と21行目が追記部分です。
追記が完了し保存されましたら、DockerdesktopのDashboardからlaravel-de-mydbコンテナを再起動して下さい。
これでコンテナをダウンさせても再び起動後にデータが維持されています。
恒久保存の章を完了されましたらここをクリックして続きに戻ります。
dataフォルダの中にデータがマウントされているかを以下のコマンドで確認してみて下さい。
ls ./Docker/mysql/data
記載順のミスがあり、申し訳ありません。
これでチームで使える開発環境構築編を終わりにします。
上手く環境の構築が成功したでしょうか?
もし記載に誤りがあるのを発見されましたら、コメントでも頂けると幸いです。
参考文献『PHPプロフェッショナル開発』
PHPプロフェショナル開発/PHP7対応 :伊藤翔/金城秀樹/高野福晃/永井勝一郎 著