Hello welcome to Yzone.net

基于官方的php 5.6 fpm 制作自己的php镜像

官方的镜像基于 debian 8 debian:jessie。 与直接使用 apt-get install 安装php不同,官方的是下载的源码包编译的,安装目录、相关配置也不同。 也无法直接使用 apt-get install php5_mcrypt 这样的命令来直接安装扩展

镜像自带了当前版本的php源码包,下载的源码包在 /usr/src/php.tar.xz

可使用docker官方提供的 docker-php-source extract 来快速解压它,解压目录 /usr/src/php/

同样可以用 docker-php-source delete 来快速删除/usr/src/php/ 目录。

安装核心扩展

核心扩展是自带在php源码包里面的,解压后在 /usr/src/php/ext

可以方便的使用 docker 官方提供的 docker-php-ext-install [gettext] 来快速安装并启用扩展。

docker-php-ext-install gettext
# 可以同时安装多个
docker-php-ext-install gettext mysqli opcache pdo_mysql sockets

需要注意的是有些扩展需要依赖库,此时需先安装依赖库才能成功的安装相应的扩展。例如 gd mcrypt的扩展。

# Must install dependencies for your extensions manually, if need.
apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd 

根据 docker-php-ext-install 命令的提示可直接本地编译安装的扩展有

bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv
imap interbase intl json ldap mbstring mcrypt mssql mysql mysqli oci8 odbc opcache pcntl
pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix
pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard
sybase_ct sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip

大部分已经默认安装启用了。

安装PECL扩展

官方镜像中已经默认有 pear pecl 工具了,可以使用 pecl 安装常用的php扩展(e.g. xdebug memcached)。

同样有些扩展依赖第三方库,需先安装它们。

# Install PECL extensions
$ apt-get install -y \

    # for memcache
    libmemcache-dev \

    # for memcached
    libmemcached-dev \

    && pecl install memcache && docker-php-ext-enable memcache \
    && pecl install memcached && docker-php-ext-enable memcached \
  #  && pecl install gearman && docker-php-ext-enable gearman \
  #  && pecl install xdebug && docker-php-ext-enable xdebug \
  #  && pecl install redis && docker-php-ext-enable redis \
  #  && pecl install xhprof && docker-php-ext-enable xhprof 

安装其它扩展

其他的扩展需要自己手动下载编译。

$ curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
     && mkdir -p xcache \
     && tar -xf xcache.tar.gz -C xcache --strip-components=1 \
     && rm xcache.tar.gz \
     && ( \
         cd xcache \
         && phpize \
         && ./configure --enable-xcache \
         && make -j$(nproc) \
         && make install \
     ) \
     && rm -r xcache \
     && docker-php-ext-enable xcache

问题

有一些需要注意的地方

  • 官方的镜像使用的是 监听 9000 端口,没有启用 Unix sock,配置nginx 站点时要注意使用 fastcgi_pass [host]:9000;。 需要的话可以在/usr/local/etc/php-fpm.d/www.conf 配置 listen
  • 默认没有写pid文件,也需要在 /usr/local/etc/php-fpm.conf 启用

将 php-fpm 加入 service

将 php-fpm 加入 service 可以更方便的管理(重启、停止php-fpm等)。首先要在php-fpm配置中启用pid文件。 pid文件的默认位置在 /usr/local/php/var/run/php-fpm.pid

拷贝php官方提供的service文件到 /etc/init.d

cp /usr/src/php/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm  
chmod +x /etc/init.d/php-fpm

编辑 /etc/init.d/php-fpm ,加上正确的配置:

prefix=@prefix@ 
exec_prefix=@exec_prefix@  

php_fpm_BIN=@sbindir@/php-fpm  
php_fpm_CONF=@sysconfdir@/php-fpm.conf  
php_fpm_PID=@localstatedir@/run/php-fpm.pid 

配置后:

prefix=/usr/local
exec_prefix=/usr/local/bin/php

php_fpm_BIN=/usr/local/sbin/php-fpm
php_fpm_CONF=/usr/local/etc/php-fpm.conf
php_fpm_PID=$prefix/var/run/php-fpm.pid

OK,现在就可以使用 service php-fpm [status|start|reload]等命令了。

完整的配置

完整的 php 5.6 fpm Dockerfile 配置如下:

FROM php:5.6-fpm

MAINTAINER inhere<cloud798@126.com>

# 更换(debian 8)软件源
# RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
# ADD data/resources/debian8.sources    /etc/apt/sources.list

# extions

# Install Core extension
#
# bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv
# imap interbase intl json ldap mbstring mcrypt mssql mysql mysqli oci8 odbc opcache pcntl
# pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix
# pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard
# sybase_ct sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
#
# Must install dependencies for your extensions manually, if need.
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \

    # no dependency extension
    && docker-php-ext-install gettext mysqli opcache pdo_mysql sockets

# Install PECL extensions
RUN apt-get install -y \

    # for memcache
    libmemcache-dev \

    # for memcached
    libmemcached-dev \

    && pecl install memcache && docker-php-ext-enable memcache \
    && pecl install memcached && docker-php-ext-enable memcached \
    && pecl install gearman && docker-php-ext-enable gearman \


    && pecl install xdebug && docker-php-ext-enable xdebug \
    && pecl install redis && docker-php-ext-enable redis \
    && pecl install xhprof && docker-php-ext-enable xhprof \

    && docker-php-source delete \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* \
    && echo 'PHP 5.6 installed.'

# Other extensions
# RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
#     && mkdir -p xcache \
#     && tar -xf xcache.tar.gz -C xcache --strip-components=1 \
#     && rm xcache.tar.gz \
#     && ( \
#         cd xcache \
#         && phpize \
#         && ./configure --enable-xcache \
#         && make -j$(nproc) \
#         && make install \
#     ) \
#     && rm -r xcache \
#     && docker-php-ext-enable xcache

    # open pid file
RUN sed -i '/^;pid\s*=\s*/s/\;//g' /usr/local/etc/php-fpm.d/www.conf \

    # add php-fpm to service
    && cp services/php/5.6/php-fpm /etc/init.d/php-fpm && chmod +x /etc/init.d/php-fpm
    # && chkconfig --add php-fpm

# ADD data/packages/php-tools/composer.phar /usr/local/bin/composer
# RUN chmod 755 /usr/local/bin/composer

WORKDIR "/var/www"

################################################################################
# Volumes
################################################################################

VOLUME ["/var/www"]

# extends from parent
# EXPOSE 9000
# CMD ["php-fpm"]

分类 docker    标签 docker , linux , php , env-build
文档结构