Heim >Backend-Entwicklung >PHP-Tutorial >Erstellen Sie eine PHP-Entwicklungsumgebung in Docker

Erstellen Sie eine PHP-Entwicklungsumgebung in Docker

php中世界最好的语言
php中世界最好的语言Original
2018-03-24 15:45:194112Durchsuche

Dieses Mal werde ich Ihnen zeigen, wie Sie eine PHP-Entwicklungsumgebung in Docker erstellen. Was sind die Vorsichtsmaßnahmen beim Erstellen einer PHP-Entwicklungsumgebung in Docker?

1. Einführung

1.1 Warum Docker verwenden?

Gibt es ein Szenario, in dem Sie ein Projekt haben und eine Umgebung einrichten müssen, wenn Sie es lokal entwickeln, und Sie müssen auch eine Umgebung einrichten, wenn Sie es online stellen, wenn Sie zum Unternehmen gehen? und im Verborgenen herumspielen möchten, müssen Sie eine Umgebung einrichten, aber das funktioniert noch nicht, da Sie ziemlich viele Umgebungsabhängigkeiten haben. Wenn Sie zu diesem Zeitpunkt über Docker verfügen, müssen Sie Docker nur auf dem Computer installieren, die geschriebene Docker-Datei ablegen und eine Befehlszeile wird die Aufgabe automatisch abschließen , was praktisch und effizient ist großartig sein?

1.2 Vorbereitung

Als nächstes stellt dieser Artikel vor, wie man eine PHP-Entwicklungsumgebung erstellt, am Beispiel von zPhal-Dockerfiles. Dies ist eine Reihe von Dockerfiles, die ich für mein Blogsystem vorbereitet habe.

Ob Windows, Mac oder Linux, Docker kann es sehr gut unterstützen, auch unter Windows 10-Systemen ist Docker für Windows eigentlich recht gut, verbraucht aber mehr Speicher.

Über die Docker-Befehlszeile können wir viele Dinge tun, Bilder abrufen, Container ausführen, Befehle innerhalb des Containers ausführen usw., aber jetzt müssen wir eine einfachere und grobere Schreibweise verwenden Dockerfiles und dann Docker -compose verwenden, um diese Dateien zu verwalten und den Betriebsprozess zu vereinfachen.

Was ist eine Docker-Datei?

Dockerfile ist ein Skript, das aus einer Reihe von Befehlen und Parametern besteht. Diese Befehle werden auf das gezogene Basis-Image angewendet und schließlich können wir über Dockerfile ein neues Image erstellen, das die von Ihnen benötigte Software enthält Die Installation, die Sie installieren möchten, entspricht dem Anpassen der zu installierenden Erweiterungen, der auszuführenden Befehle usw. und der anschließenden Ausführung mit einem Klick, was den Vorgang erheblich vereinfacht.

Um eine Umgebung gemäß diesem Artikel zu erstellen, benötigen Sie:

Zuerst müssen Sie Docker und einige grundlegende Operationen von Docker verstehen und wissen, was Docker-Compose ist.
Docker und Docker-Compose müssen dann installiert werden. Ich werde Docker-Compose verwenden, um meine Docker-Dateien zu verwalten.
Beachten Sie, dass das Schreiben einer Docker-Datei eine lebendige und keine tote Sache ist. Die von jedem geschriebene Docker-Datei ist je nach Ihren Anforderungen unterschiedlich.

Die offizielle Dokumentation von Docker ist zwar auf Englisch, enthält aber grundsätzlich alles. Wenn Sie Fragen haben, ist es sehr ratsam, sich auf das Dokument zu beziehen: Docker-Dokumentation.

2. Beginnen Sie mit dem Schreiben

Im Folgenden werden zPhal-Docker-Dateien als Beispiel verwendet. Sie können auf den Link klicken, um die vollständige Datei anzuzeigen.

2.1 Vorschau

Schauen wir uns zunächst das von mir erstellte Dockerfile-Projekt an. Ich habe es grob in die folgenden Verzeichnisse unterteilt (dies wird natürlich von mir selbst festgelegt und ist es auch). muss für Sie nicht auf diese Weise formatiert werden):

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 diesem Projekt habe ich PHP-, MySQL-, Nginx-, Redis-, Composer-, Phalcon-Erweiterungen usw. verwendet.

Im Allgemeinen haben wir drei Prozesse, um dies zu tun: Schreiben Sie die Docker-Datei jeder Software; schreiben Sie die Konfigurationsdatei; verarbeiten Sie alle Docker-Dateien über Docker-Compose, einschließlich der Konfiguration in das Image geworfen, das die Docker-Datei erstellen wird.

2.2 Docker-Datei schreiben

2.2.1 PHP

Das Folgende ist die Docker-Datei von PHP:

FROM php:7.2-fpm

MAINTAINER goozp "gzp@goozp.com"
Zeitzone einstellen

ENV TZ=Asien/Shanghai

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

Abhängigkeitspakete und PHP-Kernerweiterungen aktualisieren und installieren

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/*

Kopieren Sie das vorab heruntergeladene Erweiterungspaket vom Hostcomputer

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

PECL-Erweiterung installieren, hier installieren wir Redis

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

Erweiterungen von Drittanbietern installieren, hier ist die Phalcon-Erweiterung

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 installieren

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

Die erste Zeile definiert hier das Basis-Image Wir verwenden die FPM-Version von PHP 7.2. In der zweiten Zeile wird hier ein Betreuer definiert.

Als nächstes wird dieser Satz in jeder Docker-Datei definiert, hauptsächlich um die Zeit aller Container mit dem Host zu synchronisieren. Tatsächlich können wir ihn so in der Datei docker-composer.yml definieren 🎜 >

Dienste:

php-fpm:

Volumes:

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

Aber in nicht- Linux-Systeme können beispielsweise unter Windows nicht auf /etc/localtime zugreifen. Um die Kompatibilität mit allen Plattformen zu erhöhen, habe ich die Zeitsynchronisierung in die Docker-Datei geschrieben.

Als nächstes installieren Sie einige Erweiterungen. Tatsächlich ist der Prozess der Installation von Erweiterungen ähnlich wie die Installation von PHP-Erweiterungen in Linux mit bloßen Händen. Ich habe Composer direkt im PHP-FPM-Image installiert. Das Herunterladen des Composer-Images zur Ausführung kann ebenfalls erfolgen, da wir Composer nur zum Ausführen des Composer-Befehls zum Verwalten unserer Pakete verwenden. Wenn es sich bei Composer um einen separaten Container handelt, können wir den Container ausschalten, wenn er nicht verwendet wird. Hier habe ich Composer jedoch direkt im PHP-FPM-Image installiert, hauptsächlich weil mein Projekt einige PHP-Erweiterungen installiert hat und Composer.json geschrieben hat Beim Schreiben der Datei habe ich die Abhängigkeiten der Erweiterung definiert, sodass beim Ausführen von Composer überprüft wird, ob die Umgebung diese Abhängigkeiten installiert hat. Wenn ich also das Composer-Image direkt verwende, muss ich auch die von mir verwendete Erweiterung installieren Das Bild ist viel problematischer, also habe ich es direkt im PHP-Bild gemacht. Es gibt eigentlich keinen Unterschied, es hängt davon ab, wie Sie es verwenden.

2.2.2 Nginx

Das Folgende ist die Docker-Datei von Nginx:

FROM nginx:1.12

timezome einstellen

ENV TZ=Asia/ Shanghai

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

Das ist viel einfacher, ich stelle nur eine Zeit ein . Da ich nichts weiter installieren muss, kann ich direkt das offizielle Image verwenden.

Natürlich müssen wir die Konfigurationsdatei vorab ändern. Fügen Sie schließlich die Konfigurationsdatei in die Datei docker-compose.yml ein. Dies wird weiter unten besprochen Konfigurationsdatei von PHP und MySQL. Die Konfigurationsdateien sind alle gleich.

2.2.3 MySQL

Das Folgende ist die Docker-Datei von MySQL:

FROM mysql:5.7

set timezome

ENV TZ =Asien /Shanghai

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

MySQL ist nichts Besonderes Entweder verwenden Sie direkt das offizielle Bild.

2.2.4 Redis

Das Folgende ist Redis, und das offizielle Bild wird auch direkt verwendet:

VON redis:3.2

timezome einstellen

ENV TZ=Asien/Shanghai

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

2.3 Konfigurationsdateien schreiben

Wie werden Konfigurationsdateien kategorisiert, die im PHP-Verzeichnis abgelegt werden, und Nginx-Konfigurationsdateien werden im Nginx-Verzeichnis abgelegt? Eine neue Unterdatei Der Ordner hängt von der Situation ab, z. B. dem Ordner conf.d.

Im Folgenden wird die Nginx-Konfigurationsdatei als Beispiel genommen. Das Nginx-Verzeichnis lautet zunächst wie folgt:

nginx/

conf.d/

default.conf

>

zphal.conf

Dockerfile

nginx.conf

Zusätzlich zu nginx.conf gibt es auch einen Unterordner conf.d zum Speichern aller Domänennamen. Konfigurationsdateien sollten denen bekannt sein, die eine PHP-Umgebung unter Linux erstellt haben. Bei diesen Konfigurationsdateien handelt es sich um die Dateien, die wir zu diesem Zeitpunkt in den Container übertragen. Wir werden diese Dateien nicht auf dem Host verwenden.

Das Wichtigste ist also, dass der Pfad, der in der Konfigurationsdatei angezeigt wird, der Pfad zur Umgebung im Container ist, nicht der Pfad zum Host. Jeder Container verfügt über eine laufende Umgebung micro Bei kleinen Systemen sind diese Pfade alle Pfade innerhalb des Containers. Wir können Dateien synchronisieren, indem wir den Container über die Befehlszeile mounten. Jetzt verwenden wir auch Docker-Compose, um diesen Schritt zu lösen.

Hier ist eine Beispielkonfigurationsdatei:

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以及接口开发详解

Das obige ist der detaillierte Inhalt vonErstellen Sie eine PHP-Entwicklungsumgebung in Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn