はじめに

Dockerを利用してチームで使える開発環境の構築 (2023年9月現在で有効です。)

これから実務レベルで使われる開発環境をDockerで構築していきます。
これまでにもMAMPやVagrantなどを利用した開発環境を紹介してきましたが、やはり個人間はもとより企業でのチーム開発の現場にそくした環境に慣れておくことはとても有効かと思います。 この情報は2022年6月現在のものです。

ホストコンピュータのOSやバージョンの違いに左右されることなく、本番環境と全く同じ様に動く仮想環境をチーム全体で利用できることは大変便利なことです。
特にリモートワークが重視されつつある昨今ではGitHubやSlackも同時に利用されており、場所や時間の制約が無い状況になりつつありますので、体験も兼ねてご一緒に構築してみましょう。

* 講座を進める上での前提条件としてDockerをインストール完了していることと、Dockerdesktopが起動していることが必要です。

構築するコンテナのバージョンは以下のとおりです。
・webserver       apach2
・laravel            v10.24.1
・PHP               v8.2.10 (apachと共にインストールされます)
・mysql             v8.1.0
・phpmyadmin  v5.2.0

目次

PHPの環境構築とLaravelのインストール

エディタはVScodeを利用します。
新しいターミナルを開いて、手始めに作業ディレクトリを作っておきます。
今回はlaravelというディレクトリを作ります。

mkdir laravel

作成したディレクトリに移動します。

cd laravel

この中にPHP用のディレクトリを作成します。

mkdir -p docker/php

Dockerコマンドにオプションをつなげてコンテナを作る方法ではなく、dockerfileとdocker Composeを使って実用に耐えうる環境を構築していきます。

phpディレクトリに移動して以下の様にdockerfileという名前でファイルを作成してください。

dockerfile

FROM php:8.2-apache

ENV APACHE_DOCUMENT_ROOT /var/www/html/laravel-site/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-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-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 ./laravel-site

実行が完了するとVScodeのエクスプローラー内のstudyフォルダが作成され、その中に以下の様なディレクトリ群が作成されているのが確認できます。

 

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

 

laravel-siteというフォルダ名でlaravelをインストールしたのはdockerfileで指定したapacheサーバーのドキュメントルートを/var/www/html/laravel-site/publicしたからです。

もしもlaravel-siteとは違う名前に変更するのでしたら、一度laravelコンテナとlaravel-webイメージを削除した後にあらためてdockerfileのドキュメントルートを変更して、コンテナを再構築する必要があります。

laravelの初期設定

初期ではさほど設定を変更する必要はありませんが、タイムゾーンと日本語を扱えるように設定しておく必要があるかと思います。

/laravel-site/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に戻ったのちに以下のコマンドを実行して下さい。

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-web
    build:
      context: .
      dockerfile: ./docker/php/dockerfile
 
    volumes:
     - .:/var/www/html:cached
    ports:
     - "8080:80"
  db:
    container_name: laravel-db
    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-dbにしました。
MYSQL_ROOT_PASSWORDは自由に設定して下さい。
ここではrootとしていますが、共有や公開には変更必須です。

では以下のコマンドを使ってmydbコンテナを立ち上げてみましょう。

docker-compose up -d db

Dockerのダッシュボードを見ると以下の様にmydbコンテナが作成されています。
* 若干古い画像を利用していますので、コンテナ名はご自身が命名したものに適宜置き換えてください。

ではターミナルで確認してみましょう。
以下のコマンドでlaravel-dbコンテナに入ります。

docker container exec -it laravel-db 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-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-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を利用して空のデータベースだけでも作成しておきましょう。

* 講座の記載上で記載順のミスがありましたのでデータの恒久保存の章を先に終了してから以下に進んでください。
sail(セール)を利用していない場合は不要です。



データベース名は自由に命名していただいて結構ですが、できるだけ作ろうと思うアプリに関連した名前で簡潔なものが良いです。

左上部の新規作成をクリックして右画面の表示のようになりましたら、左に表示されているフォームに任意のデータベース名を記述します。
ここではmy_siteとしています。


右の欄には文字コードの設定をする場所になります。
utf8mb4_general_ciを選択して下さい。
昨今、絵文字などを活用することが増えておりますので文字化け対策に必要です。

入力が完了したら作成ボタンを押して完了です。
では元に戻って先へと進みましょう。

VScodeに戻ってエクスプローラーに表示されているlaravel-siteフォルダの中の.envファイルを書き換えます。

デフォルトの.envファイルと書き換え後の.envファイルを縦に並べて表示しておきます。

DATABASE=qyetion_boxになっていますが、my_siteに書き換えてください。

.envの書き換えが完了しましたら、セーブを忘れない様にしてターミナルよりwebコンテナに以下のコマンドでログインします。

docker container exec -it laravel-web bash

ログイン完了で来ましたlaravel-siteフォルダに移動し、さらにwebコンテナに移動して以下のコマンドを実行します。
laravelにはlaravel-site/database/migrationsにデフォルトで作られているマイグレーションファイルがあり、migrations以外に4つのテーブルと各テーブル内にカラムを作成する記述がされています。
後に作成するアプリにも流用できますのでテストを兼ねてデータベースにテーブルとカラムを作成してみましょう。
以下のコマンドを実行してみましょう。

php artisan migrate

接続が完了していればphpMyaAdminをブラウザからアクセスして確認してみて下さい。
URLはhttp://localhost:8880でした。
もしもブラウザが開いた状態でしたらリロードしてみて下さい。
以下の様にquestion_boxというデータベースの中にテーブル等が作成されていたら、完了です。

今後の注意点ですが、通常のファイルへの書き込みなどはVScodeで良いです。
それはご自身がお使いのコンピュータ(ホスト)のlaravel-siteフォルダがlarave-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 に保存されているデータベースとその中のデータも同時に失われてしまいます。
* 特にsailを利用している場合は注意が必要です。 当サイトで紹介しているコンテナの作成 方法ではコンテナを削除しない限りデータは残ります。

開発上データが頻繁に失われるのは効率が悪いのでデータが任意に削除しない限り永続的に残るように設定しましょう。

作業ディレクトリlaravel-siteです。
もしもlaravelディレクトリになっている様でしたら、ターミナルから’cd ..’でカレントディレクトリをルートディレクトリに変更して下さい。

/docker/mysqlにdataディレクトリが作成されているかと思います。
無ければ作成しましょう。
git管理する上でコミットされないようにする事とdataディレクトリが失われないようにするためdataディレクトリに.gitkeepという名前で空のファイルを作成して下さい。

.gitkeepファイルを作成できましたら、次はlaravel-de(ルートディレクトリ)に.gitignoreファイルを以下の画像の様に作成・記載して下さい。

/docker/mysql/data/*
!/docker/mysql/data/.gitkeep

 

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

* ファイルやディレクトリ名でDockerのスペルが大文字になっていますが、小文字に変更してください。

20と21行目が追記部分です。

追記が完了し保存されましたら、DockerdesktopのDashboardからlaravel-dbコンテナを再起動して下さい。

これでコンテナをダウンさせても再び起動後にデータが維持されています。

恒久保存の章を完了されましたらここをクリックして続きに戻ります。


dataフォルダの中にデータがマウントされているかを以下のコマンドで確認してみて下さい。

ls ./docker/mysql/data

記載順のミスがあり、申し訳ありません。
これでチームで使える開発環境構築編を終わりにします。
上手く環境の構築が成功したでしょうか?
もし記載に誤りがあるのを発見されましたら、コメントでも頂けると幸いです。

参考文献『PHPプロフェッショナル開発』

PHPプロフェショナル開発/PHP7対応 :伊藤翔/金城秀樹/高野福晃/永井勝一郎 著



ABOUT US
チョッキー
ハーレーとアウトドアが大好きで、日本の文化・伝統をこよなく愛する 男性です。サイト作成・PHP・Java・JavaScriptのプログラミングとweb ライティングを副業に、日々楽しんでいます。 1980年代にUnix.osに興味を持ち、linuxの開発にも少しばかり関わりました。 昨今のIT世界の進化を享受して頂き、少しでも誰かの役に立てればと奮闘しています。 このサイトはワードプレス を利用し、PHP言語でカスタマイズしており、私の趣味で公開しています。 閲覧には会員登録が必要ですが、全て無料ですので安心して閲覧してくください。  座右の銘は”座って半畳、寝て一畳” 所詮人間などそんなもんでしょうというところです。年齢や性別・学歴など不問。一緒に悩み・励まし・歩む、その様な仲間が増えることを願ってます。                           
%d人のブロガーが「いいね」をつけました。