GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu20.04でdockerを使用してdockerベースのLAMPスタックを作成する方法

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でdockerを使用してdockerベースのLAMPスタックを作成する方法

使用されるソフトウェア要件と規則

システム ソフトウェア その他 規約
ソフトウェア要件とLinuxコマンドラインの規則
カテゴリ 使用する要件、規則、またはソフトウェアバージョン
Ubuntu20.04をインストールまたはUbuntuを20.04FocalFossaにアップグレード
docker、docker-compose
Dockerコンテナを構築してDockerサービスを起動するためのルート権限
–指定されたLinuxコマンドは、rootユーザーとして直接、または sudo を使用して、root権限で実行する必要があります。 コマンド
$ –特定のLinuxコマンドを通常の非特権ユーザーとして実行する必要があります
  1. パッケージのインストールと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
    
  2. プロジェクトの設定

    私たちの旅の最初のステップは、プロジェクトのルートとして使用するディレクトリを作成することです。この記事のために、これを 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という名前になります 。

  3. 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 は最新で推奨されるものです。

  4. 作成ファイルのバージョンを宣言した後、サービスの作成を開始しました。 スタンザ;その中で、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リファレンスを参照してください。


Ubuntu
  1. Ubuntu18.04にLAMPスタックをインストールする方法

  2. Ubuntu20.04でPuppetモジュールを使用してLAMPスタックを作成する方法

  3. Ubuntu で MDADM を使用して RAID アレイを作成する方法

  1. Wireguardを使用してUbuntu20.04でVPNを作成する方法

  2. Ubuntu22.04にDockerをインストールする方法

  3. LAMPスタックを使用してUbuntu18.04にWordPressをインストールする方法

  1. Dockerを使用してUbuntuにOutlineKnowledgebaseWikiをインストールする方法

  2. UbuntuでPortainerを使用してDockerコンテナを管理する方法

  3. UbuntuでPythonBoto3を使用してVPCを作成する方法