Dockerを利用したPHP環境構築の完全ガイド!5つのステップと7つの実践例

DockerとPHPを使ったプログラミング環境構築のイメージPHP
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

PHPを学んでいる皆さん、いつもはどのような環境でコーディングしていますか?

PHPのバージョンを切り替えたり、依存関係を管理したり、開発と本番環境を一致させたりするのは面倒だと感じていませんか?

この記事を読めば、そんな問題を解決する手段として「Docker」を活用する方法が身につきます。

●Dockerとは

Dockerとは、一言で言うと「コンテナ型の仮想環境」を提供するプラットフォームのことです。

Dockerを使うと、開発環境を手軽にコード化し、他のマシンでも再現できるようになります。

それでは、具体的にどのような考え方がDockerには含まれているのでしょうか。

○Dockerの基本的な考え方

Dockerでは、アプリケーションとそれが動作するための環境を「イメージ」という単位で一緒にパッケージ化します。

そして、そのイメージを元に「コンテナ」という独立した実行環境を作り出します。

これにより、「この環境でなら動く」というアプリケーションの環境依存を大幅に軽減することができます。

●PHPとDockerの組み合わせの利点

Dockerは、PHPの開発においても大いにその力を発揮します。

例えば、複数のPHPバージョンを切り替えてテストしたり、異なるPHPモジュールを使い分けたりする場面でDockerを用いると、それぞれの環境設定をイメージとして作成し、使い回すことができます。

これにより、各環境を簡単に再現でき、チーム開発でもメンバー間での環境差異をなくすことができます。

では、具体的にはどのようにDockerを用いてPHPの環境を構築すればよいのでしょうか。

●Dockerを用いたPHP環境構築の5つのステップ

Dockerを用いたPHP環境構築は、大きく分けて下記の5つのステップから成ります。

このステップを順に進めていくことで、Dockerを用いたPHP環境構築を完遂することができます。

○ステップ1:Dockerのインストール

まず最初に行うのがDockerのインストールです。

Windows, macOS, Linuxといった主要なOSに対応していて、公式サイトから無料でダウンロードできます。

インストール方法はOSによりますが、公式ドキュメントが詳しく解説していますので参考にしてください。

○ステップ2:Dockerfileの作成

次に行うのが、Dockerfileの作成です。Dockerfileは、Dockerイメージの設定を記述するためのファイルです。

ここにPHPのバージョンや必要なPHPモジュール、実行するコマンドなどを定義します。

ここでは、以下のようなDockerfileを作成してみましょう。

このDockerfileでは、PHP7.4をベースとして、ComposerというPHPの依存関係管理ツールをインストールする設定を行っています。

# ベースとなるDockerイメージ指定
FROM php:7.4-cli

# Composerのインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

このファイルをプロジェクトのルートディレクトリに”Dockerfile”という名前で保存します。

○ステップ3:Dockerイメージの作成

次はDockerfileからDockerイメージを作成する手順です。

ターミナル(コマンドプロンプト)を開き、Dockerfileが置かれているディレクトリに移動します。

そして次のコマンドを実行します。

docker build -t php-composer:7.4 .

このコマンドを実行すると、Dockerfileの指示に従ってDockerイメージが作成されます。

ここで -t オプションで指定している php-composer:7.4 がイメージの名前(タグ)になります。

このコマンドを実行後、問題なくイメージが作成されれば、次のコマンドでイメージの一覧を表示し、作成したイメージがあることを確認します。

docker images

○ステップ4:Dockerコンテナの起動

次は、作成したDockerイメージからDockerコンテナを起動します。

コンテナの起動は次のコマンドで行います。

docker run -it --name my-php-app php-composer:7.4 bash

このコマンドにより、作成したイメージ php-composer:7.4 を元に新しいコンテナを作成し、そのコンテナ内でbashシェルを開きます。

ここで -it オプションはインタラクティブモードでシェルを開くためのもので、--name オプションでコンテナに名前を付けています。

コンテナが正常に起動したら、次はPHPアプリケーションの実行に進みます。

○ステップ5:PHPアプリケーションの実行

Dockerコンテナ内では、ホストマシンとは別の独立した環境でPHPアプリケーションを実行できます。

コンテナ内に移動したら、まずはテストのための簡単なPHPスクリプトを作成しましょう。

次のコマンドで新しい test.php ファイルを作成します。

echo '<?php echo "Hello, Docker!\n";' > test.php

そして、作成した test.php を実行します。

php test.php

これで “Hello, Docker!” というメッセージが表示されれば、PHP環境のセットアップは成功です。

●DockerとPHPの7つの実践的応用例

ここからは、DockerとPHPを用いてより具体的な開発環境を構築するための7つの応用例をご紹介します。

○応用例1:データベースとの接続

まず最初に、PHPとデータベース(MySQLを例に)の接続を試みます。

ここでは、Docker Composeを使ってPHPコンテナとMySQLコンテラを同時に起動し、通信できるようにします。

そのために、次のような docker-compose.yml を作成します。

version: '3.8'

services:
  php:
    image: php-composer:7.4
    volumes:
      - ./src:/app

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - ./mysql-data:/var/lib/mysql

この設定ファイルでは、PHPとMySQLの2つのサービスを定義しています。

PHPサービスでは先ほど作成したイメージを使用し、ホストマシンの src ディレクトリをコンテナの /app にマウントしています。

MySQLサービスでは、MySQLのイメージを使用し、ルートユーザーのパスワードを環境変数で設定しています。

また、データの保存先として mysql-data ディレクトリを指定しています。

この設定ファイルを使えば、次のコマンドでPHPとMySQLのコンテナが同時に起動します。

docker-compose up -d

そしてPHPからMySQLに接続するために、PHPのPDO拡張を使用します。

下記のPHPスクリプトはMySQLに接続し、データベースの一覧を表示する例です。

<?php
$dsn = 'mysql:host=mysql;dbname=information_schema';
$user = 'root';
$password = 'password';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = 'SHOW DATABASES';
    foreach ($dbh->query($sql) as $row) {
        print $row['Database'] . "\n";
    }
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "\n";
    die();
}

このスクリプトを実行すると、MySQLに接続しているデータベースの一覧が表示されます。

○応用例2:マルチステージビルド

次に、Dockerのマルチステージビルドを用いて、PHPのビルドとデプロイを効率的に行います。

マルチステージビルドでは、一つのDockerfile内で複数のイメージを作成し、

それぞれのイメージで異なる作業を行うことができます。

これにより、開発環境とプロダクション環境で必要となるパッケージを分けることが可能となります。

以下に、マルチステージビルドを用いたDockerfileの例を表します。

# 開発環境
FROM php:7.4-cli AS development
WORKDIR /app
COPY . /app
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install

# プロダクション環境
FROM php:7.4-cli-alpine AS production
WORKDIR /app
COPY --from=development /app /app

このDockerfileでは、まず開発環境のイメージを作成し、その中でComposerを使ってPHPのパッケージをインストールします。

そして、プロダクション環境のイメージを作成し、開発環境でインストールしたパッケージをコピーします。

このようにすることで、開発環境には必要なパッケージをすべてインストールし、プロダクション環境には実行に必要なものだけを提供することができます。

このDockerfileを用いてイメージをビルドし、それを用いてコンテナを起動すると、プロダクション環境に適した軽量なPHP環境が手に入ります。

○応用例3:Xdebugを使ったデバッグ

次に、PHPのデバッグを助けるツール、Xdebugをインストールします。

下記のDockerfileは、PHPイメージにXdebugを追加したものです。

FROM php:7.4-cli
RUN pecl install xdebug-2.8.0 \
    && docker-php-ext-enable xdebug

このDockerfileでは、peclコマンドを用いてXdebugをインストールし、その後でPHPの拡張としてXdebugを有効にしています。

このイメージを用いてコンテナを起動すると、Xdebugが有効なPHP環境が手に入ります。

これにより、ブレークポイントを設定してステップバイステップのデバッグや、関数のコールスタックの表示などが可能となります。

○応用例4:PHP Unitでのユニットテスト

次に、ユニットテストのためのフレームワーク、PHPUnitをインストールします。

PHPUnitはComposerを使ってインストールすることができます。

まずは composer.json ファイルを作成し、PHPUnitを開発用の依存関係として追加します。

{
    "require-dev": {
        "phpunit/phpunit": "^9.5"
    }
}

次に、次のDockerfileを用いてイメージを作成します。

FROM php:7.4-cli
WORKDIR /app
COPY . /app
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install

このDockerfileでは、Composerを用いてPHPUnitをインストールしています。

このイメージを用いてコンテナを起動すると、PHPUnitが利用可能なPHP環境が手に入ります。

これにより、ユニットテストを書いてコードの品質を保つことが可能となります。

○応用例5:継続的インテグレーション(CI)

継続的インテグレーションは、コードの変更を頻繁にメインラインに統合するプラクティスを指します。

CIのプロセスは、ビルド、テスト、メインラインへのマージというステップを自動化します。

Dockerはこのプロセスを容易にするツールとなります。

たとえば、GitHub ActionsとDockerを組み合わせることで、CIパイプラインを構築できます。

PHPプロジェクトに対するシンプルなCIパイプラインの例を紹介します。

name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build Docker image
      run: docker build . --file Dockerfile --tag my-php-app

    - name: Run tests
      run: docker run my-php-app ./vendor/bin/phpunit

このGitHub Actionsのワークフローでは、masterブランチへのpushやpull requestが作成されるたびに、Dockerイメージをビルドし、そのイメージを用いてPHPUnitのテストを実行します。

これにより、新しいコードが既存の機能に影響を与えず、期待通りに動作することを確認できます。

○応用例6:継続的デリバリー(CD)

継続的デリバリーは、ソフトウェアのリリース準備を自動化するプラクティスを指します。

CIと同様、DockerはCDのプロセスを助ける重要なツールとなります。

たとえば、DockerイメージをDocker Hubにプッシュすることで、ソフトウェアを継続的に配信することができます。

GitHub Actionsを用いたCDパイプラインの例を紹介します。

name: CD

on:
  release:
    types: [ created ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Login to Docker Hub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        file: ./Dockerfile
        push: true
        tags: my-docker-hub-username/my-php-app:latest

このGitHub Actionsのワークフローでは、新しいリリースが作成されるたびに、Dockerイメージをビルドし、そのイメージをDocker Hubにプッシュします。

これにより、新しいリリースが常に配信可能な状態であることを保証します。

○応用例7:マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャは、大規模なアプリケーションを独立した小さなサービスに分割するアーキテクチャスタイルを指します。

各マイクロサービスは個別にデプロイとスケーリングが可能で、異なる技術スタックを用いることができます。

Dockerは、マイクロサービスの管理とデプロイを容易にします。

たとえば、Docker Composeを使って複数のコンテナを管理することができます。

PHPアプリケーションとMySQLデータベースからなるマイクロサービスアーキテクチャのDocker Composeファイルの例を紹介します。

version: '3'
services:
  web:
    image: my-php-app:latest
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_app
      MYSQL_USER: my_app
      MYSQL_PASSWORD: secret

このDocker Composeファイルでは、2つのサービス、すなわちPHPアプリケーションをホストするwebサービスとMySQLデータベースをホストするdbサービスを定義しています。

webサービスはdbサービスに依存しているため、Docker Composeはdbサービスが完全に起動した後でwebサービスを起動します。

このように、DockerとDocker Composeを使うことで、マイクロサービスアーキテクチャの管理とデプロイが大幅に簡略化されます。

一度Docker Composeファイルを作成すれば、docker-compose upコマンド一つで全てのサービスを起動し、docker-compose downコマンド一つで全てのサービスを停止することができます。

これは、マイクロサービスアーキテクチャを効率的に運用する上で非常に便利です。

まとめ

Dockerは、PHPの開発環境構築を助けるための強力なツールです。

この記事では、基本的な使用方法から、CI/CDパイプライン構築やマイクロサービスアーキテクチャの運用まで、多くの応用例を通じてその使い方を解説しました。

これらの知識を基に、PHPの開発環境構築をより簡易かつ効率的に行えるようになることでしょう。

また、Dockerの使い方を習得することは、今後のソフトウェア開発の現場において非常に役立つスキルとなります。

以上が、「Dockerを利用したPHP環境構築の完全ガイド: 5つのステップと7つの実践例」の内容となります。

このガイドが、PHPの開発環境構築にDockerを導入する際の参考になれば幸いです。