• nginx-php镜像安装常用软件 —— k8s从入门到高并发系列教程 (三)


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

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

    安装mysql

    docker-php-ext-install pdo_mysql

    安装redis

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

    安装memcached

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

    1. printf "no\nno\nno\nno\nno\nno\nno\nno\nno\n" | pecl install memcached-3.1.4 \
    2. && 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

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

    1. printf "autodetect\n" | pecl install rdkafka \
    2. && 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配债文件从环境变量中获得当前环境变量

    1. extension=yaf
    2. yaf.environ = ${APP_ENV}
    3. yaf.use_namespace = Off
    4. 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

    正常安装流程

    1. printf "no\n" | pecl install yar \
    2. && 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

    1. extension = yar
    2. yar.debug = off
    3. yar.allow_persistent = Off
    4. yar.connect_timeout = 1500
    5. yar.content_type = application/octet-stream
    6. yar.expose_info = On
    7. yar.packager = php
    8. yar.timeout = 5000
    9. yar.transport = curl

    安装hprose

    1. pecl install hprose-1.6.8 \
    2. && docker-php-ext-enable hprose

    安装composer

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

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

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

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

    1. RUN apt install -y git zip unzip
    2. COPY ssh/* /root/.ssh/
    3. RUN chmod 600 /root/.ssh/id_rsa && echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    4. 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被修改为,中间那一段就是我们今天加的

    1. FROM php:7.2-fpm
    2. # 设置时区使用北京时间
    3. ENV TZ=Asia/Shanghai
    4. ENV APP_ENV=local
    5. # 替换debian国内源,便于快速安装nginx
    6. COPY sources.list /etc/apt/sources.list
    7. # 安装nginx,删除配置文件中的 /etc/nginx/sites-enabled 目录
    8. RUN apt update \
    9. && apt install -y nginx \
    10. && rm -rf /etc/nginx/sites-enabled
    11. # 安装mysql
    12. RUN docker-php-ext-install pdo_mysql
    13. # 安装redis
    14. RUN printf "no\nno\nno\n" | pecl install redis-5.0.2 \
    15. && docker-php-ext-enable redis
    16. # 安装memcached
    17. RUN apt install -y zlib1g.dev libmemcached-dev \
    18. && printf "no\nno\nno\nno\nno\nno\nno\nno\nno\n" | pecl install memcached-3.1.4 \
    19. && docker-php-ext-enable memcached
    20. # 安装rdkafka
    21. RUN apt install -y librdkafka-dev \
    22. && printf "autodetect\n" | pecl install rdkafka \
    23. && docker-php-ext-enable rdkafka
    24. # 安装yaf
    25. RUN pecl install yaf-3.0.8
    26. ADD conf/docker-php-ext-yaf.ini /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini
    27. # 安装composer
    28. RUN php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
    29. && php composer-setup.php \
    30. && php -r "unlink('composer-setup.php');" \
    31. && chmod +x composer.phar \
    32. && mv composer.phar /usr/local/bin/composer
    33. # 添加ssh key 方便下载内网composer
    34. RUN apt install -y git zip unzip
    35. COPY ssh/* /root/.ssh/
    36. RUN chmod 600 /root/.ssh/id_rsa && echo "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    37. RUN git config --global user.email "testbuild@mustafa.com" && git config --global user.name "testbuild"
    38. # 清理缓存
    39. RUN rm -rf /var/cache/apt && docker-php-source delete && rm -rf /tmp/*
    40. # 拷贝nginx配置文件
    41. ADD conf/default.conf /etc/nginx/conf.d/default.conf
    42. 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
    43. # 拷贝php-fpm配置文件
    44. ADD conf/php-fpm.conf /usr/local/etc/php-fpm.conf
    45. ADD conf/www.conf /usr/local/etc/php-fpm.d/www.conf
    46. # 设置工作目录
    47. WORKDIR /src
    48. # 拷贝项目源文件,打包镜像
    49. ADD www ./
    50. # 注意点:文件权限必须是 www-data 组,nginx和php-fpm才有权限访问
    51. RUN chown -R www-data:www-data ./
    52. # 执行容器启动后的命令
    53. ADD entry.sh /
    54. CMD ["/entry.sh"]

    编译、运行,看效果

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

  • 相关阅读:
    mysql 定时执行 查询动态表名插入汇总表的sql
    html文件使用postcss-pxtorem适配移动端 && 使用tailwindcss库
    Spring MVC中如何获取Request,Response对象方法呢?
    性能指标介绍
    julia笔记:函数
    封装一个antd的Table操作项中的一个展开与收起通用功能
    CV5200无线WiFi通信模组,远距离无线传输方案,助力无线视频传输通信
    python3基础知识复习 -- web开发入门
    怎么恢复删除的文件?靠它解决你的烦恼
    如何递归对比两个文件夹当中npy文件的内容
  • 原文地址:https://blog.csdn.net/fanghailiang2016/article/details/126533537