ホームページ  >  記事  >  バックエンド開発  >  DockerでPHP開発環境を構築する

DockerでPHP開発環境を構築する

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-24 15:45:194110ブラウズ

今回はDockerでPHP開発環境を構築する際の注意事項をご紹介します。実際の事例をいくつかご紹介しますので、一緒に見ていきましょう。

1. はじめに

1.1 Docker を使用する理由

そのようなシナリオはありますか? ローカルで開発するときに環境をセットアップする必要があります。また、会社に行くときにも環境をセットアップする必要があります。こっそり遊びたい場合は環境を整える必要があります。環境依存性がかなり高いので、それに合わせないと不十分です。このとき Docker があれば、マシンに Docker をインストールして、記述した Dockerfile を置くだけで、コマンド行 1 行で自動的に完了するので便利で効率的ですよね。 1.2 準備

次に、この記事では、zPhal-dockerfiles を例として、PHP 開発環境をセットアップする方法を紹介します。これは、私のブログ システム用に用意した Dockerfile のセットです。

Windows、Mac、Linux のいずれであっても、Windows 10 システムを含む Docker は非常に優れたサポートを提供しますが、より多くのメモリを消費します。

Docker コマンド ラインを介して、イメージのプル、コンテナーの実行、コンテナー内でのコマンドの実行など、多くのことを行うことができますが、現在は、より単純で粗雑な方法を使用して Dockerfile を作成し、管理する必要があります。これらのドキュメントは、操作プロセスを簡素化します。

Dockerfile とは何ですか?

Dockerfile は、一連のコマンドとパラメーターで構成されるスクリプトであり、これらのコマンドはプルされたベース イメージに適用され、最終的に、インストールするものを含む必要なイメージを作成できます。ソフトウェアは、インストールする拡張機能や実行するコマンドなどをあらかじめカスタマイズしてワンクリックで実行することに相当し、操作プロセスが大幅に簡素化されます。

この記事に従って環境をセットアップするには、次のことを行う必要があります:

まず、Docker と Docker のいくつかの基本操作、および docker-compose とは何かを理解します。

次に、Docker と docker-compose をインストールする必要があります。ここでは、docker-compose を使用して Dockerfile を管理します。

Dockerfile の作成は生きているものであり、死んだものではないことに注意してください。作成する Dockerfile は、ニーズに応じて異なります。

Docker の公式ドキュメントは非常に明確ですが、質問がある場合は、Docker ドキュメントを参照することをお勧めします。

2. 書き込みを開始します

以下では、zPhal-dockerfiles を例として説明します。リンクをクリックすると、完全なファイルが表示されます。

2.1 プレビュー

まず、私が作成した Dockerfile プロジェクトは、大まかに次のディレクトリに分かれています (もちろん、これは私が決めたものであり、ファイルをこのようにフォーマットする必要はありません)。

zPhal-dockerfiles
app/
 index.php
 phpinfo.php
data/
 .gitignore
files/
 mysql/
 conf.d/
  mysql-file.cnf
 Dockerfile
 nginx/
 conf.d/
  default.conf
  zphal.conf
 Dockerfile
 nginx.conf
 php/
 pkg/
  .gitignore
 Dockerfile
 php.ini
 php-dev.ini
 php-fpm.conf
 redis/
 Dockerfile
 docker-compose.yml
logs/
.gitgnore
README.md

In このプロジェクトでは、PHP、MySQL、Nginx、Redis、Composer、Phalcon 拡張機能などを使用しました。

これを行うには、一般に 3 つのプロセスがあります: 各ソフトウェアの Dockerfile を作成する;

構成ファイル

を作成する; 構成構成ファイルを Dockerfile ファイルにスローしてミラーにビルドすることを含む、すべての Dockerfile を処理する。 2.2 Dockerfileの作成

2.2.1 PHP

以下はPHP用のDockerfileです:

FROM php:7.2-fpm

MAINTAINER goozp "gzp@goozp.com"

タイムゾーンを設定します


ENV TZ =Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

依存関係パッケージと PHP コア拡張機能を更新してインストールします

RUN apt-get update && apt-get install -y \
git \
libfreetype6-dev \
libjpeg62-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/*

pre をコピーします-ダウンロードした拡張パッケージをホストにコピーします

COPY ./pkg/redis.tgz /home/redis.tgz
COPY ./pkg/cphalcon.tar.gz /home/cphalcon.tar.gz

ここでは Redis をインストールしています

pecl install /home/redis.tgz && echo "extension=redis.so" > etc/php/conf. d/redis.ini

サードパーティの拡張機能をインストールします。これは Phalcon 拡張機能です

RUN cd /home \
&& tar -zxvf cphalcon.tar.gz \
&& mv cphalcon-* phalcon \
&& cd phalcon/build \
&& ./install \
&& echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini

Composer をインストールします

ENV COMPOSER_HOME /root/composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
ENV PATH $COMPOSER_HOME/vendor/bin:$PATH
RUN rm -f /home/redis.tgz \
rm -f /home/cphalcon.tar.gz 
WORKDIR /data
Write Permission
RUN usermod -u 1000 www-data

最初の行はベースイメージを定義します。ここでは PHP 7.2 の fpm バージョンを使用します。ここで、2 行目はメンテナンス By を定義しています。

次のステップはタイムゾーンを定義することです。この文は主にすべてのコンテナーの時間をホストと同期するために、すべての Dockerfile で定義されます。実際には、docker-composer.yml ファイルで次のように定義できます。

services:

php-fpm:

volumes:

- /etc/localtime:/etc/localtime:ro

ただし、Windows などの Linux 以外のシステムで実行している場合、/etc/localtime を取得できません。互換性の向上 すべてのプラットフォームで、時間を Dockerfile に同期します。

次に、いくつかの拡張機能をインストールします。実際、拡張機能をインストールするプロセスは、Composer を使用して Linux に PHP 拡張機能をインストールする方法と似ています。 Composer を php-fpm イメージに直接インストールしました。実際、Composer の公式イメージも提供されています。Composer はパッケージを管理するために Composer コマンドを実行するためだけに使用するためです。 Composer の場合 別のコンテナの場合、使用していないときはコンテナをオフにすることができますが、ここでは主にプロジェクトにいくつかの PHP 拡張機能がインストールされているため、composer.json を作成した後、Composer を php-fpm イメージに直接インストールしました。ファイルを作成するときに、拡張機能の依存関係を定義しました。これにより、Composer の実行時に、環境にこれらの依存関係がインストールされているかどうかがチェックされます。そのため、Composer イメージを直接使用する場合は、使用する拡張機能もインストールする必要があります。画像を作成するのははるかに面倒なので、PHP イメージ内で直接これを実行しました。実際には違いはなく、使い方によって異なります。

2.2.2 Nginx

以下はNginxのDockerfileです:

FROM nginx:1.12

set timezome

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc /localtime && echo $TZ > /etc/timezone

これははるかに単純で、時間を設定するだけです。他に何もインストールする必要がないので、公式イメージを直接使用できます。

もちろん、設定ファイルを変更する必要があります。最後に、docker-compose.yml ファイルに設定ファイルを書き込むだけです。これについては、PHP 設定ファイルを含めて以下で説明します。 MySQL 設定ファイルはすべて同じです。

2.2.3 MySQL

以下はMySQLのDockerfileです:

FROM mysql:5.7

set timezome

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ / etc/ localtime && echo $TZ > /etc/timezone

MySQL には特別なものは何もなく、公式イメージを使用するだけです。

2.2.4 Redis

以下はRedisで、公式イメージもそのまま使用しています:

FROM redis:3.2

set timezome

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share /zoneinfo/ $TZ /etc/localtime && echo $TZ > /etc/timezone

2.3 設定ファイルの書き方

PHP 設定ファイルは PHP ディレクトリに配置されます。 Nginx 設定は Nginx ディレクトリに配置されます。conf.d フォルダーなどの新しいサブフォルダーを作成するかどうかは状況によって異なります。

以下では、Nginx 設定ファイルを例として取り上げます。まず、Nginx ディレクトリは次のようになります:

nginx/

conf.d/

default.conf

zpal.conf

Dockerfile

nginx.conf

conf に加えて、すべてのドメイン名設定ファイルを保存するために使用されるサブフォルダー conf.d も Linux で PHP 環境を構築したことがある方にはよく知られているはずです。これらの構成ファイルは、その時点でコンテナに転送されるファイルであり、ホスト上では使用されません。

注意すべき最も重要なことは、構成ファイルに表示されるパスは、ホストへのパスではなく、コンテナ内の環境へのパスであるということです。各コンテナには、これらのミニチュア システムである実行環境があります。パスはすべてコンテナ内のパスです。コンテナー内でマウントして通信することでファイルを同期できます。コマンド ラインでコンテナーを起動するには、このステップを解決するために docker-compose も使用します。

設定ファイルの例を次に示します:

server {
listen 80 default;
index index.html index.htm;
server_name localhost docker;
root /data/www;
index index.php index.html index.htm;
location / {
 try_files $uri $uri/ /index.html;
}
location ~ \.php {
 include fastcgi_params;
 fastcgi_pass php-fpm:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /data/www/$fastcgi_script_name;
}
}

而root /data/www中,/data/www路径,是到时候Nginx容器的路径,而不是当前在操作的宿主机的路径,所以到时候我们要挂载Web程序放的位置到这个路径。

2.4 编写 docker-compose.yml

在PHP、Nginx等目录的同级,我们创建一个docker-compose.yml,我们在执行docker-compose相关命令时,会自动找到这个文件,并根据里面的内容来执行。

接上面Nginx的例子,我们先谈挂载,因为这是最重要的一步。在docker-compose.yml中,Nginx的部分:

build: ./nginx
depends_on:
 - php-fpm
links:
 - php-fpm:php-fpm
volumes:
 - ../app:/data/www:rw
 - ./nginx/conf.d:/etc/nginx/conf.d:ro
 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
 - ../logs/nginx:/var/log/nginx
ports:
 - "80:80"
 - "8080:8080"
 - "443:443"
restart: always
command: nginx -g 'daemon off;'

有一个volumes参数,这里就是我们要挂载的目录的相关配置,第一条我们将../app挂载到/data/www之中,也是我们配置文件中定义的默认监听的root,而APP目录是我们宿主机中的一个目录,通过这样挂载我们可以直接将我们的项目文件放到APP中,Docker会帮你传输到容器内的/data/www目录下。

其它的参数:

build定义了你的Dockerfile在哪里,如果没有写Dockerfile可以不用build,可以用images参数定义官方镜像,比如image:mysql:5.7;
depends_on表示将依赖其它镜像,比如Nginx依赖php-fpm,没有它我Nginx没法玩;
links定义连接,比如要连接到php-fpm容器,就是php-fpm:php-fpm,后面是别名;
ports表示端口映射,80:80表示将80端口映射到宿主机的80端口;
restart重启,restart: always表示将自动重启;
command是自动执行的命令;
……
参数很多,更多的可以参考官方文档。

下面是一个完整的 docker-compose.yml 文件:

version: '3.2'
services:
php-fpm:
build: ./php/
ports:
 - "9000:9000"
links:
 - mysql-db:mysql-db
 - redis-db:redis-db
volumes:
 - ../app:/data/www:rw
 - ./php/php-dev.ini:/usr/local/etc/php/php.ini:ro
 - ./php/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
 - ../logs/php-fpm:/var/log/php-fpm:rw
restart: always
command: php-fpm
nginx:
build: ./nginx
depends_on:
 - php-fpm
links:
 - php-fpm:php-fpm
volumes:
 - ../app:/data/www:rw
 - ./nginx/conf.d:/etc/nginx/conf.d:ro
 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
 - ../logs/nginx:/var/log/nginx
ports:
 - "80:80"
 - "8080:8080"
 - "443:443"
restart: always
command: nginx -g 'daemon off;'
mysql-db:
 build: ./mysql
 ports:
 - "3306:3306"
 volumes:
 - ../data/mysql:/var/lib/mysql:rw
 - ../logs/mysql:/var/lib/mysql-logs:rw
 - ./mysql/conf.d:/etc/mysql/conf.d:ro
 environment:
 MYSQL_ROOT_PASSWORD: 123456
 MYSQL_DATABASE: zphaldb
 MYSQL_USER: zphal
 MYSQL_PASSWORD: zphal123
 restart: always
 command: "--character-set-server=utf8"
redis-db:
 build: ./redis
 ports:
 - "6379:6379"
 volumes:
 - ../data/redis:/data
 restart: always

3. 使用

这一套编写下来,我们怎么用呢?

3.1 使用搭建好的环境

首先,进入项目Dockerfiles的目录下,这里是files目录:

cd zPhal-dockerfiles/files

wget https://pecl.php.net/get/redis-3.1.6.tgz -O php/pkg/redis.tgz

wget https://codeload.github.com/phalcon/cphalcon/tar.gz/v3.3.1 -O php/pkg/cphalcon.tar.gz
然后下载我们会用到的PHP拓展包。

执行命令:

docker-compose up
Docker会自动通过编写好的docker-compose.yml内容构建镜像,并且启动容器。

如果没问题,下次启动时可以以守护模式启用,所有容器将后台运行:

docker-compose up -d
关闭容器:

可以这样关闭容器并删除服务:

docker-compose down
使用 docker-compose 基本上就这么简单,用stop,start等这些命令来操纵容器服务。而更多的工作是在于编写Dockerfile和docker-compose.yml文件。

3.2 使用Composer

当我们要使用Composer时怎么做呢? 我们已经在php-fpm里安装了Composer。

用docker-compose进行操作:

docker-compose run --rm -w /data/www/zPhal php-fpm composer update
-w /data/www/zPhal为在php-fpm的工作区域,zPhal项目也是挂载在里面,所有我们可以直接在容器里运行Composer。

或者进入宿主机APP目录下用Docker命令:

cd zPhal-dockerfiles/app

docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php自定义二维数组排序函数array

PHP服务器端的API以及接口开发详解

以上がDockerでPHP開発環境を構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。