迁移使用pdo_oci连接oracle的php应用到kubernetes实践

一、建立镜像

传统上php应用会放到物理服务器上,服务器有的会使用linux系统,也有的会使用windows系统。如果我们想把php应用迁移到kubernetes上,最重要的就是建立php应用的镜像。在镜像中我们需要配置php的扩展,包括oci8和pdo_oci。

我们使用php官方提供的基础镜像,在官方镜像中配置了apache和php的基础应用环境,php的扩展需要自己安装。

由于众所周知的原因,国内链接国外官方的源不是很稳定所以笔者将源换成了163的源,大家也可以换成国内其他的源,比如阿里的源。

php的基础镜像没有安装太多的软件,为了安装oci8和pdo_oci我们需要自己安装一些软件。

安装oci8和pdo_oci之前我们还需要安装oracle的客户端,笔者使用的是oracle11g,需要提前下载或者建立镜像时下载,大家实际配置的时候安装对应的客户端就可以。然后我们还需要配置环境变量,配置完环境变量就可以使用php官方提供的方法安装oci8和pdo_oci。最后我们将php应用的源码放置到/var/www/html/中,镜像就配置完成了。

Dockerfile文件如下:

FROM php:5.6.36-apache
#设置源
RUN rm -rf /etc/apt/sources.list && \
echo “deb http://mirrors.163.com/debian/ stretch main non-free contrib” >/etc/apt/sources.list && \
echo “deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib” >>/etc/apt/sources.list && \
echo “deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib” >>/etc/apt/sources.list && \
echo “deb-src http://mirrors.163.com/debian/ stretch main non-free contrib” >>/etc/apt/sources.list && \
echo “deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib” >>/etc/apt/sources.list && \
echo “deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib” >>/etc/apt/sources.list && \
echo “deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib” >>/etc/apt/sources.list && \
echo “deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib” >>/etc/apt/sources.list

RUN apt-get update \
&& apt-get install -y unzip libaio-dev –no-install-recommends \
&& rm -r /var/lib/apt/lists/*

#安装客户端
ADD instantclient-basic-linux.x64-11.2.0.4.0.zip /tmp
ADD instantclient-sdk-linux.x64-11.2.0.4.0.zip /tmp
ADD instantclient-sqlplus-linux.x64-11.2.0.4.0.zip /tmp

RUN unzip /tmp/instantclient-basic-linux.x64-11.2.0.4.0.zip -d /usr/local/ \
&& unzip /tmp/instantclient-sdk-linux.x64-11.2.0.4.0.zip -d /usr/local/ \
&& unzip /tmp/instantclient-sqlplus-linux.x64-11.2.0.4.0.zip -d /usr/local/ \
&& ln -s /usr/local/instantclient_11_2/libclntsh.so.11.1 /usr/local/instantclient_11_2/libclntsh.so \
&& ln -s /usr/local/instantclient_11_2/libocci.so.11.1 /usr/local/instantclient_11_2/libocci.so \
&& ln -s /usr/local/instantclient_11_2/sqlplus /usr/bin/sqlplus \
&& rm -rf /usr/local/*.zip

#设置变量
ENV LD_LIBRARY_PATH /usr/local/instantclient_11_2
ENV TNS_ADMIN /usr/local/instantclient_11_2
ENV ORACLE_BASE /usr/local/instantclient_11_2
ENV ORACLE_HOME /usr/local/instantclient_11_2

#安装扩展
RUN docker-php-ext-configure pdo_oci –with-pdo-oci=instantclient,/usr/local/instantclient_11_2,11.2 \
&& echo ‘instantclient,/usr/local/instantclient_11_2/’ | pecl install oci8-2.0.12 \
&& docker-php-ext-install pdo_oci \
&& docker-php-ext-enable oci8

ADD . /var/www/html/

我们将Dockerfile文件放到源码的根目录下,运行建立镜像命令就可以建立镜像文件了。

二、迁移应用到kubernetes

按照正常方法建立kubernetes的Deployment和Service就可以,注意基础镜像的开放端口是80,所以Deployment的containerPort需要设置为80。

题外话

传统上php应用会通过配置ip的方式访问外部数据库,在kubernetes中也可以采用这种方式。Kubernetes还可以使用endpoint的方式映射外部服务,我们可以先建立endpoint映射外部oracle的服务,然后通过配置endpoint服务名的方式访问外部数据库。

我们也可以按照在linux物理机上安装oci8和pdo_oci的方法安装镜像,这也是可以行的通的,但是笔者建议还是按照php官方提供的方法安装oci8和pdo_oci,因为官方提供的方法可以保证安装后镜像大小足够小。

 

参考资料

作者简介:
王善鹏,北京神舟航天软件技术有限公司软件开发工程师。本文版权归原作者所有。

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址