LAMPスタック
LAMPは、おそらく大多数のWebサイトが実行されるソフトウェアスタックです。 Linuxはスタックの基盤を表しており、従来の実装には、WebサーバーとしてのApache、MySQLデータベース、およびサーバー側のプログラミング言語としてのPHPが含まれています。ただし、考えられるバリエーションは多数あります。たとえば、MariaDBは、フォークであるMySQLの代わりに使用されることが多く、PHPの代わりにPythonまたはPerlを使用できるため、他のプログラミング言語も使用されます。この記事では、dockerとdocker-composeユーティリティを使用して基本的なLAMPスタックを実装する方法を説明します。
このチュートリアルでは、次のことを学びます。
- Ubuntu20.04にdockerとdocker-composeをインストールする方法
- docker-composeを使用してサービスとボリュームを定義する方法
- docker-compose構成ファイルでホストポートをコンテナポートにマップする方法
- バインドマウントと名前付きボリュームの使用方法
- docker-composeを使用してプロジェクトをビルドする方法

使用されるソフトウェア要件と規則
カテゴリ | 使用する要件、規則、またはソフトウェアバージョン |
---|---|
Ubuntu20.04をインストールまたはUbuntuを20.04FocalFossaにアップグレード | |
docker、docker-compose | |
Dockerコンテナを構築してDockerサービスを起動するためのルート権限 | |
# –指定されたLinuxコマンドは、rootユーザーとして直接、または sudo を使用して、root権限で実行する必要があります。 コマンド$ –特定のLinuxコマンドを通常の非特権ユーザーとして実行する必要があります |
-
パッケージのインストールとDockerサービスの開始
Ubuntu 20.04 Focal FossaでDockerベースのLAMPスタックを作成するには、最初に必要なソフトウェアをインストールする必要があります:
docker
それ自体、およびdocker-compose
、これは、yaml
を使用してマルチコンテナアプリケーションを簡単に整理できるユーティリティです。 構成ファイル。どちらのパッケージもUbuntuの公式リポジトリで入手できます。apt
を介してインストールできます :$ sudo apt install docker docker-compose
インストールが実行されたら、
docker
を起動する必要があります サービスを提供し、起動時に有効にします。 1つのコマンドで両方の操作を実行できます:$ systemctl enable --now docker
-
プロジェクトの設定
私たちの旅の最初のステップは、プロジェクトのルートとして使用するディレクトリを作成することです。この記事のために、これを
linuxconfig
と呼びます。 。このディレクトリ内に、別のDocumentRoot
を作成します。 、当社のWebサイトファイルをホストします。-p
を使用して、両方のディレクトリを一度に作成できますmkdir
のオプション コマンド:$ mkdir -p linuxconfig/DocumentRoot
linuxconfig
の内部 ディレクトリでは、yamlファイル内にプロジェクトのdocker-compose構成を定義します。このファイルは、デフォルトではdocker-compose.yml
と呼ばれます。 。構成ファイルで使用できる主なスタンザは3つあります。サービス 、ボリューム およびネットワーク 。各セクションは、プロジェクトの対応する側面を構成するために使用されます。このチュートリアルでは、最初の2つだけを使用します。 LAMPスタックのコンポーネントを、独自の個別のコンテナー内のサービスとして実装します。
docker-composeで作成されたコンテナーは同じネットワークのメンバーになるため、デフォルトで相互に通信できます。ネットワークでは、各コンテナは、名前と同じホスト名、またはコンテナによって実装されるサービスを定義するために使用される名前によって、他のコンテナを参照できます。
デフォルトでは、コンテナーには、構成ファイルを含むディレクトリーの名前をプレフィックスとして使用して名前が付けられます。この場合、たとえば、 php-httpdというサービスに使用されるコンテナ 、 linuxconfig_php-httpd_1という名前になります 。
-
php+httpdサービスの定義
構成ファイルで定義する最初のサービスには、 PHPが含まれます。 ApacheWebサーバーモジュールとして。 dockerhubで入手できる公式のPHPイメージの1つを使用します コンテナのベースとして、具体的には
-apache
を使用したコンテナ 接尾辞。上記の設定を提供します。構成の作成を始めましょう:version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html"
構成ファイルで最初に指定したのは
version
です 。この命令では、使用する作成ファイルの特定のバージョンを宣言します。執筆時点では、バージョン3.7
は最新で推奨されるものです。 - 作成ファイルのバージョンを宣言した後、サービスの作成を開始しました。 スタンザ;その中で、LAMPスタックを構成するサービスを定義します。最初のサービスを
php-httpd
と呼びました 。サービス名は完全に任意ですが、プロジェクトのコンテキストで意味のあるものを使用するのは常に良い習慣です。image
命令は、コンテナのベースとなるイメージを指定するために使用されます。この場合は、php:7.3-apache
。ポート
命令は、コンテナのポートを公開し、ホストポートとコンテナポートの間にマップを作成するために使用されます。このようなマップは、ポートを:
で区切ることによって定義されます。 。左側でホストポートを指定し、右側で、それがマップされるコンテナ内のポートを指定します。この場合、ポート80
をマッピングしました ホストからポート80
これは、ApacheWebサーバーで使用されるデフォルトのポートであるためです。最後に使用した命令は
volumes
:これを使用して、名前付きボリューム間のマッピングを指定できます またはパス (相対または絶対)ホストシステム上で、コンテナがマウントされるコンテナ上のパスに接続します。この設定では、
./ DocumentRoot
ディレクトリはサイトファイルをホストします:それは/ var / www / html
にマウントされます 後者はデフォルトのApacheVirtualHostで使用されるドキュメントルートであるため、コンテナ内のディレクトリ。このような設定は、バインドマウントと呼ばれます プロジェクトファイルに加えた変更はすぐにコンテナ内に反映されるため、開発中に特に役立ちます。この構成の欠点は、コンテナーとホストマシンのファイル構造の間に依存関係が確立され、Dockerを使用する主な利点の1つである移植性が低下することです。コンテナ内にマウントされるディレクトリは、
docker-compose up
のときに存在しない場合、自動的に作成されます。 コマンドが起動されます。その場合、特に指定されていない限り、rootが所有します。DocumentRoot
の内部 これで、ディレクトリにインデックスファイルを作成し、プロジェクトをビルドして、セットアップが機能していることを確認できます。$ echo "<?php phpinfo();" > DocumentRoot/index.php $ sudo docker-compose up -d
コマンドの実行後、必要なdockerイメージがdockerhubからダウンロードされ、
-d
>docker-compose
に提供したオプション 指図。プロジェクトが稼働している状態で、localhost
に移動すると ブラウザを使用すると、次のページが表示されます。
phpinfoページプロジェクトを停止するには、
docker-compose.yml
をホストしているディレクトリから ファイル、実行できます:$ sudo docker-compose stop
MariaDBサービスの定義
LAMPスタックの重要な部分はデータベースレイヤーです。この構成では、 MariaDBを使用します Dockerhubで入手できる公式のDockerイメージ:
version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" mariadb: image: mariadb:10.5.2 volumes: - mariadb-volume:/var/lib/mysql environment: TZ: "Europe/Rome" MYSQL_ALLOW_EMPTY_PASSWORD: "no" MYSQL_ROOT_PASSWORD: "rootpwd" MYSQL_USER: 'testuser' MYSQL_PASSWORD: 'testpassword' MYSQL_DATABASE: 'testdb' volumes: mariadb-volume:
サービスの内部 スタンザ、別のサービスを定義し、それを
mariadb
と呼びます そしてimage
10.5.2
を使用するように指定した命令 公式画像のバージョン。以前のサービス定義では、バインドマウントを使用しました。今回は、代わりに、適切なDocker名前付きボリュームを使用しました 、
/ var / lib / mysql
にマウントされます コンテナ内(MariaDBが使用するデフォルトのデータディレクトリです)。バインドマウントとは異なり、名前付きボリュームは、ホストファイルシステム構造に対するコンテナの依存関係を作成しません。 Dockerによって完全に管理されているため、コンテナーが破棄されたときに失われる可能性のあるデータを永続化するための推奨される方法です。名前付きボリュームは、メインの
ボリューム
で定義できます。 構成ファイルのスタンザであり、volume
から参照できます。 定義された各サービスのサブセクション。この場合、ボリュームをmariadb-volume
と呼びました。 。次のステップとして、いくつかの環境変数の値を定義しました コンテナの動作に影響を与えるために使用されます。環境変数は
environment
で定義されます サービス定義のセクション。この場合に定義した変数には、次の効果があります。変数 効果 TZ MariaDBサーバーが使用するタイムゾーンを設定します MYSQL_ALLOW_EMPTY_PASSWORD dbrootユーザーの空白のパスワードの使用を有効または無効にします MYSQL_ROOT_PASSWORD これは必須の変数であり、dbrootユーザーのパスワードを設定するために使用されます MYSQL_DATABASE オプションでイメージの起動時に作成されるデータベースの名前を指定するために使用されます MYSQL_USER オプションで、MYSQL_DATABASEで指定されたデータベースのスーパーユーザー権限で作成されるユーザーの名前を指定するために使用されます MYSQL_PASSWORD MYSQL_USERによって提供された名前で作成されたユーザーのパスワードを指定するために使用されます この時点で、PHPと連携できるWebサーバーと、データを保存するためのデータベースが必要です。
ボーナス– phpMyAdmin
これで、基本的なLAMPスタックが完成しました。ボーナスとして、 phpMyAdminを追加することもできます これに、ユーザーフレンドリーなWebインターフェイスからMariaDBデータベースを簡単に制御するために。関連するサービス定義をdocker-compose構成に追加しましょう:
version: '3.7' services: php-httpd: image: php:7.3-apache ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" mariadb: image: mariadb:10.5.2 volumes: - mariadb-volume:/var/lib/mysql environment: TZ: "Europe/Rome" MYSQL_ALLOW_EMPTY_PASSWORD: "no" MYSQL_ROOT_PASSWORD: "rootpwd" MYSQL_USER: 'testuser' MYSQL_PASSWORD: 'testpassword' MYSQL_DATABASE: 'testdb' phpmyadmin: image: phpmyadmin/phpmyadmin links: - 'mariadb:db' ports: - 8081:80 volumes: mariadb-volume:
サービスに
phpmyadmin
という名前を付けました phpmyadmin / phpmyadminを使用するように構成しました dockerhubからの画像。リンク
も使用しました 初めてのキーワード。これは何のため?すでに知っているように、デフォルトでは、特別な構成は必要ありません。同じdocker-compose構成で作成されたすべてのコンテナーは、相互に通信できます。 phpMyAdminイメージは、db
によって実行中のデータベースコンテナを参照するように構成されています 名前、したがって、mariadbサービス用に同じ名前のエイリアスを作成する必要があります。これはまさにリンク
です に使用されます:別のサービスからサービスに到達するための追加のエイリアスを定義します。サービス定義内で、ポート
8081
もマッピングしました ホストマシンのポート80
コンテナ内(ポート80はすでにphp-httpdコンテナ内の同じポートにマップされています)。したがって、phpMyAdminインターフェースは localhost:8081で到達可能になります。 住所。プロジェクトを再構築して確認しましょう:$ sudo docker-compose up -d --build
PhpMyAdminログインページデータベースサービス用に定義した資格情報を使用してログインし、
testdb
を確認できます。 データベースが作成されました:
PhpMyAdminホームページサービスにカスタムイメージを使用する
上記の例では、サービス定義で常にバニラ画像を使用していました。それらに基づいたカスタムDockerイメージを使用したい場合があります。たとえば、php-httpdサービスを構築したいが、追加のphp拡張機能を含めたいとしましょう。どうすればよいでしょうか。プロジェクトのルートで、新しいディレクトリを定義し、便宜上、サービスにちなんで名前を付けます。
$ mkdir php-httpd
このディレクトリ内に、ベースイメージを拡張するために使用されるDockerfileを、次のコンテンツで作成します。
FROM php:7.3-apache LABEL maintainer="[email protected]" RUN apt-get update && apt-get install -y libmcrypt-dev \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-enable mcrypt
docker-compose.yml
に戻ります ファイルの場合、php-httpd
の定義を変更します サービス。以前のように画像を直接参照することはできません。代わりに、カスタムDockerfileを含むディレクトリをビルドコンテキストとして指定します。version: '3.7' services: php-httpd: build: context: ./php-httpd ports: - 80:80 volumes: - "./DocumentRoot:/var/www/html" [...]
build
で セクションでは、ビルド時に適用される構成を定義します。この場合、context
を使用しました Dockerfileを含むディレクトリを参照するには:このディレクトリはビルドコンテキストとして使用され、コンテナのビルド時にそのコンテンツがDockerデーモンに送信されます。変更を適用するには、プロジェクトを再構築する必要があります。ちなみに、php dockerイメージの追加の拡張機能について詳しくは、公式ドキュメント、特にPECL拡張機能をご覧ください。 セクション。
結論
このチュートリアルでは、Dockerとdocker-composeでコンテナーテクノロジーを使用して基本的なLAMPスタックを構築する方法を説明しました。 docker-compose.yml構成ファイル内でさまざまなサービスを定義する方法、およびバインドマウント、名前付きボリューム、ホストコンテナーポートのマッピングを構成する方法を確認しました。また、カスタム画像の使用方法も確認しました。 docker-compose構成ファイル内で使用できる手順の詳細なリストについては、docker-composeリファレンスを参照してください。