尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

实战指南:使用Docker commit命令构建包含Oracle扩展的PHP生产镜像

实战指南:使用Docker commit命令构建包含Oracle扩展的PHP生产镜像
📅 发布时间:2026/7/14 7:27:45

1. 场景需求与准备工作

最近接手一个遗留的PHP 5.6项目,需要连接Oracle数据库。由于生产环境采用Docker部署,传统方式是在宿主机安装Oracle客户端,但这样会导致环境依赖复杂。更优雅的解决方案是将Oracle扩展直接打包到PHP镜像中。

先确认基础环境要求:

  • 操作系统:CentOS 7.9
  • PHP版本:5.6.40
  • 需要安装的扩展:OCI8和PDO_OCI
  • Docker版本:20.10.17+

2. 基础镜像准备

2.1 拉取CentOS基础镜像

docker pull centos:centos7.9.2009

2.2 启动容器并进入

docker run -d --name php-oracle --privileged=true centos:centos7.9.2009 /usr/sbin/init docker exec -it php-oracle /bin/bash

这里使用--privileged=true参数是为了后续能使用systemctl管理服务。我在实际测试中发现,如果不加这个参数,容器内的服务管理会出问题。

3. 安装编译环境

3.1 安装基础工具

yum -y install epel-release yum -y install \ gcc gcc-c++ \ make autoconf \ libaio bzip2 unzip \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel

3.2 编译安装PHP 5.6

下载PHP源码包:

wget https://www.php.net/distributions/php-5.6.40.tar.gz tar zxvf php-5.6.40.tar.gz cd php-5.6.40

配置编译参数:

./configure --prefix=/usr/local/php \ --enable-bcmath \ --enable-calendar \ --with-curl \ --enable-ftp \ --with-gd \ --enable-mbstring \ --enable-mysqlnd \ --with-mysqli \ --with-openssl \ --with-zlib \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --enable-fpm \ --enable-session \ --enable-pdo \ --enable-tokenizer \ --enable-zip \ --with-mysql \ --with-pdo-mysql \ --with-config-file-path=/etc/php

编译并安装:

make && make install

4. Oracle客户端安装

4.1 准备Oracle Instant Client

从Oracle官网下载以下两个包:

  • instantclient-basic-linux.x64-12.2.0.1.0.zip
  • instantclient-sdk-linux.x64-12.2.0.1.0.zip

上传到容器并解压:

unzip instantclient-basic-linux.x64-12.2.0.1.0.zip unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip mkdir -p /usr/lib/oracle/12.2 mv instantclient_12_2 /usr/lib/oracle/12.2/client

4.2 配置环境变量

echo "/usr/lib/oracle/12.2/client" > /etc/ld.so.conf.d/oracle.conf ldconfig export ORACLE_HOME=/usr/lib/oracle/12.2/client export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

5. 编译Oracle扩展

5.1 安装OCI8扩展

进入PHP源码的ext/oci8目录:

cd php-5.6.40/ext/oci8 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config \ --with-oci8=instantclient,/usr/lib/oracle/12.2/client make && make install

5.2 安装PDO_OCI扩展

进入ext/pdo_oci目录:

cd ../pdo_oci # 修改配置文件版本号 sed -i "s/10.1/12.2/g" config.m4 /usr/local/php/bin/phpize ./configure --with-pdo-oci=instantclient,/usr/lib/oracle/12.2/client,12.2 \ --with-php-config=/usr/local/php/bin/php-config make && make install

6. PHP配置

6.1 配置php.ini

mkdir /etc/php cp php.ini-production /etc/php/php.ini

添加Oracle扩展配置:

extension=oci8.so extension=pdo_oci.so

6.2 配置PHP-FPM

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

添加环境变量:

env[LD_LIBRARY_PATH] = /usr/lib/oracle/12.2/client env[ORACLE_HOME] = /usr/lib/oracle/12.2/client

7. 服务配置与启动

7.1 配置systemd服务

cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/

编辑服务文件:

[Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=simple PIDFile=/usr/local/php/var/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target

7.2 启动服务

systemctl start php-fpm systemctl enable php-fpm

8. 验证与优化

8.1 验证扩展安装

/usr/local/php/bin/php -m | grep -E 'oci|pdo'

应该能看到oci8和pdo_oci模块。

8.2 创建符号链接

ln -s /usr/local/php/bin/* /usr/local/bin/ ln -s /usr/local/php/sbin/* /usr/local/bin/

9. 提交镜像

9.1 清理无用文件

yum clean all rm -rf /tmp/* /var/tmp/*

9.2 提交镜像

docker commit php-oracle my-php-oracle:5.6

9.3 验证新镜像

docker run -it --rm my-php-oracle:5.6 php -m | grep oci

10. 生产部署建议

  1. 镜像优化:可以使用docker export/import进一步减小镜像体积
  2. 安全加固:删除编译过程中的临时文件和源码
  3. 版本管理:建议使用标签区分不同版本,如my-php-oracle:5.6-v1
  4. 数据库连接:在生产环境使用环境变量注入连接信息,而非硬编码

这个方案虽然步骤较多,但能完美解决老旧PHP项目连接Oracle的需求。我在实际项目中用这种方法部署了多个生产环境,稳定性经过验证。对于更现代的PHP版本,建议考虑使用官方Docker镜像配合pecl安装扩展会更简单。

相关新闻

  • C++核心概念解析:引用、内联函数与nullptr的实战应用
  • Digital Twin——IoT的下一个浪潮
  • 描述性分析四层校准法:从数据可信度到业务归因的实战框架

最新新闻

  • 从2D姿态到3D热图体:PoseConv3D如何重塑骨骼动作识别
  • CPM4OSSP-PROXY核心功能解析:软件包依赖管理的终极指南
  • 2026筑宅安|汕尾卫生间漏水专业维修,解决墙面潮湿发霉、渗水到楼下难题 - 筑宅安
  • TLS 1.3 握手过程动画级讲解 + Wireshark 验证
  • 掌握NVIDIA Wan2.2-T2V-A14B-Diffusers-NVFP4的提示词工程:从基础到高级创作技巧
  • 3分钟上手VibeThinker-3B-4bit:MLX框架下的极速部署指南

日新闻

  • AWS SSM安全运维实践:零公网暴露的合规远程开发方案
  • Tableau 2024.1 图表选择指南:5种业务场景与最佳图表类型匹配
  • dsPIC33FJ与CMT-8540S-SMT在嵌入式音频处理中的高效应用

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号