Dockerは、アプリケーションの開発、出荷、実行を支える人気のオープンソースプラットフォームです。アプリケーションとその依存関係をコンテナにカプセル化することで、異なる環境間でも一貫性が確保できます。これにより、依存関係の衝突や「自分のマシンでは動いていたのに」といった開発とデプロイの間で生じる問題を回避a可能です。

Dockerでは、Dockerfileを使用して必要な依存関係や拡張機能を定義することができるため、アプリケーションに必要なすべてのライブラリとツールが、再現可能で分離された環境にあることを意味します。

Kinstaのアプリケーションホスティングでは、Dockerfileの動的なサポートにより、アプリケーションの環境をより柔軟に制御することができます。Dockerfileを使用すれば、NixpacksBuildpacksでサポートされていない言語も使用することができます。

今回は、PHPの依存関係と拡張機能をDockerにインストールして使用する方法を取り上げます。

依存関係のインストールにDockerを使用する利点

Dockerを使って依存関係をインストールすることには、以下のような利点があります。

  • 環境の一貫性─アプリケーションと依存関係、構成をコンテナにパッケージ化することができる。これにより、開発環境、テスト環境、本番環境などの異なる構成やシステム間で、アプリケーションを実行する環境の一貫性が保たれる。
  • セットアップと依存関係の解決が簡単─必要な依存関係と構成をすべて定義することで、アプリケーションの環境を対応するマシン上でもセットアップ可能。互換性の問題や依存関係を手動でインストールする手間を省くことができる。
  • バージョン管理と分離─特定のバージョンを含むすべての依存関係をコンテナ内にカプセル化することで、アプリケーションとその依存関係をバージョン管理できる。再現性を促進し、異なる依存関係のバージョン間の競合を排除。

さらに、Dockerコンテナは隔離を提供し、同じシステム上で実行されているアプリケーションの依存関係間の競合も防ぐことができます。

Kinstaでアプリケーションをセットアップする

Kinstaでのアプリケーションのセットアップはとても簡単です。MyKinstaにアクセスし、アカウントを作成するだけで、高性能ホスティングコントロールパネル、およびパフォーマンスおよびセキュリティに配慮した機能一式を使い始めることができます。

PHY、Python、Node.js、Rubyなどの幅広いプログラミング言語に対応しているため、多様なアプリケーションとの互換性が保証され、プロジェクトの要件に適した言語を選択することができます。

PHPを使った動的なアプリケーション、Node.jsを使ったRESTful API、Pythonを使ったデータ駆動型のウェブアプリケーションなど、あらゆるアプリケーションに最適化されたホスティング環境で、高いパフォーマンスと信頼性、そして一流のサポートを提供しています。

KinstaのプラットフォームでDockerfileを使ったアプリケーションのデプロイメントを体験するには、これからご紹介するアプリケーションを使ってみてください。入力検証用のrespect/validationやパスワードをハッシュ化するためのircmaxell/password-compatなど、いくつかの composerパッケージも使用します。

Docker環境を準備する

Dockerfileは、必要なイメージを構築するためにコマンドを適切な順に並べたテキストファイルです。PHPアプリケーション用のベーシックなDockerfileは以下のようになります。

FROM php:8.3-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./your-script.php" ]

このDockerfileは、PHPスクリプトをコマンドラインインターフェース(CLI)から実行するためのコンテナ環境を作成します。公式のPHPイメージをバリアントで使用し、PHPランタイムのみがコンテナに含まれます。

次に、Dockerfileを含むローカルディレクトリの内容をコンテナ内の/usr/src/myappディレクトリにコピーします。作業ディレクトリを/usr/src/myappに設定した後、phpコマンドを使用して、実行するPHPスクリプトyour-script.phpを指定します。

イメージには、コンパイル済みのPHP拡張機能が多数含まれるため、まずはphp -mコマンドを実行して、必要な拡張機能がインストールされているかどうかを確認します。

必要な拡張が見当たらない場合は、以下のヘルパースクリプトを用いて簡単にインストール可能です。

  • docker-php-ext-configure
  • docker-php-ext-install
  • docker-php-ext-enable

例えば、今回のデモアプリケーションでは、mysqli拡張を使ってMariaDBデータベースとやり取りします。この拡張はデフォルトではイメージにコンパイルされていないため、以下のコマンドを使ってDockerfileにインストールします。

RUN docker-php-ext-install mysqli

アプリケーション用のDockerfileを作成するため、プロジェクトのルートフォルダに「Dockerfile」という名前でファイルを作り、以下のコードを貼り付けます。

FROM php:8.3-apache

# MySQLクライアント、サーバー、その他の依存関係をインストール
RUN apt-get update && \
	apt-get install -y \
	default-mysql-client \
	default-mysql-server \
	git \
	&& apt-get clean \
	&& rm -rf /var/lib/apt/lists/*

# MySQLをサポートするmysqli PHP拡張機能をインストール
RUN docker-php-ext-install mysqli

上のコードは、コンテナのベースイメージとして、Apacheがインストールされた公式のPHPイメージ(バージョン8.3)を使用し、Apacheをコンテナのベースイメージとしてインストールします。このイメージが、ウェブサーバーにApatchを使用するPHPアプリケーションを実行するための環境を提供します。

それから、MariaDBデータベースを作成し操作するdefault-mysql-clientdefault-mysql-serverなど、デモアプリケーションが必要とする依存関係をインストールします。

また、docker-php-ext-installを使用してmysqliPHP拡張をインストールし、デモアプリケーションが接続を確立して、MariaDBデータベース上で操作を実行できるようにします。

Dockerで依存関係を管理する

DockerでPHPの依存関係を管理するには、PHP用の一般的な依存関係マネージャーであるComposerを使用します。ComposerをDockerコンテナにインストールすることで、PHPの依存関係のインストール、更新、管理のプロセスを効率化することができます。

アプリケーションの依存関係の管理にComposerを使用する手順は以下のとおりです。以下のコードはすべてDockerfileに追加してください。

  1. 以下のコマンドで、ComposerをDockerイメージにインストール。
    # Composerをインストール
    COPY --from=composer/composer:latest-bin /composer /usr/bin/composer

    このコマンドにより、Docker Hubリポジトリからビルド済みのComposerバイナリファイルをイメージにコピーします。--from=composer/composer:latest-binは、ファイルをコピーするソースイメージを指定します。

    ソースイメージの/composerパスにはコピーするファイルが含まれます。Dockerイメージの/usr/bin/composerパスが、これらファイルのコピー先になります。

  2. 以下を実行して作業ディレクトリを設定する。
    # 作業ディレクトリを設定
    WORKDIR /var/www/html
  3. composer.jsoncomposer.lockをイメージにコピーする。
    # composer.jsonとcomposer.lockをコピー
    COPY composer.json composer.lock ./
  4. composer.jsonに記載されているComposerの依存関係をインストールする。
    # Composerの依存関係をインストール
    RUN composer install --no-dev --optimize-autoloader

    --no-devは開発固有の依存関係のスキップ、--optimize-autoloaderはパフォーマンス向上のためのオートローダーの最適化を指示します。

必要に応じてcomposer.jsonファイルを修正し、依存関係を追加したり、バージョン制約を更新したり、不要になった依存関係を削除したりすることで、随時依存関係を更新・管理できます。

必要な変更を行った後は、composer installまたはcomposer updateをDockerコンテナ内で実行し、依存関係をインストールまたは更新します。

本稼働前の設定を適用する

アプリケーションをDockerで動作させる前に、データベースとデータベースユーザーを作成し、環境変数を設定して、プロジェクトファイルをDockerイメージにコピーしなければなりません。

以下の手順で、各コードをDockerfileに貼り付けてください。

  1. PHPアプリケーションがMariaDBデータベースに接続するための環境変数を設定(DB_USERDB_PASSWORDDB_NAMEは任意の認証情報で置き換える)。
    # 環境変数を設定
    ENV DB_HOST=localhost \
    	DB_USER=kinsta_user \
    	DB_PASSWORD=your_password_here \
    	DB_NAME=kinsta_docker_auth \
    	# MariaDBサーバーへの接続に使用するUnixソケットファイルへのパス
    	DB_SOCKET=/var/run/mysqld/mysqld.sock
  2. PHPアプリケーションファイルをDockerイメージにコピーする。
    # PHPアプリケーションファイルをイメージにコピー
    COPY . .
  3. 起動スクリプトをイメージにコピーする。
    # スタートアップスクリプトをコピー
    COPY scripts/start.sh /usr/local/bin/start.sh

    このスクリプトはコンテナの起動時に実行され、データベース、テーブル、ユーザーの作成、データベースサーバーおよびApacheサーバーの起動を行います(このスクリプトは後ほど作成)。

  4. chmodコマンドを使用してスクリプトを実行可能にする。
    # スクリプトを実行可能にする
    RUN chmod +x /usr/local/bin/start.sh
  5. 以下のコマンドを使ってスクリプトを実行する。
    # スタートアップスクリプトを実行
    CMD ["/usr/local/bin/start.sh"]

Dockerファイルが完成したら、スタートアップスクリプトを作成していきます。

プロジェクトのルートフォルダに「scripts/start.sh」というファイルを作成し、以下のコードを貼り付けます。Dockerfileで定義したデータベース認証情報を使用してください。

#!/bin/bash

# MariaDBサーバーを起動
service mariadb start

# MariaDBが完全に初期化されるのを待つ(最大30回再試行し、各試行の間は1秒待つ)
attempt=0
while [ $attempt -lt 30 ]; do
		if mysqladmin ping &>/dev/null; then
    		echo "MariaDB is up and running."
    		break
		else
    		echo "MariaDB is not yet available. Retrying..."
    		attempt=$((attempt+1))
    		sleep 1
		Fi
done

# 指定された試行回数内にMariaDBの起動に失敗した場合は、エラーで終了
if [ $attempt -eq 30 ]; then
		echo "Error: MariaDB failed to start within the specified time."
		exit 1
fi

# データベース名、ユーザー名、パスワードを設定
dbname="kinsta_docker_auth"
dbuser="kinsta_user"
dbpassword="your_password_here"

# データベースが存在しない場合は作成
mysql -u root -e "CREATE DATABASE IF NOT EXISTS $dbname;"

# データベースユーザーを作成し、データベースに権限を割り当てる
mysql -u root -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpassword';"
mysql -u root -e "GRANT ALL PRIVILEGES ON $dbname.* TO '$dbuser'@'localhost';"
mysql -u root -e "FLUSH PRIVILEGES;"

# usersテーブルが存在しない場合は作成
mysql -u root -e "USE $dbname; CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		username VARCHAR(20) UNIQUE NOT NULL,
		password_hash VARCHAR(255) NOT NULL
);"

# Apacheサーバーを起動
apache2ctl -D FOREGROUND

このbashスクリプトにより、まずMariaDBサーバーが起動します。サーバーが完全に初期化されると、データベース、適切な権限を持つユーザー、データベース内のテーブルが生成され、最後にApacheサーバーが起動します。

Kinstaにアプリケーションをデプロイする

アプリケーションをKinstaにデプロイする前に、Apacheサーバー用にいくつかの設定が必要です。Kinstaのアプリケーションホスティングでは、80番と443番ポートが開いていますが、アプリケーションが何らかのポートを公開している場合は、8080番ポートを使用することをお勧めします。

デフォルトでは、Apacheサーバーは80番ポートで接続をリッスンするため、8080番ポートで接続をリッスンするように設定します。以下の手順に従ってください。

  1. プロジェクトのルートフォルダに「apache-conf」という名前でフォルダを作成。
  2. このフォルダに「apache-config.conf」というファイルを作成し、以下のコードを貼り付けて、8080番ポートで接続をリッスンするように Apacheを設定。
    <VirtualHost *:8080>
    	ServerAdmin webmaster@localhost
    	DocumentRoot /var/www/html
    
    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
  3. apache-confフォルダに「apache-ports.conf」という名前のファイルを作成し、以下のコードを貼り付ける。
    # Listenディレクティブを8080番ポートでリッスンするように変更
    Listen 8080
    
    # 443番ポートの既存の設定を維持
    <IfModule ssl_module>
    	Listen 443
    </IfModule>
    
    <IfModule mod_gnutls.c>
    	Listen 443
    </IfModule>

    Listen 8080ディレクティブが、8080番ポートで着信接続をリッスンするようにApacheに指示します。

  4. この設定をApacheサーバーに適用するために、Dockerfileを編集する。Dockerfileで作業ディレクトリを設定するコマンド(WORKDIR /var/www/html)の直後に、以下のコマンドを貼り付けます。このコマンドにより、独自の設定ファイルを適切なディレクトリにコピーします。
    # Apacheバーチャルホストを設定
    COPY apache-conf/apache-config.conf /etc/apache2/sites-available/000-default.conf
    
    # Apacheのポートを設定
    COPY apache-conf/apache-ports.conf /etc/apache2/ports.conf
  5. プロジェクトのルートフォルダに「.dockerignore」というファイルを作成。このファイルに、Dockerイメージにコピーしないフォルダとファイルの一覧を格納します。vendorフォルダを除外するには、vendorを追加します。

すべての設定が完了したら、Kinstaにデプロイする準備ができました。任意のGitサービス(BitbucketGitHubGitLab)にプロジェクトファイルをアップロードし、以下の手順に従ってください。

  1. MyKinstaにログインし、左サイドバーの「アプリケーション」を開いて、「アプリケーションを追加」をクリック。
  2. アプリケーションの追加」画面でGitリポジトリとブランチ、アプリケーション名、データセンターの所在地を選択または入力し、「続行」で次に進む。
  3. ビルド環境」画面で「Dockerfileを使用してコンテナイメージを設定」を選択する。「Dockerfileのパス」には「Dockerfile」、「コンテキスト」には「.」を設定し、「続行」をクリック。

    The Build environment options, select the Dockerfile option and specify its file path
    Add applicationフォームのBuild environmentセクション。

  4. プロセスのセットアップ」画面は変更せず、そのまま「続行」をクリック。)アプリケーションを再起動または再デプロイすると、データベースのデータは失われます。これに問題がある場合は、永続ストレージを利用してこの画面で適用してください。
  5. 最終確認」画面で支払い情報を確認した上で、「今すぐデプロイする」をクリック。
  6. デプロイの完了後、アプリケーションのドメインにアクセスして本番サイトを確認する。
    本番サイトのログインページ
    本番サイトのログインページ

    アカウントを登録してログインしたら、ページが保護されていること、そしてすべてが正常に動作することを確認してください。

    ログイン後のアプリケーションのトップページ
    ログイン後のアプリケーションのトップページ

アプリケーションの監視と最適化

アプリケーションをKinstaで本稼働した後は、パフォーマンスを監視して最適化することが重要です。アプリケーションをスムーズに動かして、リソースを効率的に使用しましょう。

アプリケーションのパフォーマンスを最適化することで、高速で応答性の高いユーザー体験を実現することができます。

Kinstaでは、アプリケーションのパフォーマンス最適化を常に重視しており、帯域幅、総ビルド時間、CPU使用量、メモリ消費量、ネットワークトラフィック、応答時間など、さまざまなパフォーマンス指標を追跡する包括的な監視ツールを搭載しています。MyKinstaでアプリケーションの「分析」画面を開くと、これらの情報をすべて確認することができます。

問題や予期しない動作が見られた場合は、MyKinstaの「ログ」画面を開いてください。アプリケーションのパフォーマンスと動作の概要には、エラーログとアクセスログが含まれます。

ログを分析することで、エラーメッセージ、スタックトレース、または異常な動作のパターンなど、問題のある要素に関するインサイトを確認することができます。問題の根本的な原因を特定し、適切な解決策を講じるのに有用です。

さらにDockerイメージの最適化や、アプリケーションアーキテクチャとコード最適化のベストプラクティスの実装など、Docker環境内でパフォーマンスの最適化を行うこともできます。

まとめ

Dockerの軽量でポータブルなコンテナは、基盤となるインフラストラクチャを問わず、必要な依存関係を持つアプリケーションを簡単にパッケージ化してデプロイすることができます。アプリケーションとその依存関係をコンテナ化することで、異なる環境間でも一貫性を保ち、セットアップの効率化して、より良いバージョン管理を行うことができます。

KinstaでDockerを利用すると、アプリケーションのデプロイプロセスが強化されます。Dockerfile、そしてPHPをはじめとする多数のプログラミング言語をサポートしているため、プロジェクトの互換性と柔軟性も保証されます。

KinstaのアプリケーションホスティングのインフラとDockerのコンテナ化技術を活用し、効率的なアプリケーションのデプロイ、高いスケーラビリティと信頼性を確保しましょう。

Dockerを使用した経験はありますか?Dockerに関するご質問やご意見がありましたら、以下のコメント欄でお聞かせください。

Jeremy Holcombe Kinsta

Kinstaのコンテンツ&マーケティングエディター、WordPress開発者、コンテンツライター。WordPress以外の趣味は、ビーチでのんびりすること、ゴルフ、映画。高身長が特徴。