• [每周一更]-(第64期):Dockerfile构造php定制化镜像


    在这里插入图片描述

    利用php官网镜像php:7.3-fpm,会存在部分插件缺失的情况,自行搭建可适用业务的镜像,才是真理
    Dockerhub 上 PHP 官方基础镜像主要分为三个分支:

    • cli: 没有开启 CGI 也就是说不能运行fpm。只可以运行命令行。
    • fpm: 开启了CGI,可以用来运行web服务也可以用来运行cli命令。
    • zts: 开启了线程安全的版本。

    在这里插入图片描述

    1、继承基础镜像

    FROM php:7.3-fpm
    
    • 1
    • 指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
    • 必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从 FROM 开始
      2、安装PHP扩展

    2、安装扩展

    2.1、安装dockerhub中php官方提供的扩展

    • 安装一些常用的组件:pdo、pdo_mysql等
    FROM php:7.3-fpm
    docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath
    
    # 扩展指定一些自定义的编译参数的话
    FROM php:7.3-fpm
    RUN docker-php-ext-install pdo pdo_mysql mcrypt zip pcntl opcache bcmath\
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.2、使用PECL安装扩展

    RUN pecl install grpc \
    && docker-php-ext-enable grpc \
    && pecl install -o -f redis \
    && docker-php-ext-enable redis \
    && rm -rf /tmp/pear
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3、源码安装扩展

    • 针对复杂插件
    RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
    && mkdir -p /tmp/xcache \
    && tar -xf xcache.tar.gz -C /tmp/xcache --strip-components=1 \
    && rm xcache.tar.gz \
    && docker-php-ext-configure /tmp/xcache --enable-xcache \
    && docker-php-ext-install /tmp/xcache \
    && rm -r /tmp/xcache
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.开源的镜像库

    • webdevops/php-nginx:7.3-alpine
    • firehmx/php-7.3.33-fpm-alpine3.14:v1

    4.实际例子

    构造一个php7.3.33的镜像

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

    docker run  php:7.3.34-fpm-alpine3.14  php -m
    
    • 1

    4.2、安装

    安装创建库:redis、zip、gd、bcmath、pdo_mysql、opcache

    • redis:redis是目前主流的Nosql数据库,常用。
    • zip:文件压缩扩展。
    • gd:图片处理扩展,一些图形验证码的生成不能没有这个扩展。
    • bcmath:没有这个库的话可能一些框架或者类库的composer依赖校验会无法通过。
    • pdo_mysql:连接数据库扩展。
    • opcache: 是 PHP 中的 Zend 扩展,可以大大提升 PHP 的性能。
    4.2.1 创建工程目录
    # 创建目录
    mkdir lnmp/php -p
    cd lnmp/php/
    
    # compser地址:https://github.com/composer/composer/releases
    --
    wget  https://github.com/composer/composer/releases/download/2.6.3/composer.phar
    
    # 配置文件1
    mkdir conf.d
    echo "date.timezone = Asia/Shanghai" > conf.d/date.ini
    
    # 配置文件2
    # 这里加 \EOF 是防止${OPCODE}被转义
    --
    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
    # 配置文件3
    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
    touch Dockerfile
    --
    FROM php:7.3.33-fpm-alpine3.14
    LABEL MAINTAINER="ifanaticfire@gmail.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"]
    
    # 构建脚本
    cat build-command.sh
    --
    docker build -t php-7.3.33-fpm-alpine3.14:v1 .
    
    # 运行脚本
    sh build-command.sh 
    
    # 查看镜像
    docker images
    ---
    php-7.3.33-fpm-alpine3.14    v1                      088d571602a3   43 minutes ago   116MB
    
    查看构建镜像:116M
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    4.3 推送到dockerhub

    docker tag php-7.3.33-fpm-alpine3.14:v1 firehmx/php-7.3.33-fpm-alpine3.14:v1
    
    # 未登录的话 docker login 登录
    docker push   firehmx/php-7.3.33-fpm-alpine3.14:v1
    
    • 1
    • 2
    • 3
    • 4

    参考

    • https://segmentfault.com/a/1190000018372614
    • https://www.cnblogs.com/syushin/p/14955582.html
    • https://hub.docker.com/_/php
    • https://github.com/suyar/docker-php
  • 相关阅读:
    我的创作纪念日(从本科到研究生)
    Flutter Web 在《一起漫部》的性能优化探索与实践
    大厂秋招真题【DP】米哈游20230924秋招T2-米小游与魔法少女-奇运
    hashmap的一些坑
    Vuex使用和v-model语法详细教程
    [Docker精进篇] Docker镜像构建和实践 (三)
    vncserver远程管理kvm虚拟机
    【无标题】
    基于springboot的图片文字识别,支持中英文识别
    微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
  • 原文地址:https://blog.csdn.net/hmx224_2014/article/details/133284254