zoukankan      html  css  js  c++  java
  • 基于官方php:7.2.34-fpm-alpine镜像构建生产可用镜像

    1 了解官方php镜像

    Dockerhub 上 PHP 官方基础镜像主要分为三个分支:

    1. cli: 没有开启 CGI 也就是说不能运行fpm。只可以运行命令行。

    2. fpm: 开启了CGI,可以用来运行web服务也可以用来运行cli命令。

    3. zts: 开启了线程安全的版本。

    选择什么分支的镜像?

    一般在生成环境会使用到 php-fpm。先了解一下什么是php-fpm?

    • 由于nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端;

    • nginx 一般是把请求发fastcgi管理进程处理,fascgi管理进程选择 CGI 子进程处理结果并返回被 nginx ;

    • PHP-FPM 是一个PHP FastCGI管理器,旨在将FastCGI进程管理整合进PHP包中;

    • PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。

    所以,LNMP架构的一般会选择 fpm 分支的镜像。

    2 需求分析和镜像选择

    镜像选择

    首先是基础镜像版本的选择,我这里选择的是 php:7.2.34-fpm-alpine 镜像。php 版本为 7.2.34 (php版本需要结合具体业务代码进行选择),这个官方镜像基于alpine 镜像进行构建,alpine镜像体积非常小 ,大小只有5m左右。

    需求分析

    对于php应用来说,都需要自己额外安装一些扩展。官方基础镜像的扩展一般满足不我们的需求,所以需要看看官方镜像有哪些扩展,然后再按需安装我们要的扩展。

    查看官方基础镜像有什么扩展:

    [root@harbor harbor]# docker run  php:7.2.34-fpm-alpine  php -m
    [PHP Modules]
    Core
    ctype
    curl
    date
    dom
    fileinfo
    filter
    ftp
    hash
    iconv
    json
    libxml
    mbstring
    mysqlnd
    openssl
    pcre
    PDO
    pdo_sqlite
    Phar
    posix
    readline
    Reflection
    session
    SimpleXML
    sodium
    SPL
    sqlite3
    standard
    tokenizer
    xml
    xmlreader
    xmlwriter
    zlib
    
    [Zend Modules]
    

    安装经验,一般需要额外安装的扩展:

    • redis:redis是目前主流的Nosql数据库,常用。
    • zip:文件压缩扩展。
    • gd:图片处理扩展,一些图形验证码的生成不能没有这个扩展。
    • bcmath:没有这个库的话可能一些框架或者类库的composer依赖校验会无法通过。
    • pdo_mysql:连接数据库扩展。
    • opcache: 是 PHP 中的 Zend 扩展,可以大大提升 PHP 的性能。
    • swoole:一个PHP高级Web开发框架,可按需添加。

    除了扩展之外,还可以安装一个php的包管理工具 composercomposer 是PHP的包管理、包依赖关系管理工具,有了它,我们就很轻松一个命令就可以把他人优秀的代码用到我们的项目中来,而且很容易管理依赖关系,更新删除等操作也很轻易的实现。

    3 构建准备

    1. 创建工程目录
    [root@harbor ~]# mkdir lnmp/php -p
    [root@harbor ~]# cd lnmp/php/
    
    1. 准备 composer 包,放在工程目录下,下载链接:https://github.com/composer/composer/releases
    [root@harbor php]# wget https://github.com/composer/composer/releases/download/2.0.13/composer.phar
    
    1. 准备 date.ini 文件,设置PHP默认时区为东八区:
    [root@harbor php]# mkdir conf.d
    [root@harbor php]# echo "date.timezone = Asia/Shanghai" > conf.d/date.ini
    
    1. 准备 opcode.ini 文件,用于设置opcode默认的参数,并且设置环境变量 OPCODE 以控制其是否被开启。当环境变量OPCODE的值被设置为1的时候表示开启opcode,0则关闭。
    # 这里加 EOF 是防止${OPCODE}被转义
    [root@harbor php]# cat >> conf.d/opcode.ini << EOF
    > opcache.enable=${OPCODE}
    > enable_clopcache.enable_cli=1
    > opcache.revalidate_freq=60
    > opcache.max_accelerated_files=100000
    > opcache.validate_timestamps=1
    > EOF
    
    1. 准备 php-fpm.conf 文件
    [root@harbor php]# cat www.conf 
    [www]
    user = www
    group = www
    listen = 0.0.0.0:9000
    pm = dynamic
    pm.max_children = 100
    pm.start_servers = 30
    pm.min_spare_servers = 20
    pm.max_spare_servers = 50
    

    准备工作完成,接下来创建Dockerfile进行构建。

    4 创建Dockerfile

    [root@harbor php]# touch Dockerfile
    

    Dockerfile文件内容如下:

    FROM php:7.2.34-fpm-alpine
    LABEL MAINTAINER="syushin moliyoyoyo@163.com"
    ENV TZ "Asia/Shanghai"
    ENV TERM xterm
    # 默认关闭opcode
    ENV OPCODE 0
    
    COPY ./conf.d/ $PHP_INI_DIR/conf.d/
    COPY composer.phar /usr/local/bin/composer
    COPY www.conf /usr/local/etc/php-fpm.d/www.conf
    # 创建www用户
    RUN addgroup -g 1000 -S www && adduser -s /sbin/nologin -S -D -u 1000 -G www www
    # 配置阿里云镜像源,加快构建速度
    RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
    
    # PHPIZE_DEPS 包含 gcc g++ 等编译辅助类库,完成编译后删除
    RUN apk add --no-cache $PHPIZE_DEPS 
        && apk add --no-cache libstdc++ libzip-dev vim
        && apk update 
        && pecl install redis-5.3.4 
        && pecl install zip 
        && pecl install swoole 
        && docker-php-ext-enable redis zip swoole
        && apk del $PHPIZE_DEPS
    # docker-php-ext-install 指令已经包含编译辅助类库的删除逻辑
    RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev 
        && apk update 
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ 
        && docker-php-ext-install -j$(nproc) gd 
        && docker-php-ext-install -j$(nproc) pdo_mysql 
        && docker-php-ext-install -j$(nproc) opcache 
        && docker-php-ext-install -j$(nproc) bcmath 
        && docker-php-ext-install -j$(nproc) mysqli 
        && chmod +x /usr/local/bin/composer
    
    RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
    EXPOSE 9000
    ENTRYPOINT ["php-fpm"]
    

    说明:

    • PHP_INI_DIR : 这个环境变量的定义在php基础镜像的Dockerfile有定义,变量值是 /usr/local/etc/php
    • PHPIZE_DEPS :这个也是定义在基础镜像Dockerfile中,包含了扩展编译安装时需要但是php运行不需要的linux软件库。我们需要把它们挑选出来,在编译完扩展之后删除。变量值: autoconf dpkg-dev dpkg
    • php-fpm.conf 配置文件在 /usr/local/etc/ 目录下
    • www.conf 配置文件在 /usr/local/etc/php-fpm.d 目录下

    可以编写一个脚本进行构建,好处是以后可以通过查看脚本知道哪个标签的镜像是此次构建的。

    [root@harbor php]# cat build-command.sh 
    #!/bin/bash
    docker build -t php-7.2.34-fpm-alpine:v1 .
    

    执行构建

    [root@harbor php]# sh build-command.sh 
    

    稍等时间即可看到构建完成

    # 编译完成后,镜像体积是160m
    [root@harbor php]# docker images
    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    php-7.2.34-fpm-alpine         v1                  fb3d05761dfa        2 hours ago         160MB
    
    # 检查扩展
    [root@harbor php]# docker run php-7.2.34-fpm-alpine:v1 php -m
    [PHP Modules]
    bcmath
    Core
    ctype
    curl
    date
    dom
    fileinfo
    filter
    ftp
    gd
    hash
    iconv
    json
    libxml
    mbstring
    mysqlnd
    openssl
    pcre
    PDO
    pdo_mysql
    pdo_sqlite
    Phar
    posix
    readline
    redis
    Reflection
    session
    SimpleXML
    sodium
    SPL
    sqlite3
    standard
    swoole
    tokenizer
    xml
    xmlreader
    xmlwriter
    Zend OPcache
    zip
    zlib
    
    [Zend Modules]
    Zend OPcache
    
    

    这样,一个镜像就构建完成了。

    5 推送到Harbor镜像仓库

    一般在企业,自己构建好镜像后,需要推送到自己的私有仓库。我这里本地有个harbor的私有仓库,仓库地址:http://192.168.18.100

    并且仓库上面有个项目叫 lnmp,存放相关镜像。

    将上面构建的镜像推送到harbor仓库:

    # Docker登录仓库
    [root@harbor php]# docker login 192.168.18.100:80
    Authenticating with existing credentials...
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    # 给镜像打标签
    [root@harbor php]# docker tag php-7.2.34-fpm-alpine:v1 192.168.18.100:80/lnmp/myphp:7.2
    
    # 上传镜像
    [root@harbor php]# docker push 192.168.18.100:80/lnmp/myphp:7.2
    The push refers to repository [192.168.18.100:80/lnmp/myphp]
    7dfdf785728d: Pushed 
    3ec4258bee2c: Pushed 
    f01174c9f645: Pushing [================>                                  ]  24.29MB/73.92MB
    c21c6905870c: Pushed 
    752870d17619: Pushed 
    0e7d6edc15aa: Pushed 
    c9685eb5cbc9: Pushed 
    e07b1aa3ce21: Pushed 
    69e56c02a5f3: Pushed 
    5ce5d9de209b: Pushed 
    ee81ef73796d: Pushed 
    738a430a6dab: Pushing [==============>                                    ]  15.51MB/53.39MB
    7d12c6e1d8f1: Pushing [==================================================>]  4.096kB
    be80e727dd27: Waiting 
    24e52497c24f: Waiting 
    86d905c1f58e: Waiting 
    22573737ba76: Waiting 
    777b2c648970: Waiting 
    
    

    等待推送完成,即可看到仓库上已经有该镜像了。

    6 参考资料

  • 相关阅读:
    Selenium生成Report的利器- ExtentReports
    学习使用monkey 测试
    charles 结合mocky 模拟数据
    Vue.use()源码分析且执行后干什么了
    commonjs 与 es6相关Module语法的区别
    vue函数化组件 functional
    html5细线表格制作
    移动端H5页面禁止长按复制和去掉点击时高亮
    javascript生成器
    promise和生成器的结合
  • 原文地址:https://www.cnblogs.com/syushin/p/14955582.html
Copyright © 2011-2022 走看看