docker で nginx+php+mysql を設定する方法

docker で nginx+php+mysql を設定する方法

まず、方法を理解します。

docker exec を使用して Docker コンテナに入る

Docker はバージョン 1.3.X 以降、コンテナに入るための新しいコマンド exec も提供しています。この方法は比較的簡単です。このコマンドの使い方を見てみましょう。

sudo docker exec --help 

次に、このコマンドを使用して、すでに実行中のコンテナに入ります。

$ sudo docker ps 
$ sudo docker exec -it 775c7c9ee1e1 /bin/bash

1. nginxを設定する

Docker Hubでnginxイメージを見つける

runoob@runoob:~/nginx$ docker search nginx
名前 説明 星 公式 自動化
nginx Nginx の公式ビルド。3260 [OK]    
jwilder/nginx-proxy docker c 用の自動化された Nginx リバース プロキシ... 674 [OK]
richarvey/nginx-php-fpm Nginx + PHP-FPM 対応のコンテナが動作しています... 207 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5、5.6、7.0 (NG)、CentOS... 67 [OK]
maxexcloo/nginx-php Nginx と ... を使用した Docker フレームワーク コンテナー 57 [OK]
webdevops/php-nginx PHP-FPM 39 を使用した Nginx [OK]
h3nrik/nginx-ldap LDAP/AD、SSL、プロ仕様の NGINX Web サーバー... 27 [OK]
bitnami/nginx Bitnami nginx Docker イメージ 19 [OK]
maxexcloo/nginx Nginx インスタンスを備えた Docker フレームワーク コンテナ... 7 [OK]
...

ここで公式画像を紹介します

runoob@runoob:~/nginx$ docker pull nginx

ダウンロードが完了するのを待った後、ローカル ミラー リストで REPOSITORY が nginx であるミラーを見つけることができます。

runoob@runoob:~/nginx$ docker イメージ nginx
リポジトリ タグ イメージ ID 作成 サイズ
nginx 最新 555bbd91e13c 3日前 182.8 MB

コンテナを作成して実行します。

docker run --name mynginx -p 80:80 -v /var/www:/var/www -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -d nginx

知らせ:

-v はファイル マッピングを追加し、ホスト上で変更されたファイルをコンテナーに直接マップできるようにします。ここでのディレクトリは実際の状況に応じてマッピングされます。

コンテナを作成して実行すると、docker 内の nginx が正常に起動します。nginx を再度起動するために docker に入る必要はありません。そうしないと、nginx がすでに起動しているため、ポート 80 とその他のポートが使用されているというメッセージが表示されます。

この時点で、nginx によって設定されたドメイン名検証にアクセスできます。

ここでマッピングした conf.d には主に nginx 設定ファイルが含まれており、php 設定情報は次のとおりです。

# php
サーバー{
  文字セット utf-8;
  クライアントの最大ボディサイズ 128M;

  listen 80; ## ipv4をリッスンする
  #listen [::]:80 default_server ipv6only=on; ## ipv6をリッスンする

  サーバー名 www.baidu.com;
  ルート /var/www;
  インデックスindex.php;

  位置 / {
    #-e はファイル名が存在する限り、(!-e $request_filename){ が真であることを意味します。
      ^(.*)$ /index.php?s=$1 を最後に書き換えます。
      壊す;
    }
    # 実際のファイルではないものはすべて index.php にリダイレクトします
    try_files $uri $uri/ /index.php$is_args$args;
  }

  # Yii による存在しない静的ファイルへの呼び出しの処理を回避するためにコメントを解除します
  #場所 ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
  # try_files $uri =404;
  #}
  #エラーページ 404 /404.html;

  # /assets ディレクトリの PHP ファイルへのアクセスを拒否する
  場所 ~ ^/assets/.*\.php$ {
    すべてを否定する;
  }

  場所 ~ \.php$ {
    fastcgi_params を含めます。
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    172.17.0.3:9000 をパスします。
    #fastcgi_pass unix:/var/run/php5-fpm.sock;
    try_files $uri =404;
  }

  場所 ~* /\. {
    すべてを否定する;
  }
}

最後に fastcgi_pass の IP アドレスに注意してください。これは PHP 設定の FAQ に詳しく記載されています。

2. PHPの設定

Docker HubでPHPイメージを探す

runoob@runoob:~/php-fpm$ docker 検索 php
名前 説明 星 公式 自動化
php Web 開発用に設計されていますが、PH... 1232 [OK]    
richarvey/nginx-php-fpm Nginx + PHP-FPM 対応のコンテナが動作しています... 207 [OK]
phpmyadmin/phpmyadmin MySQL および MariaDB 用の Web インターフェース。123 [OK]
eboraas/apache-php Apache 上の PHP5 (SSL サポート付き)、ビルド済み... 69 [OK]
php-zendserver Zend Server - 統合された PHP アプリケーション... 69 [OK]    
million12/nginx-php Nginx + PHP-FPM 5.5、5.6、7.0 (NG)、CentOS... 67 [OK]
webdevops/php-nginx PHP-FPM 39 を使用した Nginx [OK]
webdevops/php-apache PHP-FPM を使用した Apache (webdevops/php ベース) 14 [OK]
phpunit/phpunit PHPUnit はプログラマー向けのテストフレームワークです... 14 [OK]
tetraweb/php CI および実行用の PHP 5.3、5.4、5.5、5.6、7.0... 12 [OK]
webdevops/php PHP (FPM および CLI) サービス コンテナ 10 [OK]
...

ここでは、5.6-fpmのタグが付いた公式イメージを取得します。

runoob@runoob:~/php-fpm$ docker pull php:5.6-fpm

ダウンロードが完了するのを待った後、ローカル ミラー リストで、リポジトリが php、タグが 5.6-fpm のイメージを見つけることができます。

runoob@runoob:~/php-fpm$ docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
php 5.6-fpm 025041cd3aa5 6日前 456.3 MB

php コンテナを作成して実行します。

docker run -p 9000:9000 --name phpfpm -v /var/www:/var/www -d php:5.6-fpm

ここでファイル マッピングを作成するか、PHP コンテナー内に対応する PHP コードが存在する必要があることに注意してください。前の手順の nginx のファイル マッピングはここでは見つかりません。したがって、ファイル マッピングがない場合、127.0.0.1:9000 はこのコンテナー内のファイルを見つけることができません。

よくある質問:

PHPコンテナを起動した後、nginxにアクセスすると、「502 Bad Gateway」と表示されます。

次のことを試してください。

PHPミラーのIPアドレスを表示する

docker 検査 --format='{{.NetworkSettings.IPAddress}}' phpfpm

例: 192.168.4.202

次に、nginxのconf設定ファイルを変更して、fastcgi_passの値を192.168.4.202:9000に設定します。

vim /docker/nginx/conf.d/default.conf

192.168.4.202:9000 を設定します。

nginx コンテナを再起動すると、正常にアクセスできるようになります。

3. MySQLの設定

Docker Hubでmysqlイメージを探す

runoob@runoob:/mysql$ docker 検索 mysql
名前 説明 星 公式 自動化
mysql MySQL は広く使用されているオープンソースの関連製品です。 2529 [OK]    
mysql/mysql-server 最適化された MySQL Server Docker イメージ。作成... 161 [OK]
centurylink/mysql mysql を含むイメージ。 45 [OK] のように最適化されています。
sameersbn/mysql 36 [OK]
google/mysql Google Compute Engine 16 用の MySQL サーバー [OK]
appcontainers/mysql Centos/Debian ベースのカスタマイズ可能な MySQL コンテナ 8 [OK]
marvambass/mysql Ubuntu 14.04 6 ベースの MySQL サーバー [OK]
drupaldocker/mysql Drupal 2 用の MySQL [OK]
Azuki で MySQL を実行するための azukiapp/mysql Docker イメージ - http:... 2 [OK]
...

ここでは、5.6のタグが付いた公式イメージを取得します。

runoob@runoob:~/mysql$ docker pull mysql:5.6

ダウンロードが完了するのを待った後、ローカル ミラー リストで、REPOSITORY が mysql、タグが 5.6 のイメージを見つけることができます。

runoob@runoob:~/mysql$ docker イメージ |grep mysql
mysql 5.6 2c0964ec182a 3 週間前 329 MB

MySQL コンテナを作成して実行します。

docker run -p 3306:3306 --name mysql -v /usr/local/mysql:/etc/mysql/sqlinit -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

ここでのファイル マッピングの主な目的は、ホストの SQL データベース データ ファイルを Docker MySQL コンテナにマッピングして簡単にインポートできるようにすることです。MySQL コンテナのディレクトリは既存のディレクトリにすることはできないことに注意してください。既存のディレクトリにすると上書きされます。

知らせ:

ここでは、my.cnf を簡単に作成できるので、自分で追加する必要はありません。

拡大する

外部ツールNavicatを使用してDockerでMySQLに接続する

mysql ホストの場合は、docker で IP を入力し、次のように取得します。

docker 検査 --format='{{.NetworkSettings.IPAddress}}' mysql 

SSH 接続情報を入力します:

接続に成功しました!

知らせ:

Docker コンテナの起動順序により、コンテナの IP アドレスが不一致になります。コンテナの IP を使用してデータベースや fastcgi に接続する場合は、コンテナの起動順序に注意してください。

コンテナを再起動します: docker restart コンテナ名/コンテナID

コンテナをシャットダウンします: docker stop xxx

コンテナを起動します: docker start xxx

実行中のコンテナを表示する: docker ps

すべてのコンテナを表示します(実行されていないコンテナも含む): docker ps -a

コンテナを作成して実行します: docker run

---------------------------------------

よくあるエラー:

1. thinkphp がエラーを報告します: 未定義のクラス定数 'MYSQL_ATTR_INIT_COMMAND'

pdo_mysql 拡張機能が見つからないため、データベース接続に失敗します。

php.ini を見つけて、docker の /usr/local/etc/php に php.ini のコピーをコピーし、extension=pdo_mysql.so を追加して、phpfpm を再起動します。

それでもうまくいかない場合は、phpinfoページにアクセスしてpdo_mysqlがあるかどうかを確認してください。

そうでない場合、拡張機能は存在しないため、コンパイルする必要があります。

コンパイル方法は次のとおりです。

これは2つの方法で達成できる

方法1(未検証):

pecl pdo_msql

方法 2 (実行可能であることが証明されています):

PHP フォルダー内の Docker の PHP コンテナーに移動します。

docker-php-ext-install pdo pdo_mysql

/usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent と報告された場合

解決:

/usr/local/etc/php ディレクトリの直下に、新しい conf.d ディレクトリと対応する docker-php-ext-pdo_msql.ini ファイルを作成します。

docker-php-ext-pdo_msql.ini の内容は次のとおりです。

拡張子=pdo_mysql.so

2. thinkphp がエラー _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/4e64ea6a2012f26b832b14cbc2152b28.php を報告します

これは、サーバーのキャッシュ フォルダーに十分な操作権限がない、つまり Runtime に権限がないためです。すべてのキャッシュ ファイルを削除してから、Runtime777 に権限を与えてください。

sudo chmod 777 Runtime またはコードベースの最外層に 777 権限を直接設定します

3. ThinkPHPの検証コード画像が表示されない

gd 拡張機能が見つかりません。インストールしてください:

docker-php-ext-install pdo pdo_mysql

次のエラーが報告される可能性があります:

設定に失敗した場合は、--with-webp-dir=<DIR> を試してください。
設定に失敗した場合は、--with-jpeg-dir=<DIR> を試してください。
configure: エラー: png.h が見つかりません。

インストール:

apt-get で libpng-dev と libjpeg-dev をインストールします

再度実行します:

// freetype 設定を追加 docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include --with-jpeg-dir=/usr/include

// docker-php-ext-install gd をインストールします

php.ini に php_gd2.so を追加

gdライブラリはphpinfoに表示されます

phpinfo の gd ライブラリに freetype サポートがない場合、検証コードは表示されず、エラーが報告されることに注意してください。

未定義の関数 Think_imagettftext() を呼び出します

gd ライブラリで freeType が使用できない場合は、次の手順に従います。

docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include

再コンパイル:
docker-php-ext-インストール gd

エラーが発生した場合:

configure: エラー: freetype-config が見つかりません。

実行: apt-get -y install libfreetype6-dev を実行し、上記のコマンドを続けて実行します。

gd ライブラリの freetype を使用すると、検証コードが正常に表示されます。

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

以下もご興味があるかもしれません:
  • Docker で nginx の https を設定する方法
  • Docker に nginx をインストールし、https 経由でアクセスを構成する方法
  • Dockerでnginxをデプロイし、設定ファイルを変更する方法
  • nginxはdockerコンテナ内に設定ファイルを自動的に生成します
  • Docker nginxのインストールと設定方法
  • Dockerでnginxを実行し、ローカルディレクトリをイメージにマウントする方法
  • Docker nginx + https サブドメイン設定の詳細なチュートリアル

<<:  eject を使用せずに create-react-app の設定を変更する方法

>>:  反応ループデータの実装(リスト)

推薦する

Windows で nginx を素早くインストールし、自動的に起動するように設定する

目次1. Windows システムでの Nginx のインストールと起動プロセス: 2. 起動時にN...

Docker で Maven プロジェクトをより速くビルドする

目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....

JSはフロントエンドのページング効果を実現します

この記事の例では、フロントエンドのページング効果を実現するためのJSの具体的なコードを参考までに共有...

MySQLはストアドプロシージャを使用して数百万のデータを素早く追加します。サンプルコード

序文インデックスを追加した場合と追加しなかった場合の違いを反映するには、数百万のデータを使用する必要...

Reactプロジェクトの新規作成からデプロイまでの実装例

新しいプロジェクトを始めるこの記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、...

Reactでパスワード強度検出器を実装する方法

目次序文使用コンポーネントの記述データ構造分析プロセス分析基礎コードの分析他の要約する序文パスワード...

Vue+Elementバックグラウンド管理フレームワークの統合実践

目次Vue+ElementUI バックグラウンド管理フレームワークでは、ElementUI とは何で...

システム エラー 1067 のため、MySQL 5.6 解凍バージョン サービスを開始できません

今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................

DockerにTomcat8をインストールする方法

1. dockerでtomcat8をインストールする1. Docker HubでTomcatイメージ...

nginx ウェブサイト サービスのアンチホットリンクを設定する方法 (推奨)

1. ホットリンクの原則1.1 Webページの準備Web ソース ホスト (192.168.153...

docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装

目次構成解析サービス構築ディレクトリ構造ファイルを作成インスタンス構成サービスを開始するテストRed...

スタイルを書く際の背景色宣言の重要性

タイトルの通り、ページを修正すると以下のような状況が発生する可能性があります。現在、古いページを改修...

winx64 での mysql5.7.19 の基本的なインストール プロセス (詳細)

1. ダウンロード参考: https://www.jb51.net/softs/451120.ht...

MySQL マルチバージョン同時実行制御 MVCC の詳細な研究

MVCC MVCC (Multi-Version Concurrency Control) は、マル...

202 無料の高品質 XHTML テンプレート (2)

前回の記事「202 個の無料高品質 XHTML テンプレート (1)」に続き、123WORDPRES...