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

DockerとDockerComposeを使用してNginxとMySQLでPHPアプリケーションをデプロイする方法

Dockerは、コンテナーを使用してアプリケーションを作成、デプロイ、実行できるオープンソースのコンテナー化ツールです。コンテナを使用すると、必要なすべてのパーツを含むアプリケーションをパッケージ化し、単一のパッケージとしてデプロイできます。コンテナはポータブルであり、どこにでもデプロイできます。コンテナは、開発者に簡単に共有できる統一された合理化された作業環境をもたらします。

このガイドでは、DockerとDockerComposeを使用してNginxとMySQLでPHPアプリケーションをデプロイする方法を示します。

前提条件

  • Atlantic.Netクラウドプラットフォーム上の新しいUbuntu20.04サーバー
  • サーバーで構成されているrootパスワード

ステップ1-Atlantic.Netクラウドサーバーを作成する

まず、Atlantic.Netクラウドサーバーにログインします。少なくとも4GBのRAMを搭載したオペレーティングシステムとしてUbuntu20.04を選択して、新しいサーバーを作成します。 SSH経由でクラウドサーバーに接続し、ページの上部で強調表示されているクレデンシャルを使用してログインします。

Ubuntu 20.04サーバーにログインしたら、次のコマンドを実行して、ベースシステムを最新の利用可能なパッケージで更新します。

apt-get update -y

ステップ2–DockerとDockerComposeをインストールする

まず、次のコマンドを使用して必要な依存関係をインストールします。

apt-get install apt-transport-https ca-certificates curl tree software-properties-common -y

次に、次のコマンドを使用してDockerリポジトリを追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

次に、次のコマンドを使用してDockerとDockerComposeをインストールします。

apt-get install docker-ce docker-compose -y

終了したら、次のステップに進むことができます。

ステップ3–ディレクトリ構造

このチュートリアルでは、次のディレクトリ構造を使用します。

/root/docker-project/
├── docker-compose.yml
├── nginx
│   ├── default.conf
│   └── Dockerfile
├── php
│   └── Dockerfile
└── www
    └── html
        └── index.php

ステップ4–Nginxコンテナを作成する

開始する前に、PHPアプリケーションをホストするためのNginxコンテナを作成して起動する必要があります。

まず、次のコマンドを使用してプロジェクトのディレクトリを作成します。

mkdir ~/docker-project

次に、ディレクトリをプロジェクトに変更し、docker-compose.ymlファイルを作成してNginxコンテナを起動します。

cd ~/docker-project
nano docker-compose.yml

次の行を追加します:

     nginx:   
      image: nginx:latest  
      container_name: nginx-container  
      ports:   
       - 80:80 

終了したら、ファイルを保存して閉じます。

上記のファイルは、最新のNginxイメージをダウンロードし、nginx-containerを作成して、ポート80で公開します。

次に、次のコマンドを使用してNginxコンテナを起動します。

docker-compose up -d

次のコマンドを使用して、実行中のコンテナを確認できます。

docker ps

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

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
c6641e4d5bbf   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-container

次に、Webブラウザーを開き、URL http:// your-server-ipを使用してNginxコンテナーにアクセスします。 。次の画面にNginxテストページが表示されます。

ステップ5–PHPコンテナを作成する

まず、次のコマンドを使用して、プロジェクト内に新しいディレクトリを作成します。

mkdir -p ~/docker-project/www/html

次に、index.phpファイルを作成してPHPのバージョンを確認します。

nano ~/docker-project/www/html/index.php

次の行を追加します:

     <!DOCTYPE html>  
     <head>  
      <title>Hello World!</title>
     </head>  

     <body>  
      <h1>Hello World!</h1>
      <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p>
     </body>

ファイルを保存して閉じ、プロジェクトディレクトリ内にNginxのディレクトリを作成します。

mkdir ~/docker-project/nginx

次に、PHPアプリケーションを実行するためのNginxデフォルト構成ファイルを作成します。

nano ~/docker-project/nginx/default.conf

次の行を追加します:

server {  

     listen 80 default_server;  
     root /var/www/html;  
     index index.html index.php;  

     charset utf-8;  

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

     location = /favicon.ico { access_log off; log_not_found off; }  
     location = /robots.txt { access_log off; log_not_found off; }  

     access_log off;  
     error_log /var/log/nginx/error.log error;  

     sendfile off;  

     client_max_body_size 100m;  

     location ~ .php$ {  
      fastcgi_split_path_info ^(.+.php)(/.+)$;  
      fastcgi_pass php:9000;  
      fastcgi_index index.php;  
      include fastcgi_params;  
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
      fastcgi_intercept_errors off;  
      fastcgi_buffer_size 16k;  
      fastcgi_buffers 4 16k;  
    }  

     location ~ /.ht {  
      deny all;  
     }  
    } 

ファイルを保存して閉じます。

次に、nginxディレクトリ内にDockerfileを作成します。これにより、Nginxのデフォルトの構成ファイルがNginxコンテナにコピーされます。

nano ~/docker-project/nginx/Dockerfile

次の行を追加します:

    FROM nginx:latest   
    COPY ./default.conf /etc/nginx/conf.d/default.conf 

次に、docker-compose.ymlファイルを編集します:

nano ~/docker-project/docker-compose.yml

古いコンテンツを削除し、次のコンテンツを追加します。

---
nginx:
build: ./nginx/
container_name: nginx-container
ports:
- 80:80
links:
- php
volumes:
- ./www/html/:/var/www/html/

php:
image:php:7.0-fpm
container_name:php-container
expose:
– 9000
volume:
– ./www/html /:/ var / www / html /

 

終了したら、ファイルを保存して閉じます。

上記のファイルは、新しいphp-containerを作成し、ポート9000でPHP-FPMを公開し、nginx-containerをphp-containerにリンクし、ボリュームを作成してコンテナーにマウントし、すべてのコンテンツがコンテナーのディレクトリと同期するようにします。 /var/www/html/.

次に、次のコマンドでコンテナを起動します。

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

次のコマンドを使用して、実行中のコンテナーを確認できます。

docker ps

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

CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                               NAMES
82c8baf15221   docker-project_nginx   "/docker-entrypoint.…"   23 seconds ago   Up 22 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-container
10778c6686d8   php:7.0-fpm            "docker-php-entrypoi…"   25 seconds ago   Up 23 seconds   9000/tcp                            php-container

次に、Webブラウザーを開き、URL http:// your-server-ipにアクセスします。 。 Hello Worldページが表示されます:

次に、マウントされたボリュームが機能するかどうかを確認します。これを行うには、index.phpファイルを編集します。

nano ~/docker-project/www/html/index.php

「HelloWorld!変更が適用されます」:

     <!DOCTYPE html>  
     <head>  
      <title>Hello World!</title>
     </head>  

     <body>  
      <h1>Hello World! Changes are Applied</h1>
      <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p>
     </body>

次に、Webページを更新します。変更したページが画面に表示されます:

ステップ6–データコンテナを作成する

ご覧のとおり、ディレクトリwww/htmlをnginx-containerとphp-containerの両方のコンテナにマウントしました。ただし、これは適切な方法ではありません。このセクションでは、データを保持するための個別のデータコンテナを作成し、それを他のすべてのコンテナにリンクします。

これを行うには、docker-compose.htmlファイルを編集します。

nano ~/docker-project/docker-compose.yml

次の変更を行います:

    nginx:    
      build: ./nginx/  
      container_name: nginx-container  
      ports:  
       - 80:80  
      links:  
       - php  
      volumes_from:  
       - app-data  

    php:    
      image: php:7.0-fpm  
      container_name: php-container  
      expose:  
       - 9000  
      volumes_from:  
       - app-data  

    app-data:    
      image: php:7.0-fpm  
      container_name: app-data-container  
      volumes:  
       - ./www/html/:/var/www/html/  
      command: "true"

次に、次のコマンドを使用して、すべてのコンテナを再作成して起動します。

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

次に、次のコマンドを使用して、実行中のすべてのコンテナーを確認します。

docker ps -a

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

CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                               NAMES
849315c7ffc0   docker-project_nginx   "/docker-entrypoint.…"   27 seconds ago   Up 25 seconds               0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-container
59a0d7040fd8   php:7.0-fpm            "docker-php-entrypoi…"   28 seconds ago   Up 27 seconds               9000/tcp                            php-container
fbca95944234   php:7.0-fpm            "docker-php-entrypoi…"   29 seconds ago   Exited (0) 28 seconds ago                                       app-data-container

ステップ7–MySQLコンテナを作成する

このセクションでは、MySQLデータベースコンテナを作成し、それを他のすべてのコンテナにリンクします。

まず、MySQLデータベースに接続するには、PHPイメージを変更し、MySQL用のPHP拡張機能をインストールする必要があります。

まず、次のコマンドを使用してPHPのディレクトリを作成します。

mkdir ~/docker-project/php

次に、Dockerfileを作成してPHP拡張機能をインストールします。

nano ~/docker-project/php/Dockerfile

次の行を追加します:

    FROM php:7.0-fpm  
    RUN docker-php-ext-install pdo_mysql 

ファイルを保存して閉じます。次に、docker-compose.ymlファイルを編集して、データベースとテーブルを保持するMySQLコンテナとMySQLデータコンテナを作成します。

nano ~/docker-project/docker-compose.yml

次の変更を行います:

     nginx:    
      build: ./nginx/  
      container_name: nginx-container  
      ports:  
       - 80:80  
      links:  
       - php  
      volumes_from:  
       - app-data  

     php:    
      build: ./php/  
      container_name: php-container  
      expose:  
       - 9000  
      links:  
       - mysql  
      volumes_from:  
       - app-data  

     app-data:    
      image: php:7.0-fpm  
      container_name: app-data-container  
      volumes:  
       - ./www/html/:/var/www/html/  
      command: "true"  

     mysql:    
      image: mysql:5.7  
      container_name: mysql-container  
      volumes_from:  
       - mysql-data  
      environment:  
       MYSQL_ROOT_PASSWORD: secret  
       MYSQL_DATABASE: mydb  
       MYSQL_USER: myuser  
       MYSQL_PASSWORD: password  

     mysql-data:    
      image: mysql:5.7  
      container_name: mysql-data-container  
      volumes:  
       - /var/lib/mysql  
      command: "true" 

ファイルを保存して閉じます。

次に、 index.phpを編集します ファイルを作成し、データベース接続をテストするためにいくつかの変更を加えます。

nano ~/docker-project/www/html/index.php

次の変更を行います:

     <!DOCTYPE html>  
     <head>  
      <title>Hello World!</title>
     </head>   

     <body>  
      <h1>Hello World!</h1>  
      <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p>  
      <?  
       $database ="mydb";  
       $user = "myuser";  
       $password = "password";  
       $host = "mysql";  

       $connection = new PDO("mysql:host={$host};dbname={$database};charset=utf8", $user, $password);  
       $query = $connection->query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE='BASE TABLE'");  
       $tables = $query->fetchAll(PDO::FETCH_COLUMN);  

        if (empty($tables)) {
          echo "<p>There are no tables in database \"{$database}\".</p>";
        } else {
          echo "<p>Database \"{$database}\" has the following tables:</p>";
          echo "<ul>";
            foreach ($tables as $table) {
              echo "<li>{$table}</li>";
            }
          echo "</ul>";
        }
        ?>
    </body>
</html>

ファイルを保存して閉じ、次のコマンドでコンテナを起動します。

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

次のコマンドを使用して、実行中のすべてのコンテナーを確認します。

docker ps -a

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

CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                               NAMES
d3e82747fe0d   mysql:5.7              "docker-entrypoint.s…"   39 seconds ago   Up 38 seconds               3306/tcp, 33060/tcp                 mysql-container
606320e5a7f8   mysql:5.7              "docker-entrypoint.s…"   41 seconds ago   Exited (0) 39 seconds ago                                       mysql-data-container
ca4f63797d11   docker-project_php     "docker-php-entrypoi…"   2 hours ago      Up 2 hours                  9000/tcp                            php-container
849315c7ffc0   docker-project_nginx   "/docker-entrypoint.…"   2 hours ago      Up 2 hours                  0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-container
fbca95944234   php:7.0-fpm            "docker-php-entrypoi…"   2 hours ago      Exited (0) 39 seconds ago                                       app-data-container

ステップ8–データベース接続の確認

次に、Webブラウザーを開き、 http:// your-server-ipのWebページにアクセスします。 。次の画面が表示されます。

ご覧のとおり、mydbデータベースにはテーブルがありません。

ただし、実際にはいくつかのテーブルがありますが、それらは通常のユーザーには表示されません。それらを表示したい場合は、index.phpファイルを編集して $ userを変更してください。 「ルート」へ および$password 「秘密」

nano ~/docker-project/www/html/index.php

次の行を変更します:

       $user = "root";  
       $password = "secret";  

ファイルを保存して閉じてから、ページを更新します。次の画面にすべてのテーブルを含むデータベースが表示されます。

結論

上記のガイドでは、DockerとDockerComposeを使用してNginxとMySQLでPHPアプリケーションをデプロイする方法を学習しました。これで、Dockerを使用して本番環境でPHPアプリケーションをホストできるようになります。 Atlantic.NetのVPSホスティングアカウントでお試しください。


Linux
  1. Dockerを使用してマイクロサービスをデプロイする方法

  2. LinodeにDockerを使用してnginxコンテナをデプロイする方法

  3. Ubuntu20.04にNginxとGunicornを使用してFlaskアプリケーションをデプロイする方法

  1. Dockerを使用してMongoDBをデプロイおよび管理する方法

  2. DockerとNGINXとAPIプロキシを使用してReactアプリを本番環境にデプロイする方法

  3. Ubuntuにpm2とNginxを使用してNode.jsアプリケーションをデプロイする方法

  1. CentOS8にNginxとPHP7.3でNextcloudをインストールする方法

  2. CentOS 7にPHPとMySQL(LEMPスタック)を使用してNginxをインストールする方法

  3. Ubuntu18.04LTSでNginxMySQLとDockerComposeを使用してLaravelをDocker化する