docker で php+nginx+swoole+mysql+redis 環境を構築する方法

docker で php+nginx+swoole+mysql+redis 環境を構築する方法

オペレーティングシステム: Alibaba Cloud ESC インスタンス centos7.4

ソフトウェア: docker-ce バージョン 18.09.3、docker-compose バージョン 1.23.2

1. swoole-redis-pdo_mysql-gd拡張機能付きのDockerイメージを作成する

1. Dockerfileを作成する

vim ドッカーファイル

2. dockerfileファイルに書き込む

php:7.1-fpm より
apt-get update && apt-get install -y \ を実行します。
  libfreetype6-dev \
  libjpeg62-turbo-dev \
  libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-configure pdo_mysql \
&& docker-php-ext-install pdo_mysql \
&& pecl インストール redis-4.3.0 \
&& pecl インストール swoole \
&& docker-php-ext-enable redis swoole

3. カスタム PHP イメージを作成します。イメージを構築する現在のディレクトリを指定する最後の「.」を忘れないでください。

次のコマンドを実行して docker build を実行します。

コマンドを実行します。ネットワークの問題により、実行に時間がかかります。成功すると、次のようなコードが表示されます。

...
ビルドプロセスが正常に完了しました
'/usr/local/include/php/ext/swoole/config.h' をインストールしています
'/usr/local/lib/php/extensions/no-debug-non-zts-20160303/swoole.so' をインストールしています
インストールOK: channel://pecl.php.net/swoole-4.3.1
設定オプション「php_ini」がphp.iniの場所に設定されていません
php.iniに「extension=swoole.so」を追加する必要があります
中間コンテナの削除 ad1420f7554f
---> 2f2f332d73ce
2f2f332d73ce の構築に成功しました
myphp4:latest のタグ付けに成功しました

この時点で、docker のカスタム myphp4 イメージが正常に作成されました。

2. docker-compose.ymlファイルを作成する

mkdir pnsmr
cd pnsmr
vim docker-compose.yml

次のコードを書いてください

バージョン: '3.0'
サービス:
nginx:
  画像: "nginx:latest"
  ポート:
   - 「10000:80」
  ボリューム:
   - /var/www/html:/usr/share/nginx/html
php-fpm:
  画像: "myphp4"
  ボリューム:
  - /var/www/html:/usr/share/nginx/html
マイスク:
  画像: "mysql:最新"
レディス:
  イメージ: "redis:4.0"

実行手順

docker-compose を起動 -d

成功は目に見えてわかる

警告: 使用している Docker エンジンは swarm モードで実行されています。

Compose は、スウォーム内の複数のノードにサービスをデプロイするためにスウォーム モードを使用しません。すべてのコンテナーは現在のノードでスケジュールされます。

アプリケーションを Swarm 全体にデプロイするには、`docker stack deploy` を使用します。

デフォルト ドライバーを使用してネットワーク「pnsmr_default」を作成しています
pnsmr_php-fpm_1 を作成しています...完了
pnsmr_redis_1 を作成しています...完了
pnsmr_mysql_1 を作成しています...完了
pnsmr_nginx_1 を作成しています...完了

これまでのところ、nginx mysql redis phpサービスが開始されました

3. 各サービスの設定ファイルを変更する

1. ブラウザに127.0.0.1:9998と入力します。#ここにサーバーのIPアドレスを入力すると、次の画像が表示されます。


2. 次に、コンテナ内のnginx設定ファイルを変更します。まず、コマンドを使用して各コンテナのdocker IPアドレスを表示します。

docker 検査 -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

このコマンドは、docker-compose で開かれたすべてのコンテナの IP アドレスを表示できます。結果は下の図のようになります。対応する IP アドレスは内部通信に使用できます。

3. nginxコンテナの設定ファイルをコピーし、nginxがPHPを解析できるように修正します。

docker cp pnsmr_nginx_1:/etc/nginx/conf.d/default.conf nginx.conf
vim nginx.conf

次のコードに変更します

サーバー{
  聞く 80;
  server_name ローカルホスト;

  #文字セット koi8-r;
  #access_log /var/log/nginx/host.access.log メイン;

  位置 / {
    ルート /usr/share/nginx/html;
    インデックス index.html index.htm;
  }

  #エラーページ 404 /404.html;

  # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
  #
  エラーページ 500 502 503 504 /50x.html;
  場所 = /50x.html {
    ルート /usr/share/nginx/html;
  }

  # PHP スクリプトを 127.0.0.1:80 で listen している Apache にプロキシします
  #
  #場所 ~ \.php$ {
  # プロキシパス http://127.0.0.1;
  #}

  # PHP スクリプトを 127.0.0.1:9000 で待機している FastCGI サーバーに渡します
  #
  場所 ~ \.php$ {
    ルートhtml;
    fastcgi_pass 172.24.0.3:9000;#ここにPHPコンテナのDocker内部通信IPを入力する必要があります
    fastcgi_index インデックス.php;
    fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name;
    fastcgi_params を含めます。
  }

  # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する
  # nginxのものと一致します
  #
  #場所 ~ /\.ht {
  # すべて拒否;
  #}
}
docker cp nginx.conf pnsmr_nginx_1:/etc/nginx/conf.d/default.conf # 変更した設定ファイルをコンテナにコピーします docker container stop pnsmr_nginx_1 
docker container start pnsmr_nginx_1 # 設定ファイルを有効にするために nginx コンテナを再起動します vim /var/www/html/index.php # サーバーのローカル ディレクトリに新しい index.php ファイルを作成し、<?php phpinfo(); と入力して保存します vim /var/www/html/index.html # サーバーのローカル ディレクトリに新しい index.html ファイルを作成し、helloworld を出力します

アクセス 127.0.0.1:9998、HTML ファイルの解析は正常です


127.0.0.1:9998/index.php にアクセスします。php ファイルの解析は正常です。


4. mysqlとredisが有効かどうかをテストする

vim /var/www/html/redis.php #redis が正しく設定されているかどうかをテストするために使用します<?php
$redis = 新しい Redis();
$redis->connect("172.24.0.4",6379);
$redis->set('test','これはredisのテストです');
$redis->get('test') をエコーし​​ます。

127.0.0.1:9998/redis.phpにアクセスすると、redisが有効になります

mysqlコンテナに入る

docker exec -it pnsmr_mysql_1 bash

mysqlに入り、ルートユーザーのパスワードを変更する

テストファイルを作成する

vim /var/www/html/mysql.php
<?php
$pdo = 新しい PDO ('mysql:host=172.24.0.2;dbname=mysql;port=3306','root','root123');
var_dump($pdo);

127.0.0.1:9998/mysql.php にアクセス、mysql は有効です

IV. 結論

環境は正常に構成されており、docker-compose up コマンドを使用してワンクリックで生成できますが、各コンテナの構成ファイルを変更する必要があり、まだ十分に便利ではなく、最適化する必要があります。また、docker のクラスターとスタック機能は使用されていません。これについては後で説明します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • docker で nginx+php+mysql を設定する方法
  • Docker で php-nginx-alpine イメージをゼロから構築する方法
  • docker を使用して php7 と nginx の動作環境を構築するプロセス全体 (公式イメージ)
  • PHP の Docker インストールと Nginx を使用したデプロイメントの例

<<:  MySQL 最適化の概要 - クエリエントリの合計数

>>:  MySQL 起動エラー 1067 および文字セットを変更して再起動した後の無効な回復

推薦する

シンプルなドラッグ効果を実現するjs

この記事では、簡単なドラッグ効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...

MySQL の組み込み関数 find_in_set を使用した効率的なあいまい検索の詳細な説明

一般的に使用される方法は次の 4 つです。 1.locate()メソッドを使用する一般的な使用法: ...

Vueフォームで画像を処理する方法

質問: Vue にブログ投稿をアップロードするためのフォームがあり、タイトル、本文、説明、スニペット...

CSS を使用して HTML フォーム コントロールを美しくする詳細な例 (フォームの美化)

1. HTML送信ボタンと下部ボタンの基本構文構造1. HTML送信ボタン入力タグで type=&...

Linux における「/」と「~」の違いの詳細な説明

「/」はルートディレクトリ、「~」はホームディレクトリです。 Linux ストレージはツリー状にマウ...

Vue カプセル化 TabBar コンポーネントの完全なステップ記録

目次実装のアイデア:ステップ 1: TabBar と TabBarItem のコンポーネント カプセ...

Tomcat を使用して Centos 環境に SpringBoot WAR パッケージをデプロイする

戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...

MySQLトリガーの使用

目次1. トリガーの紹介1. トリガーとは何ですか? 2. トリガーの特徴2. トリガーを作成する1...

JavaScript を使用した数独の完全な実装プロセス

目次序文数独の解き方最初のボックスに記入してください2番目のボックスに記入してください3番目のボック...

Vue3 (V) HTTPライブラリaxiosの統合の詳細

目次1. axiosをインストールする2. アクシオスの使用1.ホームページでaxiosを参照する2...

Nginx の add_header ディレクティブに注意する必要があるのはなぜですか?

序文ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘ...

MySQL InnoDB ロックの概要

目次1. 共有ロックと排他ロック2. 意図ロック3. レコードロック4. ギャップロック5. ネクス...

jQueryチェーン呼び出しの詳細な説明

目次チェーン呼び出し小さなケースチェーン呼び出しjQuery オブジェクトが任意のメソッド (ノード...

MySQLで自動作成時間と変更時間を設定する方法の例

この記事では、MySQL の自動作成時刻と変更時刻を設定する方法について説明します。ご参考までに、詳...

HTMLとリソースがどのように読み込まれるかを理解します

このブログのすべてのコンテンツは、クリエイティブ コモンズ ライセンスの下でライセンスされています。...