概述

在学习了容器化、docker和k8s的 Ingress-Nginx 、server 和pod 知识后,开启了 k8s的微服务实战第三篇,在搭建环境废了一点周折,这次实战的目的是集成在gitlab里,实现自动打包、发布的功能。

  • Mac M2芯 搭建k8s(minikube)超详细实战
  • Mac M2芯 搭建k8s(kubeadm)超详细实战

从构建一个任意版本的php-fpm开始

万事从头难,熟练的使用dockerfile,打包自己的镜像开始,不用太刻意,什么语言都是一样的,从你熟悉的编程语言就可以,我从熟悉的php语言开始。

# php历史版本
https://www.php.net/releases/
# wget
wget https://www.php.net/distributions/php-7.2.28.tar.gz

在之前的实践中,从零开始对php7进行源码编译,对之前的知识进行了系统的补充,php在k8s流行以后落伍的一部分原因就是扩展不方便,还有就是代码打包不方便,不了解的朋友请看我之前编写的关于PHP源码安装和生命周期,接下来我会对这部分进行补充。

开始之前,你先思考几个问题源码安装时怎么安装php的扩展?怎么安装pecl上找不到的老旧扩展?怎么把文件从宿主机安装到镜像里?

我使用的是php官方 releases php-7.2.28版本,制作的Dockerfile。

FROM centos:centos7

ENV PHP_VERSION php-7.2.28

WORKDIR /Package

COPY . .
  • FROM 继承基础镜像,优先级: 本地 > docker hub 仓库
  • ENV 声明 变量 ,再文件里使用
  • WORKDIR 创建工作目录,会自动创建
  • COPY 构建镜像的当前目录 拷贝到 WORKDIR

安装php编译所需要的依赖,下载PHP源码的安装版本,解压编译。

# 安装编译依赖
RUN yum -y update && yum -y install gcc gcc-c++ autoconf automake \
zlib zlib-devel openssl openssl-devel pcre pcre-devel \
libxml2 libxml2-devel sqlite-devel wget curl libtool \
 php-dev php-pear vim php-devel libcurl libcurl-devel
 
# 下载php版本 
RUN mkdir $HOME/Package/ && cd $HOME/Package/ \
&& wget https://www.php.net/distributions/${PHP_VERSION}.tar.gz \
&& tar -zxvf ${PHP_VERSION}.tar.gz

编译PHP,这个步骤很关键,最好是指定指定安装路径 和 扩展路径,后面安装扩展会用到。

RUN $HOME/Package/${PHP_VERSION}/configure --prefix=/usr/local/php7 \
 --with-php-config=/usr/local/php7/bin/php-config \
 --enable-fpm  \
 --enable-debug \
 --enable-opcache \
 --enable-zip \
 --enable-sockets \
 --with-pdo-mysql \
 --with-mysqli \
 --with-pear \
 --with-curl \
 --with-openssl && make && make install

编译成功后会显示以下信息,这都是当前版本的目录信息。

Installing shared extensions:     /usr/local/php7/lib/php/extensions/debug-non-zts-20190902/
Installing PHP CLI binary:        /usr/local/php7/bin/
Installing PHP CLI man page:      /usr/local/php7/php/man/man1/
Installing PHP FPM binary:        /usr/local/php7/sbin/
Installing PHP FPM defconfig:     /usr/local/php7/etc/
Installing PHP FPM man page:      /usr/local/php7/php/man/man8/
Installing PHP FPM status page:   /usr/local/php7/php/php/fpm/
Installing phpdbg binary:         /usr/local/php7/bin/
Installing phpdbg man page:       /usr/local/php7/php/man/man1/
Installing PHP CGI binary:        /usr/local/php7/bin/
Installing PHP CGI man page:      /usr/local/php7/php/man/man1/
Installing build environment:     /usr/local/php7/lib/php/build/
Installing header files:          /usr/local/php7/include/php/
Installing helper programs:       /usr/local/php7/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php7/php/man/man1/
  page: phpize.1
  page: php-config.1
/root/php-7.4.28/build/shtool install -c ext/phar/phar.phar /usr/local/php7/bin/phar.phar
ln -s -f phar.phar /usr/local/php7/bin/phar
Installing PDO headers:           /usr/local/php7/include/php/ext/pdo/

为php、php-fpm 命令建立软链接,需要和你安装时--prefix的目录保持一致,不然会发生错误。

RUN ln -s /usr/local/php7/bin/php /usr/local/bin/php && \
cp $HOME/Package/${PHP_VERSION}/php.ini-development /usr/local/php7/lib/php.ini


RUN ln -s /usr/local/php7/sbin/php-fpm /usr/local/sbin/php-fpm \ 
&& cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf \ 
&& cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

wget 安装php扩展,可以去pecl 官网去查看,太老的版本可能已经不存在了,需要你自己预先存起来,我以redis-4.2.0 和 yaf-3.0.7做例子,pear安装扩展官网

# redis-4.2.0  pecl wget 方式
RUN wget https://pecl.php.net/get/redis-4.2.0.tgz && \
tar -zxvf redis-4.2.0.tgz &&  cd redis-4.2.0 && phpize \
&&  ./configure --with-php-config=/usr/local/php7/bin/php-config \
&& make && make install && echo 'extension=redis.so' >> /usr/local/php7/lib/php.ini


# yaf yaf-3.0.7 https://pecl.php.net/get/yaf-3.0.7.tgz

RUN wget https://pecl.php.net/get/yaf-3.0.7.tgz && \
tar -zxvf yaf-3.0.7.tgz &&  cd yaf-3.0.7.tgz && phpize \
&&  ./configure --with-php-config=/usr/local/php7/bin/php-config \
&& make && make install && echo 'extension=yaf.so' >> /usr/local/php7/lib/php.ini

最后,编写启动脚本。

#设置启动脚本 
RUN  echo "php-fpm && tail -f /dev/null" > $HOME/run.sh 

CMD ["/bin/bash","sh $HOME/Package/run.sh"]

EXPOSE 9000

使用命令 docker build -t php-fpm:v2.0 -f centos7_phpfpm72 . 构建自己的镜像,最后把整体的Dockerfile放在这。

基于k8s的新的微服务架构 k8s php 微服务_php

最后

最后一点也是我最想说的地方,中间过程错了好多次,每一个都很诡异,最后终于都克服了,看到这里的小伙伴加油呀,别放弃,一切会好,可以把这个做为基础,这些都是差不多的,原理都是一样的。git hub 地址