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
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?
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.
Im Folgenden werden zPhal-Docker-Dateien als Beispiel verwendet. Sie können auf den Link klicken, um die vollständige Datei anzuzeigen.
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.
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:roAber 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.
timezome einstellen
FROM mysql:5.7MySQL ist nichts Besonderes Entweder verwenden Sie direkt das offizielle Bild. 2.2.4 RedisDas Folgende ist Redis, und das offizielle Bild wird auch direkt verwendet:set timezome
ENV TZ =Asien /ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
VON redis:3.22.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.conftimezome einstellen
ENV TZ=Asien/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
>
zphal.confDockerfilenginx.confZusä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程序放的位置到这个路径。
在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
这一套编写下来,我们怎么用呢?
首先,进入项目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文件。
当我们要使用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中文网其它相关文章!
推荐阅读:
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!