nginx-php镜像安装常用软件 —— k8s从入门到高并发系列教程 (三)
以笔者公司使用的 yaf+yar 的组合进行mvc分离和微服务调用,同时给php安装企业正常运行的基础扩展,包括 mysql、redis、memcached、kafka 以及php包管理器 composer
前面介绍了把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
相关链接
常用开发工具:php_codesniffer代码规范检查&修复、phpstan语法检查、phpunit单元测试
.gitlab-ci.yaml自动镜像打包&&互联网企业规范化上线流程(上)
更多推荐
所有评论(0)