本文介紹如何制作PHP鏡像并部署到Serverless 應用引擎 SAE(Serverless App Engine)。
前提條件
開通阿里云容器鏡像ACR服務,個人版實例和企業版實例皆可。
背景信息
通常來說,您無需從空鏡像開始安裝PHP以及其他各種組件,而是可以通過dockerhub獲取PHP官方鏡像。官方的系統鏡像是Debian或Alpine(Alpine鏡像的體積小于Debian鏡像),其中已經包含PHP以及一些輔助命令。官方鏡像的版本命令規則如下:
php:8.0.12-cli-bullseye
:表示PHP版本為8.0.12,基于系統鏡像bullseye(Debian 11)進行構建。其中cli
表示未開啟CGI,即不能運行fpm
,只可運行命令行。php:7.3.32-fpm-alpine3.13
:表示PHP版本為7.3.32,基于系統鏡像alpine3.13進行構建。其中fpm
表示開啟了CGI,可用來運行Web服務,也可用來運行CLI命令。
步驟一:制作基礎鏡像
基礎鏡像里包含常用的擴展和配置,在后續每次構建時就無需重復執行這些步驟。
創建項目文件。
創建一個用于存放PHP資源的項目文件夾,命名為php。
在PHP文件夾下,創建一個用于存放基礎鏡像資源的項目文件夾,命名為base。
執行以下命令,進入項目目錄。
cd php/base
創建并編輯Dockerfile文件,文件內容如下:
FROM php:7.3.32-fpm-alpine3.13 LABEL MAINTAINER="sae@aliyun.com" ENV TZ "Asia/Shanghai" # 時區 RUN echo ${TZ} >/etc/timezone # 可選 # COPY composer.phar /usr/local/bin/composer # 創建www用戶 RUN addgroup -g 1000 -S www && adduser -s /sbin/nologin -S -D -u 1000 -G www www # 配置阿里云鏡像源,加快構建速度。 RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories # PHPIZE_DEPS包含gcc g++等編譯輔助類庫,完成后刪除;pecl安裝擴展。 RUN apk add --no-cache $PHPIZE_DEPS \ && apk add --no-cache libstdc++ libzip-dev vim\ && apk update \ && pecl install redis-5.3.0 \ && pecl install zip \ && pecl install swoole \ && docker-php-ext-enable redis zip swoole\ && apk del $PHPIZE_DEPS # docker-php-ext-install安裝擴展。 RUN apk update \ && apk add --no-cache nginx freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install -j$(nproc) pdo_mysql opcache bcmath mysqli # 在run.sh COPY run.sh /run.sh RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" && mkdir -p /run/nginx/ && chmod +x /run.sh ENTRYPOINT ["/run.sh"]
說明該鏡像文件同時采用pecl和docker-php-ext-install安裝擴展,二者差異如下:
pecl可以自動下載或者指定包安裝擴展,安裝完以后需要用docker-php-ext-enable啟用擴展。
docker-php-ext-install可以安裝的擴展有限,可以通過docker-php-ext-install help查詢可以安裝的擴展列表,安裝以后默認啟用。
可選:修改鏡像。
說明步驟1的基礎鏡像將Nginx和PHP配置在同一個鏡像內,同時啟動php-fpm和nginx,符合常見的虛擬機部署習慣,但并不滿足容器提倡的單進程管理模型。您可以考慮將php-fpm和nginx分別部署成兩個應用,只需要針對上述鏡像做少許修改即可。
創建并編輯run.sh文件,文件內容如下:
#!/usr/bin/env sh set -e php-fpm -D nginx -g 'daemon off;'
執行以下命令,構建鏡像。
docker build -t php-bash:v1 .
輸出示例如下:
Sending build context to Docker daemon 4.096kB Step 1/11 : FROM php:7.3.32-fpm-alpine3.13 ---> 2e127e9a**** ...... Step 11/11 : ENTRYPOINT ["/run.sh"] ---> Using cache ---> dfde0cef**** Successfully built dfde0cef**** Successfully tagged php-bash:v1
步驟二:制作業務鏡像
您可以按需對步驟一的鏡像進行部分修改,以此作為您企業內使用的基礎鏡像,則后續的業務鏡像都可以將其作為父鏡像。
在php項目目錄下,創建Dockerfile文件。
FROM php-bash:v1 # 把阿里云鏡像地址換成內網地址,不開公網就可以安裝各種軟件。 RUN sed -i "s/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g" /etc/apk/repositories && sed -i "s/https/http/g" /etc/apk/repositories # php-fpm配置 COPY www.conf /usr/local/etc/php-fpm.d/www.conf # Nginx配置 COPY default.conf /etc/nginx/http.d/ COPY index.php /var/www/html
創建并編輯www.conf文件,文件內容如下:
[www] user = www group = www listen = 0.0.0.0:9000 pm = dynamic pm.max_children = 100 pm.start_servers = 30 pm.min_spare_servers = 20 pm.max_spare_servers = 50
創建并編輯default.conf文件,文件內容如下:
server { listen 80; root /var/www/html; index index.html index.htm index.php; location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } access_log /tmp/nginx_access.log; error_log /tmp/nginx_error.log; }
創建并編輯index.php文件,文件內容如下:
<html> <head> <title>PHP Hello SAE!</title> </head> <body> <?php echo '<h1>Hello SAE</h1>'; ?> <?php phpinfo(); ?> </body> </html>
在容器鏡像服務控制臺創建兩個鏡像倉庫,分別命名為php-base和php-server。
個人版和企業版實例均適用本文的操作,本文以個人版實例為例。具體操作,請參見以下文檔:
個人版實例:構建倉庫與鏡像
企業版實例:使用企業版實例構建鏡像
構建并推送鏡像。
您可以在目標鏡像倉庫的基本信息頁面的鏡像指南頁簽查詢具體命令。更多信息,請參見以下文檔:
個人版實例:使用個人版實例推送拉取鏡像
企業版實例:使用企業版實例推送和拉取鏡像
執行以下命令,構建鏡像。
docker build -t php-server:v1 .
輸出示例如下:
Sending build context to Docker daemon 5.12kB Step 1/5 : FROM php-bash:v1 ---> dfde0cef**** ...... Step 5/5 : COPY index.php /var/www/html ---> Using cache ---> e2c25424**** Successfully built e2c25424**** Successfully tagged php-server:v1
執行以下命令,登錄遠端鏡像倉庫。
本步驟假設您使用的是阿里云ACR倉庫。
docker login --username=<鏡像倉庫登錄名> registry.<regionId>.aliyuncs.com
示例如下:
docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
在返回結果中輸入密碼,如果顯示
login succeeded
,則表示登錄成功。如何設置密碼,請參見設置鏡像倉庫登錄密碼。執行以下命令,給鏡像打標簽。
docker tag [ImageId] registry.<regionId>.aliyuncs.com/****/php-server:<鏡像版本號>
ImageId
:鏡像ID。registry.<regionId>.aliyuncs.com/****/php-server
:鏡像倉庫地址。
示例如下:
docker tag php-server:v1 registry.cn-hangzhou.aliyuncs.com/php/php-server:v1
執行以下命令,推送鏡像至個人版實例。
docker push registry.<regionId>.aliyuncs.com/php/php-server:<鏡像版本號>
示例如下:
docker push registry.cn-hangzhou.aliyuncs.com/php/php-server:v1
成功推送后,您可以登錄容器鏡像服務控制臺,在目標鏡像倉庫的鏡像版本頁面查看推送的版本。
步驟三:部署鏡像
創建PHP應用。
在應用部署配置配置向導頁面,技術棧語言需選擇PHP,應用部署方式需選擇鏡像。具體操作,請參見在SAE控制臺使用鏡像部署PHP應用。
說明除創建新應用外,您還可以修改現有應用的配置鏡像。具體操作,請參見升級應用。
為PHP應用綁定公網SLB。
選擇HTTP協議,并將HTTP端口設置為80,容器端口設置為80。具體操作,請參見為應用綁定CLB。
綁定完成后,您可以在應用訪問設置區域查看公網訪問地址。
結果驗證。
按照http://slbip:port/的格式,在瀏覽器地址欄輸入步驟2設置的公網地址并回車。結果如下:
更多信息
文檔 | 說明 |
如果您不想每次都通過手動方式構建、推送鏡像,并部署應用,可以對接開源的Jenkins或者阿里云云效。 | |
可以使用SAE提供的Demo鏡像部署PHP應用。 |