1. 介紹
1.1 介紹
前面福哥已經教給大家使用php:7.4-apache-buster基礎鏡像搭建PHP運作環境了,這個是以子產品方式(Module)運作PHP程式的,相比較這種方式更多人會選擇主流的以FastCGI方式運作PHP程式,以FastCGI方式運作PHP程式就要用到PHP的FPM服務(FastCGI Process Manager)了。
今天福哥就帶着大家使用php:7.4-fpm-buster基礎鏡像來搭建以FastCGI方式運作PHP程式的環境。
1.2 環境
鏡像版本 | php:7.4-fpm-buster |
作業系統 | CentOS 7 x86_64 2003 |
伺服器 | TFCentOS7x64 |
IP | 192.168.168.68 |
2. 安裝
2.1 Dockerfile
2.1.1 基礎鏡像
福哥選擇的是php:7.4-fpm-buster這個基礎鏡像,這個就是FastCGI方式的。
https://hub.docker.com/_/php/tags?page=1&name=7.4-fpm-buster
2.1.2 維護者資訊
這是福哥寫的維護者資訊。
# for MAINTAINER
MAINTAINER Author: Andy Bogate
MAINTAINER Email: [email protected]
MAINTAINER Home page: https://tongfu.net
MAINTAINER Datetime: 2023/03/18
MAINTAINER Version: v1.0
2.1.3 暴露端口
提供服務的端口通常情況下是80和443,我們把它們暴露出來。
# for EXPOSE
EXPOSE 80 443
2.1.4 主目錄
福哥設定鏡像的主目錄是/tongfu.net/web。
# for WORKDIR
WORKDIR /tongfu.net/web
2.1.5 安裝工具
後面的制作過程需要用到wget工具,這個需要通過apt-get安裝一下。
因為鏡像本身隻有一個FPM服務,是以這個Nginx服務我們得通過apt-get安裝。
因為後面要是ps指令檢測服務健康狀态,是以還需要安裝procps服務。
# install wget
RUN apt-get update \
&& apt-get -y install wget vim nginx procps
RUN apt-get -y install libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
RUN apt-get -y install libzip-dev
RUN apt-get -y install libc-client-dev libkrb5-dev
RUN apt-get -y install libxml2-dev
2.1.6 釋放PHP源碼
這個php:7.4-fpm-buster包含了PHP的源碼,因為後面需要使用PHP源碼安裝PHP擴充,是以先要釋放PHP源碼。
# extract PHP source
RUN docker-php-source extract
2.1.7 GD圖形庫擴充
GD圖形庫可以讓我們通過PHP直接加工各種圖檔檔案,這個庫可以用來實作圖檔驗證碼、照片加工等等功能的。
# gd extension
RUN docker-php-ext-configure gd \
--with-jpeg=/usr/include \
--with-freetype=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-enable gd
2.1.8 MySQL擴充
福哥是使用PDO來連接配接MySQL資料庫,而MySQL的PDO庫PHP資源包裡包含了,隻要安裝起來就行了。
# extension of mysqli for MySQL
RUN docker-php-ext-install mysqli \
&& docker-php-ext-enable mysqli
# extension of PDO for MySQL
RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-enable pdo_mysql
2.1.9 Memcached擴充
memcached庫需要從PECL下載下傳,福哥選擇的是3.1.5版本,這裡直接通過phpize編譯後就可以通過make安裝了。memcached庫依賴libmemcached庫,福哥選擇的是1.0.18版本,盡量不要改避免版本沖突~
# extension of Memcached
RUN wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz \
&& wget http://pecl.php.net/get/memcached-3.1.5.tgz \
&& tar -xzvf libmemcached-1.0.18.tar.gz \
&& cd libmemcached-1.0.18 \
&& sed -i 's/opt_servers \=\= false/\!opt_servers/g' clients/memflush.cc \
&& ./configure \
&& make && make install \
&& cd ../ \
&& rm -f libmemcached-1.0.18.tar.gz \
&& rm -rf libmemcached-1.0.18 \
&& tar -xzvf memcached-3.1.5.tgz \
&& cd memcached-3.1.5 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
--disable-memcached-sasl \
&& make && make install \
&& cd ../ \
&& rm -f memcached-3.1.5.tgz \
&& rm -rf memcached-3.1.5 \
&& docker-php-ext-enable memcached
2.1.10 Redis擴充
redis庫需要從PECL下載下傳,福哥選擇的是4.1.0版本,這裡直接通過phpize編譯後就可以通過make安裝了。
# extension of Redis
RUN wget http://pecl.php.net/get/redis-4.1.0.tgz \
&& tar -xzvf redis-4.1.0.tgz \
&& cd redis-4.1.0 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& docker-php-ext-enable redis \
&& cd ../ \
&& rm -f redis-4.1.0.tgz \
&& rm -rf redis-4.1.0
2.1.11 MongoDB擴充
MongoDB庫需要從PECL下載下傳,福哥選擇的是1.7.4版本,這裡直接通過phpize編譯後就可以通過make安裝了。
# extension of MongoDB
RUN wget http://pecl.php.net/get/mongodb-1.7.4.tgz \
&& tar -xzvf mongodb-1.7.4.tgz \
&& cd mongodb-1.7.4 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& docker-php-ext-enable mongodb \
&& cd ../ \
&& rm -f mongodb-1.7.4.tgz \
&& rm -rf mongodb-1.7.4
2.1.12 其他擴充
除了前面安裝的幾個擴充之外,福哥還安裝了imap、zlib、soap、bcmath這些擴充,建議大家也把這些安裝上。
# imap extension
RUN docker-php-ext-configure imap \
--with-kerberos \
--with-imap-ssl \
&& docker-php-ext-install imap \
&& docker-php-ext-enable imap
# zlib extension
RUN mv /usr/src/php/ext/zlib/config0.m4 /usr/src/php/ext/zlib/config.m4 \
&& docker-php-ext-install zlib \
&& docker-php-ext-enable zlib
# soap extension
RUN docker-php-ext-install soap \
&& docker-php-ext-enable soap
# bcmath extension
RUN docker-php-ext-install bcmath \
&& docker-php-ext-enable bcmath
2.1.13 清理PHP源碼
現在PHP的擴充都按照好了,已經不需要源碼了,清理掉吧。
# source delete
RUN docker-php-source delete
2.2 多程序
福哥今天制作的鏡像是基于FastCGI方式運作的,這裡面有Nginx和FPM兩個服務,也就是說使用這個鏡像啟動的容器裡面就會運作兩個程序。但是按照Docker的設計思想一個容器裡隻能跑一個程序,怎麼辦?
其實按PHP的FastCGI方式的設計,應該是啟動兩個容器共同處理使用者的請求。靜态内容由Nginx容器負責處理,PHP程式由FPM容器負責處理。
但是福哥不想弄那麼麻煩,就想把Nginx服務和FPM服務放在一起!要實作這個目的,就需要修改鏡像的ENTRYPOINT,一個ENTRYPOINT隻能運作一個程序。為了解決這個問題,福哥要自定義這個ENTRYPOINT,用ENTRYPOINT啟動一個Shell腳本,在Shell腳本裡面同時啟動Nginx和FPM服務。
下面是福哥寫的一個ENTRYPOINT啟動Shell腳本start_service,用來同時啟動Nginx和FPM服務。
#!/bin/sh
# argv
# functions
function _main
{
# start fpm
/usr/local/sbin/php-fpm -D
# start nginx
/usr/sbin/nginx
# wait secs
sleep 6s
# service
while [ 1 ] ;
do
if [ "" = "`ps -ef | grep -v grep | grep 'php-fpm: master process'`" ] ; then
echo "php is down"
exit 1
fi
if [ "" = "`ps -ef | grep -v grep | grep 'nginx: master process'`" ] ; then
echo "nginx is down"
exit 2
fi
sleep 6s
done
}
# main
_main "$@"
在建立新的鏡像的時候把start_service配置檔案拷貝進去,并且授權可執行權限,最後将ENTRYPOINT的指令改成start_service。
# entry point
COPY start_service /usr/sbin/start_service
RUN chmod +x /usr/sbin/start_service
ENTRYPOINT ["/usr/sbin/start_service", ""]
2.3 php配置檔案
2.3.1 php.ini
php.ini的存放目錄是/usr/local/etc/php/,鏡像提供了php-ini-development、php.ini-production兩個配置檔案模闆,我們可以根據使用場景選擇開發版本還是生産版本。
2.4 nginx配置檔案
2.4.1 子產品配置
鏡像安裝的nginx包括modules-available和modules-enabled兩個子產品配置目錄,modules-available裡面包含全部的可用子產品配置檔案,modules-enabled裡面是啟用的子產品配置檔案。
要啟用子產品就從modules-available選擇子產品配置檔案移動到modules-enabled下面。
要停用子產品就從modules-enabled選擇子產品配置檔案移動回modules-available下面。
2.4.2 站點配置
鏡像安裝的nginx包括sites-available和sites-enabled兩個站點配置目錄,sites-available裡面包含全部的可用站點配置檔案,sites-enabled裡面是啟用的站點配置檔案。
要啟用站點就從sites-available選擇站點配置檔案建立符号連結到sites-enabled下面。
要停用站點就将sites-enabled下面删除站點配置檔案的符号連結。
福哥在預設站點的server裡面利用rewrite實作了一個PHP的僞靜态重定向配置,可以将各種html請求轉交給htmlRouteMap.php處理。
如果要修改配置檔案就需要先啟動一個容器,然後把需要修改的配置檔案複制出來一份,在外面改好了在通過COPY指令導入進去。
下面是福哥修改過的預設站點default配置檔案的内容,因為預設檔案裡面有大篇幅說明太長了,福哥就給去掉了。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
rewrite ^\/(.*)\.html /htmlRouteMap.php?tfphp_static_name=$1;
location / {
root /var/www/html;
}
location ~ \.phpnbsp;{
client_body_buffer_size 1m;
root /var/www/html;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
在建立新的鏡像的時候把default配置檔案拷貝進去。
# nginx sites
COPY default /etc/nginx/sites-enabled/default
2.5 建立鏡像
使用下面的指令建立tfphp:7.4-nginx-1.0.0鏡像。
docker build -f Dockerfile \
-t registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0 ./
2.6 檢視鏡像
看看新的鏡像,現在有apache版本、nginx版本兩個tfphp的鏡像了。
docker images | grep tfphp
3. 測試
3.1 主控端程式目錄
在主控端建立一個用來存放php程式的目錄,它将被映射到容器的nginx主目錄上面。
mkdir -p /tongfu.net/data/docker/data/tfphp/html/
3.2 主控端程式檔案
在剛剛建立的目錄下面建立一個php程式檔案index.php,寫入下面的代碼。
<?php
phpinfo();
再建立一個php程式檔案htmlRouteMap.php,寫入下面的代碼。
<?php
var_dump($_GET['tfphp_static_name']. ".html");
3.3 删除容器
因為前面我們使用apache版本的tfphp啟動了一個容器了,現在要測試nginx版本的tfphp就需要先把這個tfphp容器删除掉。
docker rm -f tfphp
3.4 啟動容器
使用下面的指令基于tfphp:7.4-nginx-1.0.0鏡像啟動一個容器,将80端口和443端口映射到主控端上面,将/var/www/html這個nginx主目錄映射到前面建立的目錄上面。
docker run -tid \
--name tfphp \
-h tfphp \
-p 80:80 \
-p 443:443 \
-v /tongfu.net/data/docker/data/tfphp/html:/var/www/html \
registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0
3.5 浏覽器通路
打開浏覽器通路http://192.168.168.68/index.php,可以看到PHP系統資訊。
可以看到Server API一欄的資訊是FPM/FastCGI,證明我們的這個運作環境是FastCGI模式的。
輸入網址http://192.168.168.68/tongfu.net/docker/tfphp.html,可以看到請求html資源路徑被htmlRouteMap.php列印出來了。
4. 總結
今天福哥在TFCentOS7x64伺服器上面通過Dockerfile建立了一個鏡像tfphp:7.4-nginx-1.0.0,并且通過這個新建立的鏡像tfphp:7.4-nginx-1.0.0啟動了一個容器,這個鏡像用來運作基于PHP語言開發的應用程式。
後面福哥會在這個鏡像tfphp:7.4-nginx-1.0.0基礎之上進行二次擴充制作新的鏡像,然後根據鏡像的用途針對nginx和php進行自定義的配置,敬請期待~
https://m.tongfu.net/home/35/blog/513983.html