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

RancherOSにRancherサーバーをインストールする

RancherOSにRancherサーバーをインストールする

概要RancherOSは、システムサービスを実行するためのPID 0としてシステムDockerデーモンを実行する、信じられないほど軽量なオペレーティングシステム(わずか約60 MB)です。

Ubuntu 18.04にDocker CEをインストールする

Ubuntu 18.04にDocker CEをインストールする

はじめにDockerは、コンテナーとして実行されるプログラムをデプロイできるアプリケーションです。それは人気のあるGoプログラミング言語で書かれました

Ubuntu 14.04へのDockerのインストール

Ubuntu 14.04へのDockerのインストール

別のシステムを使用していますか?Dockerは、コンテナーとして実行されるプログラムをデプロイできるアプリケーションです。それは人気のある囲碁programminで書かれました

Dockerを使用してNode.jsアプリケーションをデプロイする

Dockerを使用してNode.jsアプリケーションをデプロイする

この記事では、Dockerコンテナー内にノードアプリケーションをデプロイする方法を示します。注:このチュートリアルでは、Dockerがインストールされており、

Alpine Linux 3.9.0でDocker Swarmを作成する

Alpine Linux 3.9.0でDocker Swarmを作成する

はじめにこのガイドでは、複数のAlpine Linux 3.9.0サーバーとPortainerを使用してDockerスウォームを作成および構成する方法について説明します。ご注意ください

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

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

Harbourは、Dockerイメージを格納および配布するオープンソースのエンタープライズクラスのレジストリサーバーです。HarbourはオープンソースのDockerディストリビューションを拡張しますb

CentOS 7でKubernetesを使ってみる

CentOS 7でKubernetesを使ってみる

Kubernetesは、サーバーのクラスタ全体でコンテナ化されたアプリケーションを管理するためにGoogleが開発したオープンソースのプラットフォームです。それは10年に基づいて構築され、

Ubuntu 16.04にRancherをインストールする

Ubuntu 16.04にRancherをインストールする

別のシステムを使用していますか?はじめにRancherは、コンテナーを実行し、プライベートコンテナーサービスを構築するためのオープンソースプラットフォームです。牧場主がベース

CentOS 7にKubeadmを使用してKubernetesをデプロイする

CentOS 7にKubeadmを使用してKubernetesをデプロイする

概要この記事は、kubernetesクラスターをkubeadmですぐに稼働できるようにすることを目的としています。このガイドでは、2台のサーバーを

CoreOSへのdocker-composeのインストール

CoreOSへのdocker-composeのインストール

この記事では、CoreOSにdocker-composeをインストールする方法について説明します。CoreOSでは、/ usr /フォルダーは不変なので、標準の/ usr / local / binパスは使用できません。

CentOS 7にRancherをインストールする

CentOS 7にRancherをインストールする

別のシステムを使用していますか?はじめにRancherは、コンテナーを実行し、プライベートコンテナーサービスを構築するためのオープンソースプラットフォームです。牧場主がベース

CentOS 7へのDockerのインストール

CentOS 7へのDockerのインストール

別のシステムを使用していますか?Dockerは、仮想コンテナー内でのソフトウェアのデプロイメントを可能にするアプリケーションです。それは囲碁プログラムで書かれました

Ubuntu 14.04でのLXCコンテナの安全なデプロイと管理

Ubuntu 14.04でのLXCコンテナの安全なデプロイと管理

LXCコンテナー(Linuxコンテナー)は、単一のホスト上で複数の分離されたLinuxシステムを実行するために使用できるLinuxのオペレーティングシステム機能です。テス

Ubuntu 16.04でDockerを介してSentryをセットアップする

Ubuntu 16.04でDockerを介してSentryをセットアップする

別のシステムを使用していますか?はじめにSentryは、エラー追跡のためのオープンソースのソリューションです。Sentryは例外やその他の有用なメッセージをあちこちで追跡します

Debian 9でのDocker Swarm(CE)とのスティッキーセッション

Debian 9でのDocker Swarm(CE)とのスティッキーセッション

別のシステムを使用していますか?はじめにDocker Swarmは、個々のサーバーをコンピューターのクラスターに変えます。スケーリング、高可用性、

Dockerの使用方法:最初のDockerコンテナーの作成

Dockerの使用方法:最初のDockerコンテナーの作成

このチュートリアルでは、Dockerの基本的な使い方について説明します。Dockerがすでにインストールされていると思います。このチュートリアルの手順は、

Dockerによる負荷分散

Dockerによる負荷分散

Webアプリケーションを実行する場合、通常、マルチスレッドを使用するようにソフトウェアを変換することなく、リソースを最大限に活用したいと思いますo

CoreOSで、独自のDockerレジストリをセットアップする

CoreOSで、独自のDockerレジストリをセットアップする

私たちは皆、アプリケーションコンテナーを作成、管理、および複数のマシンに分散するプラットフォームであるDockerを知っています。Docker Inc.が提供するサービスt

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

前提条件Dockerエンジン1.8以降。最低4GBのディスク容量。4GB以上のRAM。ステップ1. DockerをインストールするSQL-Serverをインストールするには、Docker mus

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

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

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

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

最近、Appleは問題を修正するための補足アップデートであるmacOS Catalina 10.15.4をリリースしましたが、このアップデートにより、Macマシンのブリックにつながる問題がさらに発生しているようです。詳細については、この記事をお読みください

原子力が必ずしも悪ではないことを証明する5つの例

原子力が必ずしも悪ではないことを証明する5つの例

原子力は、過去の出来事のために私たちが決して尊重しないことを常に軽蔑していますが、それは必ずしも悪ではありません。詳細については、投稿をお読みください。

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

これを読んで、人工知能が小規模企業の間でどのように人気を博しているか、そして人工知能がどのように成長し、競合他社に優位に立つ可能性を高めているかを理解してください。

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

私たちのコンピューターは、ジャーナリングファイルシステムと呼ばれる組織化された方法ですべてのデータを保存します。これは、検索を押すとすぐにコンピューターがファイルを検索して表示できるようにする効率的な方法です。https://wethegeek.com/?p = 94116&preview = true

ビッグデータは人工知能をどのように変えていますか?

ビッグデータは人工知能をどのように変えていますか?

ビッグデータと人工知能は流行語ですが、それらがどのように相互に関連しているか知っていますか?さて、この記事を最後まで読んで、同じことを知ってください。

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartは、PHP、jQuery、およびHTML 5で記述された無料のオープンソースのショッピングカートプラットフォームです。シンプルで軽量、使いやすいeコマースソフトウォー

DebianでNFS共有をセットアップする

DebianでNFS共有をセットアップする

NFSはネットワークベースのファイルシステムであり、コンピューターはコンピューターネットワークを介してファイルにアクセスできます。このガイドでは、NFを介してフォルダーを公開する方法について説明します

Fedora 28にMatomo Analyticsをインストールする方法

Fedora 28にMatomo Analyticsをインストールする方法

別のシステムを使用していますか?Matomo(旧Piwik)は、Google Analyticsのオープンな代替手段であるオープンソースの分析プラットフォームです。Matomoのソースはoでホストされています

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

HTTPライブストリーミング(HLS)は、Apple Inc.によって実装された非常に堅牢なストリーミングビデオプロトコルです。HLSは、ファイアウォール、プロキシ、