Docker-composeを使用してPHPアプリケーションをデプロイする

PHPアプリケーションは通常、Webサーバー、リレーショナルデータベースシステム、および言語インタープリター自体で構成されます。このチュートリアルでは、Dockerを使用して完全なPHPアプリケーションスタックを活用します。これは、Nginx(ウェブサーバー)、MySQL(データベースシステム)、およびPHPのコンテナーを構築してオーケストレートする詳細なチュートリアルです。

このチュートリアルでは、データベースから都市のリストを読み取り、それをWebページに表示する単純なアプリケーションを作成します。この方法で、基本的な、ただし機能するPHPアプリケーションを示します。

このガイドでは、Docker-CEがすでにインストールされており、少なくともdockerの実用的な知識があることを前提としています。そのためには、次のチュートリアルを確認してください。

作業環境の構成

実際のDockerベースのアプリケーションは通常、いくつかのコンテナで構成されます。これらを手動で管理することは、非常に厄介で面倒な作業になる可能性があります。そこで登場するのがdocker-composeです。シンプルなyaml構成ファイルを使用して、多数のコンテナーを管理するのに役立ちます。

docker-composeをインストールします。

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

この例で必要なすべてのファイルを保持するフォルダーを作成し、その中にフォルダーを作成しますcd。これからは、これが作業ディレクトリであり、すべてのコマンドはこのフォルダ内で実行され、すべてのパスはそれを基準にして参照されます。このフォルダは後でとして参照される場合がありますWORKING_DIR

mkdir ~/docker
cd ~/docker

さらに3つのフォルダを作成します。

mkdir php nginx app

phpフォルダは、我々のカスタムPHPのイメージを構築する場所、あるnginxフォルダは、当社独自のnginxのイメージのために必要なファイルを保持し、app我々は、サンプルアプリケーションのソースコードと構成を置くされる場所フォルダです。

PHPコンテナーの構成

この例では、を使用php-fpmしてNginx Webサーバーに接続します。公式のPHPベースイメージを使用します。ただし、データベースにアクセスできるように、いくつかの拡張機能をインストールして有効にする必要もあります。phpフォルダ内にという名前のファイルを作成しDockerfile、次のコンテンツをその中に入れます。

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

公式のPHPイメージのアルパインバージョンを使用していることに注意してください。Alpineは、非常に小さなフットプリントを提供することにより、コンテナーを対象とした非常に小さなディストリビューションです。また、コマンドの使用に注意してください。docker-php-ext-install公式のPHPイメージは、PHP拡張機能のインストールと構成のプロセスを容易にするためにこのコマンドを提供しています。

では、次のコードを発行して(この内でWORKING_DIR)、このDockerイメージをビルドしましょう。

docker build -t vultr-php php/

docker-compose.ymlファイル

すでに述べたように、docker-compose単純な構成ファイルを使用して多数のコンテナーを管理できます。この構成ファイルの名前は通常docker-compose.ymlです。このファイルをappフォルダ内に作成します。

touch app/docker-compose.yml

次の内容をこのファイルに入れます。

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

この構文について説明します。まず、最初の行に注意してください。

version: '2'

docker-compose.yml使用する構成ファイルのバージョンを指定します。次の行では、サービス、つまりプロビジョニングするコンテナを指定しています。

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

すべてのサービスにはservicesブロック内に特定のキーがあることに注意してください。ここで指定した名前は、後でこの特定のコンテナーを参照するために使用されます。また、php構成の中で、コンテナーの実行に使用されるイメージを定義していることにも注意してください(これは、以前に構築したイメージです)。ボリュームマッピングも定義します。

volumes:
  - ./:/app

これはdocker-compose、現在のディレクトリ(./)を/appコンテナ内のディレクトリにマップするように指示します。最後の行は、/appコンテナー内のフォルダーを作業ディレクトリとして設定します。これは、コンテナー内の今後のすべてのコマンドがデフォルトで実行されるフォルダーであることを意味します。

これで、コンテナーを調整できます。

cd ~/docker/app
docker-compose up -d

次のコマンドを実行して、PHPコンテナが実行されたことを確認できます。

docker ps

コンテナー内でコマンドを実行する方法

app引き続きフォルダー内で、コマンドを使用して、定義されたサービスコンテナー内で任意のコマンドを実行できますdocker-compose

docker-compose exec [service] [command]

[service]プレースホルダは、サービスキーを指します。私たちの場合、これはでしたphp。コンテナー内でコマンドを実行して、PHPのバージョンを確認しましょう。

docker-compose exec php php -v

次の出力が表示され��す。

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Nginxコンテナの構成

PHPコンテナと同様に、Webサーバー用のカスタムイメージを作成する必要があります。ただし、この場合は、の構成を提供するだけですvirtual host。あなたが私たちの中にいることを確認し、フォルダ内にWORKING_DIR作成しDockerfilenginxください:

cd ~/docker
touch nginx/Dockerfile

これに次の内容を入れますDockerfile

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

AlpineベースのデフォルトのNginxイメージを使用しています。このDockerファイルでは、構成ファイルをアプリケーションのセットアップにコピーするだけです。このイメージをビルドする前に、構成ファイルを作成します。

touch nginx/default.conf

次に、このコンテンツを入力します。

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

このfastcgi_pass php:9000行では、PHPコンテナーを構成ファイルのserviceブロック内の名前で参照していることに注意してくださいdocker-compose.yml。内部的にdocker-composeネットワークを作成し、定義された各サービスのホスト名としてサービス名を割り当てます。Nginxイメージをビルドできます。

docker build -t vultr-nginx nginx/

更新しています docker-compose.yml

次にapp/docker-compose.ymlファイルを更新します。

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

新しいサービスを追加しただけです。次の点を除いて、構成はほぼ同じです。

depends_on:
  - php
ports:
  - 80:80

NginxコンテナーがPHPサービスを完全に初期化する必要があるdepends_on場合、オプションでこの要件を強制します。ports構成キーは、コンテナポートにホストポートをマッピングし、ここで我々はポートをマッピング80ポートにホストで80コンテナインチ

次にindex.phpappフォルダ内にというファイルを作成し、その中に以下を入れます。

<?php phpinfo();

80ファイアウォールを介してポートにアクセスできることを確認し、次を実行します。

cd ~/docker/app
docker-compose up -d

もう一度、サービスが稼働していることを再確認します。

docker ps

ブラウザを開き、にアクセスします[vultr-instance-ip]。次のコマンドを実行して、VultrインスタンスのIPアドレスを確認できます。

hostname -I

PHP情報ページが表示されます。

MySQLコンテナーの構成

公式のMySQLイメージでは、単純な環境変数を使用してコンテナーを構成できます。これはenvironment、サービスブロック定義内のオプションで実行できます。~/docker/app/docker-compose.ymlファイルを次のように更新します。

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

これで、データベースの新しいサービスを定義しました。行に注意してくださいdbdata:/var/lib/mysql。これ/var/lib/mysqlにより、Dockerが管理する永続ボリュームにコンテナーのパスがマウントされます。これにより、コンテナーが削除された後もデータベースデータが保持されます。ファイルの最後にあるように、このボリュームはトップレベルのブロックで定義する必要があります。

新しい構成を調整する前に、サンプルのMySQLデータベースをダウンロードしましょう。MySQL公式ドキュメントに は、サンプルデータベースがいくつか用意されています。有名な世界データベースを使用します。このデータベースは、国と都市のリストを提供します。このサンプルをダウンロードするには、アプリフォルダー内で以下を実行します。

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

次に、コンテナーを調整します。

docker-compose up -d

すでにお気づきかもしれませんが、docker-compose upコマンドはまだ開始されていないコンテナーのみを開始します。docker-compose.ymlファイルと実行中のコンテナの現在の構成との違いを確認します。

もう一度、MySQLコンテナが起動したことを確認します。

docker ps

次に、worldデータベースにデータを入力します。

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

データベースから直接データを選択することで、データベースにデータが入力されたことを確認できます。最初に、コンテナー内のMySQLプロンプトにアクセスします。

docker-compose exec mysql mysql -uroot -proot world

MySQLプロンプトで、次を実行します。

select * from city limit 10;

都市のリストが表示されます。MySQLプロンプトを終了します。

mysql> exit

アプリケーションを構築する

これで、必要なすべてのコンテナーが稼働しているので、サンプルアプリケーションに集中できます。app/index.phpファイルを次のように更新し ます。

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

[vultr-instance-ip]Webブラウザーでアクセスすると、世界で最も人口の多い都市のリストが表示されます。おめでとうございます。Dockerを使用して完全に機能するPHPアプリケーションをデプロイしました。

結論

このチュートリアルでは、完全に機能するPHPアプリケーションを構成する方法を段階的に説明しました。PHPとNginxのカスタムイメージを作成し、コンテナーを統合するようにdocker-composeを構成しました。このセットアップは非常に基本的でシンプルですが、実際のシナリオを反映しています。

このガイドでは、ローカルでイメージを作成してタグ付けしました。より柔軟な設定のために、これらのイメージをDockerレジストリにプッシュできます。公式のdockerレジストリにプッシュするか、独自のdockerレジストリをセットアップすることもできます。いずれの場合でも、これにより、1つのホストでイメージを構築し、別のホストでそれらを使用できます。

の詳細な使用方法docker-composeについては、公式ドキュメントを参照してください。

アプリケーションの要件と使用するPHPフレームワークによっては、拡張機能を追加したい場合があります。これはDockerfile、カスタムPHPイメージのビルドに使用されるを変更することで簡単に実行できます。ただし、一部の拡張機能は、コンテナにインストールするために追加の依存関係を必要とします。PHP公式ドキュメントの拡張機能のリストを参照して 、各拡張機能の基本的な要件を確認してください。



Leave a Comment

CentOS 7にApacheをインストールする方法

CentOS 7にApacheをインストールする方法

CentOS 7サーバーにApache 2.4をインストールする方法を説明します。安定したウェブサーバーを構築するための前提条件と手順を解説します。

FreeBSD 11.1にBlacklistdをインストールする方法

FreeBSD 11.1にBlacklistdをインストールする方法

FreeBSD 11.1におけるBlacklistdのインストール方法について詳しく解説します。この方法を通じて、強力なセキュリティ対策を実装できます。

Windows Serverのサーバーマネージャーを使用した複数サーバーの管理

Windows Serverのサーバーマネージャーを使用した複数サーバーの管理

サーバーマネージャーを使用して、Windows Serverの管理が向上します。セキュリティリスクを軽減し、効率的な管理を実現します。

CentOS 7にSeafileサーバーをインストールする方法

CentOS 7にSeafileサーバーをインストールする方法

CentOS 7にSeafileサーバーをインストールする方法。Seafile(コミュニティバージョン)は、ownCloudに似た無料のオープンソースファイル同期および共有ソリューションです。

DebianでSnortを設定する方法

DebianでSnortを設定する方法

Snortは無料のネットワーク侵入検知システムです。最新の方法で、SnortをDebianにインストールし、設定する手順を紹介します。ネットワークのセキュリティを強化しましょう。

CentOS 7にGraylogサーバーをインストールする方法

CentOS 7にGraylogサーバーをインストールする方法

CentOS 7にGraylogサーバーをインストールし、ログ管理を行う方法を学びます。

WindowsでhMailServerを使用してメールサーバーを構築する

WindowsでhMailServerを使用してメールサーバーを構築する

WindowsサーバーでWebサイトを実行している場合、電子メールも受信できるようにするためにhMailServerを使用する方法を解説します。

Ubuntu 19.04にFiveMサーバーをインストールする方法

Ubuntu 19.04にFiveMサーバーをインストールする方法

FiveMサーバーをUbuntu 19.04にインストールするための詳細なガイド。必要条件からインストール、起動、トラブルシューティングまで、すべてのステップを含みます。

WsgiDAVを使用してDebian 10にWebDAVをデプロイする

WsgiDAVを使用してDebian 10にWebDAVをデプロイする

Debian 10にWebDAVをデプロイする方法を学び、WsgiDAVとSSL証明書で安全な接続を実現しましょう。

ヘルスケア2021における人工知能の影響

ヘルスケア2021における人工知能の影響

ヘルスケアにおけるAIは、過去数十年から大きな飛躍を遂げました。したがって、ヘルスケアにおけるAIの未来は、日々成長を続けています。