基于centos
FROM docker.io/centos:centos7.6.1810ENV PHP_VERSION 5.6.40ENV LANG "en_US.UTF-8"RUN set -x && \yum install -y epel-release \make \gcc \gcc-c++ \gd-devel \libxml2-devel \libcurl-devel \openssl-devel \libjpeg-devel \libpng-devel \libxslt-devel \libtidy-devel \pcre-devel \freetype-devel \libmcrypt-devel \autoconf \vim \net-tools \telnet \curl && \# Add user#mkdir -p /data/www && \useradd -M -s /sbin/nologin www && \# Download phpmkdir -p /home/php && \cd $_ && \curl -Lk http://ftp.ntu.edu.tw/php/distributions/php-$PHP_VERSION.tar.gz | gunzip | tar x -C /home/php && \# Make install phpcd /home/php/php-$PHP_VERSION && \./configure --prefix=/usr/local/php \--with-config-file-path=/usr/local/php/etc \--with-config-file-scan-dir=/data/phpextini \--with-fpm-user=www \--with-fpm-group=www \--with-mysqli \--with-pdo-mysql \--with-openssl \--with-gd \--with-iconv \--with-zlib \--with-gettext \--with-curl \--with-png-dir \--with-jpeg-dir \--with-freetype-dir \--with-xmlrpc \--with-mhash \--enable-fpm \--enable-xml \--enable-shmop \--enable-sysvsem \--enable-inline-optimization \--enable-mbregex \--enable-mbstring \--enable-ftp \--enable-mysqlnd \--enable-pcntl \--enable-sockets \--enable-zip \--enable-soap \--enable-session \--enable-opcache \--enable-bcmath \--enable-exif \--enable-fileinfo \--disable-rpath \--enable-ipv6 \--disable-debug \--without-pear && \make && make install &&\# Clean OSyum remove -y gcc \gcc-c++ \make \autoconf && \yum clean all && \rm -rf /tmp/* /var/cache/yum/* && \find /var/log -type f -delete && \rm -rf /home/php && \# Change own for webdir#chown -R www:www /data/www && \# Set timezoneln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \# Set logln -sf /dev/stdout /usr/local/php/var/log/php-fpm.log#ln -sf /dev/stderr /usr/local/php/var/log/\$pool.log.slowENV PATH $PATH:/usr/local/php/sbin# Config php.iniCOPY php.ini /usr/local/php/etc/# Config php-fpm.confCOPY php-fpm.conf /usr/local/php/etc/#USER wwwWORKDIR /usr/local/phpEXPOSE 9000CMD ["php-fpm"]
基于alpine-php多阶段构建最小镜像
#This is DockerFile based on the alpine image as PHPFROM alpine:3.5 as buildLABEL MAINTAINER="Dreambeer@126.com"ENV LANG "en_US.UTF-8"ENV PHP_VERSION 5.6.40ENV LIBICONV_VERSION 1.9.2ARG CPU_NUMRUN addgroup -S www && \adduser -s /sbin/nologin -S -D -G www www && \#处理依赖sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \apk update && \apk upgrade && \set -xe && \apk add --no-cache libmemcached-libs libevent curl-dev yaml && \apk add --no-cache g++ gcc make libssh2-dev libxml2-dev libjpeg-turbo-dev libpng-dev freetype-dev -U gettext-dev libcurl && \#下载编译libiconvwget -P /usr/local/ http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$LIBICONV_VERSION.tar.gz && \cd /usr/local/ && \tar zxvf libiconv-$LIBICONV_VERSION.tar.gz && \cd /usr/local/libiconv-$LIBICONV_VERSION && \./configure --prefix=/usr/local/iconv && \make -j$CPU_NUM && make install && \#dl-3.alpinelinux源下载libcurl包(上面dl-cdn.alpinelinux有时不可用)#RUN apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing libcurl#ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php#此处openssl不建议删除,更换版本或依赖包失效可通过下面方式解决openssl依赖#wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz && \#tar -zxvf openssl-1.0.2u.tar.gz && \#cd openssl-1.0.2u && \#./config --prefix=/usr/local --openssldir=/usr/local/openssl && \#make -j$CPU_NUM && make install#下载PHP包wget -P /usr/local/ http://downloads.ichzh.com/Php/php-$PHP_VERSION.tar.gz && \cd /usr/local/ && \tar -zxvf php-$PHP_VERSION.tar.gz && \#配置编译安装PHPcd /usr/local/php-$PHP_VERSION && \./configure --prefix=/usr/local/php \--with-config-file-path=/usr/local/php/etc \--with-config-file-scan-dir=/data/phpextini \--with-fpm-user=www \--with-fpm-group=www \--with-mysqli \--with-pdo-mysql \--with-openssl \--with-gd \--with-iconv=/usr/local/iconv \--with-zlib \--with-gettext \--with-curl \--with-png-dir \--with-jpeg-dir \--with-freetype-dir \--with-xmlrpc \--with-mhash \--enable-fpm \--enable-xml \--enable-shmop \--enable-sysvsem \--enable-inline-optimization \--enable-mbregex \--enable-mbstring \--enable-ftp \--enable-mysqlnd \--enable-pcntl \--enable-sockets \--enable-zip \--enable-soap \--enable-session \--enable-opcache \--enable-bcmath \--enable-exif \--enable-fileinfo \--disable-rpath \--enable-ipv6 \--disable-debug \--without-pear && \make -j$CPU_NUM && make install && \#拷贝模板配置文件到并修改名称,修改配置文件"daemonize = no",注每段开始“;”为注释符修改配置后需去除cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \sed -i "89s#;daemonize = yes#daemonize = no#" /usr/local/php/etc/php-fpm.conf &&\sed -i -e 's@;pid = run/php-fpm.pid@pid = run/php-fpm.pid@g' -e 's@listen = 127.0.0.1:9000@listen = 0.0.0.0:9000@g' /usr/local/php/etc/php-fpm.confFROM alpine:3.5ENV PATH $PATH:/usr/local/php/sbinENV LANG "en_US.UTF-8"COPY --from=build /usr/local/php/ /usr/local/php/COPY --from=build /usr/local/iconv /usr/local/# COPY php.ini /usr/local/php/etc/# COPY php-fpm.conf /usr/local/php/etc/RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \apk update && \apk upgrade && \set -xe && \apk add --no-cache libxml2-dev libjpeg-turbo-dev libpng-dev freetype-dev -U gettext-dev libcurl && \apk add --no-cache net-tools vim && \addgroup -S www && \adduser -s /sbin/nologin -S -D -G www www && \#设置时区以及连接log文件ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ln -sf /dev/stdout /usr/local/php/var/log/php-fpm.logEXPOSE 9000WORKDIR /usr/local/phpCMD ["php-fpm"]#构建镜像时根据cpu核数修改CPU_NUM=<核数>#查看核数"cat /proc/cpuinfo | grep processor | wc -l"# docker build -t php:test --build-arg CPU_NUM=16 .
验证php
nginx端修改配置文件
location ~ \.php$ {include fastcgi_params;fastcgi_pass unix:/tmp/php-fcgi.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
配置说明:
- fastcgi_params文件在/usr/local/nginx/conf/下面,其内容为fastcgi相关的变量
- fastcgi_pass后面跟的是php-fpm服务监听地址,可以是IP:PORT,也可以是unix socket地址,也支持upstream的地址
- fastcgi_index定义索引页,如果在server内其他部分有定义index参数,该配置可以忽略
- fastcgi_param这行其实可以在fastcgi_params文件里面定义SCRIPT_FILENAME变量,这个变量如果不定义,php的请求是没办法访问的。
在配置的
