前面介绍了把nginx和php整合到一起构成微服务的一个统一镜像,并在dockerfile中打包源代码实现一个可以直接部署运行的镜像,但在企业中这样的镜像毫无价值,因为该php不包含正常企业运行所需的绝大部分的扩展。

        本教程以笔者公司使用的 yaf+yar 的组合进行mvc分离和微服务调用,同时给php安装企业正常运行的基础扩展,包括 mysql、redis、memcached、kafka 以及php包管理器 composer

安装mysql

docker-php-ext-install pdo_mysql

安装redis

RUN printf "no\nno\nno\n" | pecl install redis-5.0.2 \
&& docker-php-ext-enable redis

安装memcached

先按照常规流程安装,遇到问题就去解决

printf "no\nno\nno\nno\nno\nno\nno\nno\nno\n" | pecl install memcached-3.1.4 \
&& docker-php-ext-enable memcached

第一次执行遇到报错

checking for zlib location... configure: error: memcached support requires ZLIB

于是安装zlib-dev,debian系统下安装方式为

apt install -y zlib1g.dev

第二次执行遇到报错

checking for libmemcached location... configure: error: memcached support requires libmemcached

需要安装libmemcached,debian系统下安装方式为

apt install -y libmemcached-dev

安装rdkafka

先按照常规流程安装,遇到问题就去解决

printf "autodetect\n" | pecl install rdkafka \
&& docker-php-ext-enable rdkafka

遇到报错

checking for librdkafka/rdkafka.h in default path... not found

需要先安装librdkafka,debian系统安装方式如下

apt install -y librdkafka-dev

安装yaf

RUN pecl install yaf-3.0.8

配置文件 docker-php-ext-yaf.ini,yaf配债文件从环境变量中获得当前环境变量

extension=yaf
yaf.environ = ${APP_ENV}
yaf.use_namespace = Off
yaf.use_spl_autoload = On

加载yaf配置文件 

ADD conf/docker-php-ext-yaf.ini /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini

安装yar

正常安装流程

printf "no\n" | pecl install yar \
&& docker-php-ext-enable yar

遇到报错

configure: error: Please reinstall the libcurl distribution - easy.h should be in

 需要安装libcurl,debian系统安装方式为

apt install -y libcurl4-openssl-dev

配置文件 docker-php-ext-yar.ini

extension = yar
yar.debug = off
yar.allow_persistent = Off
yar.connect_timeout = 1500
yar.content_type = application/octet-stream 
yar.expose_info = On
yar.packager = php
yar.timeout = 5000
yar.transport = curl

安装hprose

pecl install hprose-1.6.8 \
    && docker-php-ext-enable hprose

安装composer

这个是按照composer官网教程的方式安装的

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && chmod +x composer.phar \
    && mv composer.phar /usr/local/bin/composer

由于composer下载的依赖包有可能是企业内部需要校验才能下载的资源,需要在镜像中内置ssh key,才能在打包镜像的时候顺利下载,另外需要安装git zip unzip才能下载composer的依赖包

ssh文件夹中包含私钥、公钥以及known_hosts文件

RUN apt install -y git zip unzip
COPY ssh/* /root/.ssh/
RUN chmod 600 /root/.ssh/id_rsa && echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
RUN git config --global user.email "testbuild@mustafa.com" && git config --global user.name "testbuild"

清理安装缓存

rm -rf /var/cache/apt && docker-php-source delete && rm -rf /tmp

最后,总结一下,我们上文的Dockerfile被修改为,中间那一段就是我们今天加的

FROM php:7.2-fpm

# 设置时区使用北京时间
ENV TZ=Asia/Shanghai
ENV APP_ENV=local
 
# 替换debian国内源,便于快速安装nginx
COPY sources.list /etc/apt/sources.list
 
# 安装nginx,删除配置文件中的 /etc/nginx/sites-enabled 目录
RUN apt update \
    && apt install -y nginx \
    && rm -rf /etc/nginx/sites-enabled

# 安装mysql
RUN docker-php-ext-install pdo_mysql

# 安装redis
RUN printf "no\nno\nno\n" | pecl install redis-5.0.2 \
&& docker-php-ext-enable redis

# 安装memcached
RUN apt install -y zlib1g.dev libmemcached-dev \
    && printf "no\nno\nno\nno\nno\nno\nno\nno\nno\n" | pecl install memcached-3.1.4 \
    && docker-php-ext-enable memcached

# 安装rdkafka
RUN apt install -y librdkafka-dev \
    && printf "autodetect\n" | pecl install rdkafka \
    && docker-php-ext-enable rdkafka

# 安装yaf
RUN pecl install yaf-3.0.8
ADD conf/docker-php-ext-yaf.ini /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini

# 安装composer
RUN php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && chmod +x composer.phar \
    && mv composer.phar /usr/local/bin/composer

# 添加ssh key 方便下载内网composer
RUN apt install -y git zip unzip
COPY ssh/* /root/.ssh/
RUN chmod 600 /root/.ssh/id_rsa && echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
RUN git config --global user.email "testbuild@mustafa.com" && git config --global user.name "testbuild"

# 清理缓存
RUN rm -rf /var/cache/apt && docker-php-source delete && rm -rf /tmp/*

# 拷贝nginx配置文件
ADD conf/default.conf /etc/nginx/conf.d/default.conf

RUN rm -rf /usr/local/etc/php-fpm.d/docker.conf /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/zz-docker.conf

# 拷贝php-fpm配置文件
ADD conf/php-fpm.conf /usr/local/etc/php-fpm.conf
ADD conf/www.conf /usr/local/etc/php-fpm.d/www.conf
 
# 设置工作目录
WORKDIR /src

# 拷贝项目源文件,打包镜像
ADD www ./
 
# 注意点:文件权限必须是 www-data 组,nginx和php-fpm才有权限访问
RUN chown -R www-data:www-data ./
 
# 执行容器启动后的命令
ADD entry.sh /
CMD ["/entry.sh"]

编译、运行,看效果

docker build -t php-fpm:test . \
&& docker run -p 8083:80 -d php-fpm:test

 相关链接

手把手教你部署nginx+php

php和nginx镜像合并 && 代码打包到镜像 

nginx-php镜像安装常用软件 

yaf && yar微服务/hprose微服务 镜像初始化 

常用开发工具:php_codesniffer代码规范检查&修复、phpstan语法检查、phpunit单元测试 

.gitlab-ci.yaml自动镜像打包&&互联网企业规范化上线流程(上) 

kustomize/kubectl自动镜像部署&&互联网企业规范化上线流程(下) 

apisix网关、JMeter压测  

prometheus/grafana监控数据收集与展示 

k8s容器网络性能调优 

supervisor进程管理 

安装opcache和apcu 

APM性能监测工具skywalking 

链路跟踪工具zipkin

phpfpm和nginx配置

php整合apollo配置中心

php rdkafka操作kafka消息队列

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐