PHP環境構築におけるDockerの柔軟な実装

PHP環境構築におけるDockerの柔軟な実装

Docker を使用して、柔軟なオンライン PHP 環境を構築します。場合によっては、他の人がすでに統合しているパッケージやイメージが不要なこともあります。

以下の方法を使用して、必要な環境構造を1つずつ構築し、最終的にワンクリックの自動展開を実現します。

Docker スキルツリーを段階的に強化する

          ## .
       ## ## ## ==
      ## ## ## ## ## ===
    /"""""""""""""""".__/ ===
 ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
    ._____ o __/
     . . __/
     .___.______/

* まず、[server] プロジェクトをクローンして、サーバーのルートディレクトリに配置します (後で独自の環境構造を構築することもできます)

(初級)Dockerを使って1つずつビルドする

1.画像をダウンロードする

docker pull php:7.2-fpm コロンの後にバージョンを選択します

docker プル nginx

docker pull mysql:5.7はローカルデータベースを必要としないので無視できます。

docker pull redis:3.2 はローカル redis を必要としないので無視できます。

docker イメージ ダウンロードしたすべてのイメージを表示

2. イメージをダウンロードした後、コンテナを実行します。[以下は --link メソッドを使用してコンテナを作成します。作成順序に注意してください]

注記:
-iはコンテナを操作することを可能にする
-tは新しいコンテナ内のターミナルを指定します
-dはコンテナがバックグラウンドで実行されることを意味します
/bin/bash コンテナ内でbashシェルを起動します
-p はコンテナとホストのポートマッピングを作成します
--name はコンテナの名前を指定します
-v コンテナ内のパスをホストパスにマウントします
--privileged=true はコンテナに権限を与えます。ディレクトリをマウントすると、コンテナはディレクトリの下のファイルまたはディレクトリにアクセスできるようになります。
--link を使用すると、2 つのコンテナをリンクして、ソース コンテナ (リンクされたコンテナ) と受信コンテナ (アクティブにリンクを解除するコンテナ) が相互に通信できるようになり、コンテナ間の通信がコンテナ IP に依存することがなくなります。

<mysqlコンテナを実行>

docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注: -MYSQL_ROOT_PASSWORD=123456 は、mysql の初期パスワードを設定します。

ローカルデータベースを構築する必要がない場合は、次の手順に進みます。

<Redisコンテナを実行>

docker run --name myredis -p 6379:6379 -d redis:3.2

注: ローカルRedisを構築する必要がない場合は、次の手順に進みます。

<phpコンテナを実行>

docker run -d -p 9000:9000 --name myphp -v /server/www:/var/www/html -v /server/php:/usr/local/etc/php --link mydb:mydb --link myredis:myredis --privileged=true php:7.2-fpm

注: ローカルデータベースまたはRedisを構築する必要がない場合は、--link mydb:mydb --link myredis:myredisを省略できます。

-v で空のフォルダをマウントするとコンテナの内容が上書きされるので、事前に設定ファイルを準備しておく必要があることに注意してください。

<nginxコンテナを実行>

docker run --name mynginx -d -p 80:80 -v /server/www:/usr/share/nginx/html -v /server/nginx:/etc/nginx -v /server/logs/nginx.logs:/var/log/nginx --link myphp:myphp --privileged=true nginx

注記:

-v 文の後のコロンはコンテナ内のパスです。 nginx の Web プロジェクト ディレクトリ、設定ディレクトリ、ログ ディレクトリを、事前に用意した /server ディレクトリにマウントしました。
--link myphp:myphp は、エイリアス myphp を介して nginx コンテナと php コンテナを接続するため、myphp コンテナの IP を指定する必要はありません。

docker ps -a実行して、すべてのコンテナが正常に実行されていることを確認します。環境は基本的にここでセットアップされます。

ディレクトリをマウントした後、コンテナに入って設定を変更することなく、対応するマウントされたディレクトリでnginx構成を直接変更できます。

/server/nginx/conf.d/Default.conf へ

サーバー{
 聴く80:
 サーバー名 ローカルホスト:
 位置 / {
 root /usr/share/nginx/html/blog/public: ##/user/share/nginx/html は作業ディレクトリです。index index.html index.php index.htm
 }

 エラーページ 500 502 503 504 /50x.html
 ロケール = /50x.html {
 ルート /usr/share/nginx/html
 }

 場所 ~\.php$ {
 fastcgi_pass myphp 9000:
   ## コンテナ間のリンクを確立するには、相手の IP アドレスを指定する必要があります。sudo docker inspect myphp コマンドを使用して、下部の IPAddress パラメータがコンテナの IP アドレスであることを確認します。
   ##コンテナ作成時に --link でコンテナを作成しました。IP の代わりに Link コンテナの仮名を使用してアクセスできるため、IP への依存がなくなります fastcgi_index index.php
   fastcgi-param SCRIPI_FILENAME /var/www/html/blog/public$fastcgi_script_name:
   ## myphp と mynginx の作業ディレクトリは異なります。Mynginx は /usr/share/nginx/html です。
   ## php は /var/www/html なので、コンテナを作成するときに、両方のディレクトリをホストの /server/www 上の同じディレクトリにマウントしましたが、ホストのパブリック マウント ディレクトリはここでは使用できず、fastcgi_params が含まれます。
 }
}

3. PHP拡張ライブラリのインストール

docker exec -ti myphp /bin/bash まずコンテナに入ります

docker-php-ext-install pdo pdo_mysql pdo_mysql拡張機能をインストールする

docker-php-ext-redis をインストール

注意: 現時点では、PHPソースコードファイルにいくつかの拡張機能が含まれていないため、redis.soにエラーメッセージが表示されます。

方法1:

tar zxvf /server/php_lib/redis-4.1.0.tgz ダウンロードしたredis拡張パッケージを解凍します。

docker cp /server/php_lib/redis-4.1.0 myphp:/usr/src/php/ext/redis 拡張機能をコンテナに入れてインストールします

注記:

拡張パッケージをコンテナの ext ディレクトリに直接配置すると、エラー メッセージ「エラー: そのようなコンテナはありません: パス: myphp:/usr/src/php/ext」が表示される場合があります。
別のサーバーウィンドウを開いてPHPコンテナに入り、docker-php-ext-install redisを実行します。このとき、/usr/src/php/ext/redisが存在しないというエラーメッセージが報告されます。
この状態を維持し、最初のサーバー ウィンドウで前のコマンドを実行すると成功します。
(具体的な理由は不明ですが、docker-php-ext-installコマンドを一度実行した後のみ、コンテナ内で/usr/src/php/extディレクトリが開かれます)

方法2:

注記:

公式の推奨事項は、PECL (PEAR を通じてパッケージ化された PHP の拡張ライブラリ リポジトリ) を使用することです。 pecl installを使用して拡張機能をインストールし、公式のdocker-php-ext-enableを使用します。
拡張機能を有効にする簡単なスクリプト

pecl で redis をインストール && docker-php-ext-enable redis

docker restart myphp拡張機能をインストールしたら、コンテナを終了してコンテナを再起動します。

* その他のコマンド

docker stop $(docker ps -q) はすべてのコンテナを停止します

docker rm $(docker ps -aq) すべてのコンテナを削除します

docker rmi $(docker images -q) すべてのイメージを削除する

docker examine myphp でコンテナの設定情報を表示する

* 独自のディレクトリ構造を構築する

独自のサーバーディレクトリ構造を構築することもできます。まず、空のフォルダーをマウントすると、コンテナー内のフォルダーの内容がすべてクリアされることを知っておく必要があります。そのため、最初にコピーしてからマウントする必要があります。例: 一時コンテナーを作成する sudo docker run --name mynginx -p 80:80 -it -d nginx
コンテナに入り、必要な設定ファイルのディレクトリアドレスを確認します。例: /etc/nginx コンテナを終了し、コンテナ内の必要なディレクトリ構造をホストにコピーします。例: docker cp mydb:/etc/nginx /server/nginx
コンテナを削除して新しいコンテナを作成すると、ディレクトリをマウントできます。その後、ホストマシン上で直接 nginx 構成ファイルを変更できます。
docker run --name mynginx -d -p 80:80 -v /server/nginx:/etc/nginx --link myphp:myphp --privileged=true nginx

(2次) docker-compose 自動ビルド

上記の手順を完了すると、Docker の基本的なコンテナ操作について予備的な理解が得られます。
Docker-compose はコンテナをオーケストレーションするために使用されます。たとえば、php イメージ、mysql イメージ、nginx イメージがあるとします。 docker-composeがない場合、
その後、コンテナを起動するたびに、各コンテナの起動パラメータ、環境変数、コンテナ名を入力し、異なるコンテナのリンクパラメータを指定するなどする必要があります。
かなり面倒です。 docker-composer を使用した後は、これらのコマンドを docker-composer.yml ファイルに一度に記述できます。環境全体 (3 つのコンテナを含む) を起動するたびに、docker-composer up コマンドを入力するだけで済みます。

1. docker-composeをインストールする

curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

2. ワンクリック展開環境

/server/compose/docker-compose.ymlが設定されているので、コマンドを入力するだけです

cd /server/compose

docker-compose を起動 -d
バージョン:"2"
サービス:
  マイdb:
    コンテナ名:"mydb"
    ポート:
      - 「3306:3306」
    ボリューム: #マウントされたディレクトリをここに記述します - /server/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:re #コンテナとホスト環境間の時間同期を設定します: # カスタム環境変数 MYSQL_ROOT_PASSWORD:123456
    images:mysql: 8.0 # コンテナはイメージ myredis: を参照します。
    コンテナ名:"myredis"
    再起動:常に
    ポート:
      - 「6379:6379」
    ボリューム:
      - /server/redis:/データ
      -/etc/localtime:etc/localtime:re
    イメージ: redis:3.2
  マイphp:
    コンテナ名:"myphp"
    再起動: 常に
    ポート:
      - 「9000:9000」
    ボリューム:
      - /server/www:/var/www/html
      -/サーバー/php:/usr/local/etc/php
      -/etc/localtime:/etc/localtime:re
     リンク:
      - 「mydb」
      - 「ミレディス」
     イメージ:php:7.2-fpm
   ミンギンクス:
     コンテナ名: "mynginx"
     再起動: 常に
     ポート:
       - 「80:80」
     リンク:
       - 「myphp」
     ボリューム:
       - /server/www:/usr/share/nginx/html
       - /server/nginx:/etc/nginx
       - /server/logs/nginx.logsL/var/log/nginx
       - /etc/localtime:/etc/localtime:re
     画像: nginx:最新

コンテナを実行する上記のコマンドと比較すると、docker_yml の構成構造とセマンティクスが一目でわかります。

(レベル 3) docker-compose と dockerfile の完全なビルド

ワンクリック操作を実現するために Docker-compose が使用されますが、問題は PHP 拡張ライブラリを別途インストールする必要があることです。そのため、カスタム コンテナ イメージを構築するには、ここで Dockerfile が必要になります。

真のワンクリック完了を実現

目次:

  サーバー -|           
     -| compose.dockerfiles -| docker-compose.yml
                 -| mysql -| Dockerfile ここで、mysql イメージをビルドするためのカスタム dockerfile を設定します|      
                 -| nginx -| Dockerfile ここで、nginx イメージをビルドするためのカスタム dockerfile を設定します|     
                 -| php -| Dockerfile ここで、php イメージをビルドするためのカスタム dockerfile を設定します|    
                 -| redis -| Dockerfile ここで、redisイメージを構築するための独自のDockerfileを設定します
FROM php:7.2-fpm #カスタムイメージを構築し、公式イメージをインポートします MAINTAINER goozp "ユーザー名"
#コンテナのタイムゾーンをホストと同じに設定する ENV TZ=Asia/Shanghai
実行 ln -snf /usr/share/zoneinfo/$TZ /etc/localtome && echo $TZ > /etc/timezone
#依存パッケージとPHPコア拡張機能を更新してインストールする RUN apt-get update && apt-get install -y \
      libfreetype6-dev \ 
      libhpeg62-turbo-dev \
      libpng-dev \ 
    && 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-install zip \ 
      && docker-php-ext-install pdo_mysql \
      && docker-php-ext-install opcache
      && docker-php-ext-install mysqli
      rm -r /var/lib/apt/lists/*
# ソースパッケージが存在しない場合は、pecl を使用して拡張機能をインストールします。 RUN pecl install redis \
  && pecl インストール xdebug \
  && docker-php-ext-enable redis xdebug

ワークディレクトリ /データ
#権限設定 RUN usermod -u 1000 www-data

PHPのDockerfileをカスタマイズして、カスタムイメージをビルドし、同時に拡張機能をインストールします。すべてのDockerfile構成を完了すると、Docker-compose.ymlファイルは公式イメージimage:php-fpm:7.2を使用する必要がなくなり、ディレクトリで構成されたDockerfileを直接参照するために直接build: ./phpを使用するようになります。
最後のヒント: イメージが作成されると、次回 docker-compose は既存のイメージをビルドするのではなく、直接取得します。Dockerfile の設定を変更する場合は、以前のイメージを削除することを忘れないでください。

cd /server/compose.dockerfiles

docker-compose を起動 -d

以上がDockerの環境設定方法の全てです

* シェルを使用してホストマシン上でスクリプトを実行するようにPHPをスケジュールする必要がある場合

docker exec -it myphp /bin/bash -c '/usr/local/bin/php /var/www/html/blog/public/index.php'

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

以下もご興味があるかもしれません:
  • Mac で docker を使って PHP 開発環境を構成する方法
  • PHP の Docker インストールと Nginx を使用したデプロイメントの例
  • DockerにPHP拡張機能をインストールする手順の説明
  • Docker を使用して OpenLDAP+phpLDAPadmin 統合ユーザー認証を構築する方法
  • Docker ビルド PHP 環境チュートリアル詳細説明
  • docker に php-fpm サービス/拡張機能/構成をインストールする詳細なチュートリアル
  • LNMP と phpMyAdmin を Docker にデプロイする方法
  • PHP は docker を使用してワーカーマンを実行するケースの説明

<<:  Vuex はシンプルなショッピングカート機能を実装します

>>:  MySQL 8.0 をインストールした後、初めてログインするときにパスワードを変更する問題を解決する

推薦する

Linux (CentOS7) に Tomcat をインストールし、Tomcat をスタートアップ項目として設定します (tomcat8 を例に挙げます)

目次TomcatをインストールするTomcat 圧縮パッケージをダウンロードTomcatには3つの主...

1分でVueが右クリックメニューを実装

目次レンダリングインストールコードの実装カスタムスタイル要約する効率的に要件を満たし、車輪の再発明を...

Linx awk入門チュートリアルの詳細な説明

Awk はテキスト ファイルを処理するためのアプリケーションであり、ほぼすべての Linux システ...

VMWare で Ubuntu を再起動した後、インターネットにアクセスできなくなる問題の解決方法

VMWareでUbuntuを再起動した後、インターネットにアクセスできなくなる問題を解決するには、次...

フローティングをクリアするいくつかの方法(推奨)

1. 同じタイプの空の要素を追加し、要素の CSS 属性 clear:both; を設定します。 ...

CentOS のデフォルトの SSH ポート番号を変更する方法の例

LinuxサーバーのデフォルトのSSHポート番号は通常22なので、ほとんどのユーザーはセキュリティ上...

Vueの最初のプログラムを書くための勉強ノート

目次1. HTMLを書く、最初のVueプログラムビューテンプレートとデータに注意してください決定ルー...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

vuexサードパーティパッケージを使用してデータの永続性を実装する方法

目的: vuex で管理されている状態データを同時にローカルに保存できるようにします。独自のストレー...

Linux 脆弱性スキャンツール lynis の使用分析

はじめに: Lynis は、徹底的なセキュリティ スキャンを実行できる Unix システム用のセキュ...

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

JavaScript 組み込みの日付と時刻の書式設定のサンプル コード

1. 基礎知識(日付オブジェクトのメソッド) 😜 getFullYear() は年を表す4桁の数字を...

AWSサーバーリソースを無料で使用する方法を教えます

AWS - Amazon のクラウド コンピューティング サービス プラットフォーム以前、AWS の...

Web デザインのための 5 つのシンプルな XHTML Web フォーム

Web デザイン 5 におけるシンプルな XHTML Web フォーム。 テクニック 1: ラベル ...