概述
在学习了容器化、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放在这。
最后
最后一点也是我最想说的地方,中间过程错了好多次,每一个都很诡异,最后终于都克服了,看到这里的小伙伴加油呀,别放弃,一切会好,可以把这个做为基础,这些都是差不多的,原理都是一样的。git hub 地址