首页 > 编程语言 >制作一个生产环境可用的PHP基础镜像

制作一个生产环境可用的PHP基础镜像

时间:2023-05-24 14:23:35浏览次数:48  
标签:php 可用 && 镜像 docker PHP alpine

目录

    1. 引言
    2. 了解PHP基础镜像
    3. 需求分析以及镜像选择
      1. 构建准备
      2. 最终的Dockerfile

引言

初学docker一定会觉得Dockerfile很难,其实只是无从下手的缘故。最好的学习方法就是看完每个Dokerfile指令的作用,然后不要急着去搞清楚,直接挑选一个你比较熟悉的服务软件动手自己制作一个。最好是直接到docker官方镜像仓库找到相应的官方镜像,然后顺藤摸瓜找到其Dockerfile文件,这一定是最佳实践。读懂它并且仿照它去进行二次构建,加入你所需要的东西。

本文就分享如何在php官方基础镜像的基础上构建一个生产环境可用的php镜像。为什么说是生产环境可用呢,因为基础镜像缺少很多扩展,一般情况下不满足实际项目的运行。

了解PHP基础镜像

PHP 基础镜像分为三个分支:

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

一般运行于linux平台的选用fpm就可以了。

需求分析以及镜像选择

本文中选用php:7.3.7-fpm-alpine3.9这个镜像,php版本为7.3.7,这个个版本已经不是最新的了,也没有落后太多。基于alpine 3.9这个系统镜像构建。至于为什么是alpine,因为alpine体积小,只有5M左右大小,是专门为容器而生的linux发行版,当然还有其他小体积的发行版但是我比较熟悉alpine。如果你不知道怎么选择那么也用alpine吧,经验法则告诉我们大部分人的选择不会错的太离谱。

我们的目的是构建一个可以支持大部分PHP应用的运行环境基础镜像所以先看一下官方基础镜像里面有哪些扩展,然后再按照我们的需要决定添加哪些扩展:

docker run php:7.3.7-fpm-alpine3.9 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作为主流缓存已经是web应用必不可少的组件。虽然有php写的redis类库,但是考虑到运行性能还有后期的php应用镜像的体积,我们还是有必要安装一个redisC的扩展到基础镜像中。
  • zip 这个文件压缩也是使用频率较高的,当然如果你不这么认为的话也可以先不加入,等后续需要的时候再从本镜像构建一个新的镜像。
  • swoole 同样的,如果你认为不是很必要可以暂时不添加。
  • gd 现在虽然有很多云厂商提供的文件存储服务直接就带有图片处理服务,但是我认为图片处理扩展是必须的。图形验证码的生成不能没有这个扩展。当然如果你确定你的应用不需要图片处理也可以暂时不添加。
  • pdo_mysql 这个就不用多说了,我认为进行数据库操作pdo是最省心的。其参数绑定特性可以最大程度的防止sql注入。这也是很多主流框架类库默认的mysql默认操作依赖。
  • opcache 既然是生产环境可用,那么我们必须为运行性能作一些考虑,所以我认为这个扩展是必须添加的,可以设定为按需开启,毕竟开发环境开启opcache并不是一个明智的做法。
  • bcmath 没有这个库的话可能一些框架或者类库的composer依赖校验会无法通过。而且不确定我们的应用程序中是否需要用到它,但是可以预见它被用到的可能性很大。毕竟程序的本质就是运算。
  • composer 当然,这个并不是扩展,但是它需要运行在当前php环境中,才能检查我们php环境是否满足一个类库的运行,所以它必须要包含在基础镜像中。最简洁的做法是事先下载好其phar包,然后直接打包到当前镜像中。

构建准备

  • 下载composer运行包,放置在当前工程目录下。下载连接:composer
  • 在当前工程目录下创建文件conf.d/date.ini, 设置PHP默认时区为东8区。其内容为:
 
date.timezone = Asia/Shanghai
  • 在当前工程目录下创建文件conf.d/opcode.ini, 设置opcode默认的参数,并且设置环境变量OPCODE以控制其是否被开启。当环境变量OPCODE的值被设置为1的时候表示开启opcode,0则关闭。

opcache.enable=${OPCODE}
enable_clopcache.enable_cli=1
opcache.revalidate_freq=60
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1

最终的Dockerfile

说再多不如直接看代码看注释:

FROM php:7.3.7-fpm-alpine3.9
LABEL MAINTAINER="tttlkkkl <[email protected]>"
LABEL description="php-fpm 镜像,已开启FCGI,可用于web服务,也可以用于运行 cli 程序。"
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
RUN echo 'https://mirrors.aliyun.com/alpine/v3.9/main/' > /etc/apk/repositories && \
    echo 'https://mirrors.aliyun.com/alpine/v3.9/community/' >> /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-4.3.0 \
    && 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 \
    && chmod +x /usr/local/bin/composer

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

需要解释的几个点:

  • PHP_INI_DIR:这个环境变量的定义在php基础镜像Dockerfile中有定义,这也是读懂官方镜像Dockerfile文件的裨益之一。
  • PHPIZE_DEPS:这个也是定义在基础镜像Dockerfile中,包含了扩展编译安装时需要但是php运行不需要的linux软件库。我们需要把它们挑选出来,在编译完扩展之后删除。
  • 重置了alpine的镜像下载源为国内阿里云镜像站,以加快镜像的构建速度。不然在没有...的情况下,你会抓狂比蜗牛还慢的构建速度。当然这个基础镜像本身的构建速度不会很快,可能还会下载超时导致构建失败,重试,随缘吧,总会构建成功的。
  • 制作镜像一定要注意不要留下太多运行时不需要的文件,保证最小镜像体积。弄清楚每一步每一条命令的用途,切不可随意复制粘贴。

希望本文可以对你的php镜像制作带来一些帮助,事实上本文贴出的Dockerfile文件已经经过测试,你如果不想太折腾的话可以直接拿来用。

有不当之处还请指正。

标签:php,可用,&&,镜像,docker,PHP,alpine
From: https://www.cnblogs.com/shanhubei/p/17428170.html

相关文章

  • Docker 镜像原理(commit、容器数据卷)
    dokcer镜像原理联合文件系统(UnionFS)理解:假设:docker中包含的tomcat和mysql均需要使用linux内核,这里使用的linux内核是共用的。下载时候看到的一层层就是这个,Docker镜像实际是由一层一层的文件系统组成联合文件系统时Docker镜像的基础,镜像通过分层来进行继承特性:......
  • openbiz PHP开源框架,企业级应用的功能基本都有了
    [url]http://www.iteye.com/topic/1128832[/url]openbizPHP开源框架,企业级应用的功能基本都有了我使用了一段时间,感觉还不错,现在推荐大家试试开源下载地址:http://code.google.com/p/openbiz-cubiQ群214408120[img]http://dl.iteye.com/upload/attach......
  • centos7安装erlang、rabbitmq以及php扩展
    centos7安装erlang、rabbitmq以及php扩展标签(空格分隔):liunx,php安装Erlang版本:el7erlang-20.3.8.25erlang-20.3.8.25-1.el7.x86_64.rpm1.下载wget--content-disposition"https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3.8.25-1.el7.x86_64.rpm/d......
  • System.Windows.Forms.TextBox ImeMode只输入数字或者只输入文字快以及捷键ctrl+c ctr
    //设置输入法发编辑模式,例如只输入数字或者只输入文字等等txtPassword.ImeMode=ImeMode.Off;//指示是否启用定义的快捷方式,例如设置快捷键ctrl+cctrl+v是否可用txtPassword.ShortcutsEnabled=false;txtPassword.Password......
  • 华三(H3C)交换机做堆叠-实测可用
    前提:交换机支持堆叠,而且两台交换机型号要一样,否则会出问题1配置前先不用插上堆叠线(1)配置DeviceB# 将DeviceB的成员编号配置为2,并重启设备使新编号生效。<Sysname>system-view[Sysname]irfmember1renumber2RenumberingthememberIDmayresultinconfigurati......
  • 【web 开发】PHP8中数组的序列化和反序列化
    前言数组的序列化(serialize)用来将数组的数据转换为字符串,以方便传递和数据库的存储。与之相对应的操作就是反序列化(unserialize),把字符串数据转换为数组加以使用。数组的序列化主要通过serialize()函数来完成。字符串的反序列化主要通过unserialize()函数来完成。对象的序列化与反序......
  • Graphpad Prism9.5.1 数据处理绘图软件详细安装教程 (含Win/Mac版)
    GraphPadPrismGraphPadPrism是一款非常专业强大的科研医学生物数据处理绘图软件,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织结合在一起,除了最基本的数据统计分析外,还能自动生成统计图。  安装教程下面就简单的介绍一下Win版的安装教程详细图文教程......
  • php反序列化逃逸
    之前就对字符串逃逸这一块理解的不是很深刻,下面通过一位师傅的博客来进一步深入理解一下有关php字符串逃逸的相关内容。贴上师傅的博客地址:https://blog.csdn.net/qq_45521281/article/details/107135706先来说一下什么是字符串逃逸,就是我们可以构造一些恶意代码,让其在反序列化......
  • xctf_easyphp
    easyphp类型:PHP代码审计1.审查传值2.观看分析条件从上往下看:1.if(isset($a)&&intval($a)>6000000&&strlen($a)<=3)2.if(isset($b)&&'8b184b'===substr(md5($b),-6,6))3.$c=(array)json_decode(@$_GET['c'])4.if(is_a......
  • PHP用PhpOffice->PhpSpreadsheet导出excel
    phpexcel由于版本陈旧性能低下官方放弃维护转而开发PhpSpreadsheet用了最新得psr标准因而对php版本不向下兼容需要注意!。PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文......