基于 CentOS 构建 Nginx + PHP-FPM Docker 镜像实操指南
在使用 Docker 部署 LNMP 环境时,官方镜像往往无法完全满足特定的模块加载需求(如旧版 PHP 扩展或特定数据库驱动)。本文将演示如何通过编写 Dockerfile,在 CentOS 基础上编译安装 Nginx 和 PHP 5.6,并集成 Memcache、Redis 等常用扩展,最终生成一个轻量且功能完整的自定义镜像。
构建前准备:获取源码与依赖
构建自定义镜像的核心在于将所需的服务打包进容器。对于本案例,我们需要准备好 Nginx、PHP 源码包以及相关的扩展文件。由于版本较旧,建议先从官方归档站点获取以下资源:
- Nginx:
nginx-1.9.5.tar.gz(示例版本) - PHP:
php-5.6.14.tar.gz(示例版本) - MongoDB 扩展:
mongo-1.6.11.tgz(PECL 源) - Memcache 扩展:
memcache-2.2.4.tgz
构建流程:从零开始组装环境
第一步:初始化系统与基础依赖
Docker 镜像通常从精简的系统镜像起步。我们选择 centos:latest 作为基础镜像,因为 CentOS 拥有完善的 yum 包管理器,便于处理复杂的编译依赖。
# 若需使用第三方仓库工具,可先安装 Atomicorp 源
wget http://www.atomicorp.com/installers/atomic
sh ./atomic接着,安装编译 Nginx 和 PHP 所需的通用开发库。这一步是后续顺利执行 configure 脚本的关键,务必保证所有 -devel 包齐全:
yum install -y gcc gcc-c++ kernel-devel
yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
yum install -y libxml2 libxml2-devel
yum install -y bzip2 bzip2-devel curl-devel
yum install -y php-mcrypt libmcrypt libmcrypt-devel
yum install -y libjpeg* freetype* libpng*
yum install -y uw-imap-devel libxslt-devel zip unzip autoconf libc-client.x86_64
第二步:编译安装 Nginx
Nginx 的编译相对标准。解压源码后,进入目录执行 configure 并指定需要的模块(此处以启用 SSL 为例):
./configure --with-http_ssl_module
make && make install
安装完成后,默认路径通常为 /usr/local/nginx。可通过以下命令验证安装的模块:
/usr/local/nginx/sbin/nginx -V
第三步:编译安装 PHP 核心
为了支持 Web 应用,我们需要编译带有 FastCGI Process Manager (FPM) 支持的 PHP。鉴于需要挂载多种数据库和缓存,Configure 参数较为冗长,请确保路径正确:
./configure --prefix=/usr/local/php \
--with-zlib-dir --with-freetype-dir --enable-mbstring \
--with-libxml-dir=/usr/local/libxml --enable-soap \
--with-curl --with-mcrypt --with-gd \
--with-jpeg-dir=/usr/local/libjpeg --with-png-dir=/usr/local/libpng \
--with-openssl --with-fpm-user=www --with-fpm-group=www \
--enable-fpm --enable-opcache --enable-sockets
注意: 如果此前未安装 libxml 或相关图形库的路径不是默认路径,请务必调整 --with-xxx-dir 指向正确的头文件位置。编译成功后,PHP 主程序位于 /usr/local/php。
第四步:集成扩展模块 (Memcache / Redis / MongoDB)
在容器中安装动态扩展 (.so),通常遵循 “phpize -> configure -> make” 的标准流程。以 Memcache 为例:
tar -zvxf memcache-2.2.4.tgz
cd memcache-2.2.4
/usr/local/php/bin/phpize
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
make && make install
同理,安装 Redis 扩展:
wget https://github.com/nicolasff/phpredis/archive/master.zip -O php-redis.zip
unzip php-redis.zip
cd phpredis-master
/usr/local/php/bin/phpize
./configure --enable-redis --with-php-config=/usr/local/php/bin/php-config
make && make install
若需 MongoDB 支持,逻辑一致:
wget https://pecl.php.net/get/mongo-1.6.11.tgz
tar -zvxf mongo-1.6.11.tgz
cd mongo-1.6.11
/usr/local/php/bin/phpize
./configure --enable-mongo --with-php-config=/usr/local/php/bin/php-config
make && make install
第五步:配置生效与瘦身优化
编译生成的 .so 文件需要被 PHP 识别。编辑配置文件:
vi /usr/local/php/etc/php.ini
# 在末尾添加:
extension = redis.so
extension = memcache.so
extension = mongo.so
构建完成后,容器内会残留大量的安装包和临时文件,这会导致镜像体积臃肿。利用 yum 清理机制可以有效缩减体积:
make clean
yum clean all
rm -rf /var/cache/yum/* /tmp/*
镜像运行与启动配置
入口命令定义
在 Dockerfile 中,通常需要明确容器的启动脚本。分别启动两个进程的命令如下:
# 启动 Nginx
/usr/local/nginx/sbin/nginx
# 启动 PHP-FPM (指定配置文件)
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
在实际生产环境中,建议使用 Supervisor 或其他多进程管理工具将它们统管在一个 PID 1 进程中,以确保容器退出时信号能正确传递。若无此需求,可简单编写 shell 脚本同时启动两者。
容器实例化运行
假设镜像构建完成且命名为 img-nginx-php,可使用以下命令启动:
docker run -dt --name nginx-php \
--privileged=true \
-v /home/www/nginx_logs:/usr/local/nginx/logs \
-v /home/www/src:/usr/local/nginx/html \
-p 80:80 -p 443:443 \ img-nginx-php
此处使用了挂载卷(Volume)技术将日志和网站源码映射到宿主机,方便调试和维护。端口 80 和 443 分别用于 HTTP 和 HTTPS 访问。
以上就是利用 Docker 制作 Nginx + PHP 自定义镜像的详细步骤,更多关于搭建高性能 Web 环境的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













