티스토리 뷰

Oracle Client 가 설치된 PHP docker 이미지


레드햇에서 오픈시프트용으로 제공하는 PHP docker 이미지는 외부 Oracle DBMS와 연동할 수 없다. 이는 다음과 같은 이유에서이다.


PHP는 Java와 같이 DB접속용 thin client(jdbc driver)를 제공하지 않으며 Oracle DBMS에 접속할 때 OCI 방식을 사용한다. 그런데 기본 PHP 이미지에는 Oracle Client 가 설치되어 있지 않다.


이번 포스트에서는 레드햇에서 오픈시프트용으로 제공하는 PHP docker 이미지에 Oracle Client와 OCI8을 설치하여  외부 Oracle DBMS 와 연동이 가능한 PHP docker 이미지를 생성한다.



준비사항

  • docker - 로컬 PC에 docker 설치
  • 레드햇 PHP 이미지
  • glibc rpm 패키지
  • libaio rpm 패키지
  • php56 devel rpm 패키지
  • oracle instant client basic rpm 패키지
  • oracle instant client devel rpm 패키지
  • php.ini 파일




레드햇 PHP 이미지 다운로드


docker build를 할 로컬 PC에서


# docker pull registry.access.redhat.com/rhscl/php-56-rhel7:latest





docker images 명령으로 확인하면 위와 같이 다운로드 되어 있음을 확인할 수 있다.


이미지 이름에 docker repository 정보는 향후를 위해 변경한다(retagging).


# docker tag registry.access.redhat.com/rhscl/php-56-rhel7:latest php-56-rhel7:latest







Dockerfile 생성


php-56-rhel7 이미지를 기본 이미지로 사용하는데 해당 이미지를 생성한 Dockerfile이 어떻게 구성되어 있는지를 미리 확인하는 것이 좋다. 안타깝게도 현재는 레드햇에서 제공하는 이미지의 Dockerfile은 공개되지 않고 있으나 구글에서 찾아보면 git에 Dockerfile이 공개되어 있다(?!).


잘 살펴보면 rhel7 OS 이미지를 기본 이미지로 사용했으며(FROM) Linux OS에서 PHP 패키지를 yum을 이용해 설치하는 것을 알 수 있다. 그리고 마지막에는 1001 계정(USER)으로 변경한 다음에 $STI_SCRIPTS_PATH/usage 스크립트를 실행하는 형태이다.


Github에서 오픈된 Dockerfile

원문 : https://github.com/sclorg/rhscl-dockerfiles/blob/master/centos7.rh-php56/Dockerfile.rhel7


FROM openshift/base-rhel7


# This image provides an Apache+PHP environment for running PHP

# applications.


EXPOSE 8080


ENV PHP_VERSION=5.6 \

    PATH=$PATH:/opt/rh/rh-php56/root/usr/bin


LABEL io.k8s.description="Platform for building and running PHP 5.6 applications" \

      io.k8s.display-name="Apache 2.4 with PHP 5.6" \

      io.openshift.expose-services="8080:http" \

      io.openshift.tags="builder,php,php56,rh-php56"


# Labels consumed by Red Hat build service

LABEL Name="rhscl/php-56-rhel7" \

      BZComponent="rh-php56-docker" \

      Version="5.6" \

      Release="3" \

      Architecture="x86_64"


# Install Apache httpd and PHP

RUN yum-config-manager --enable rhel-server-rhscl-7-rpms && \

    yum-config-manager --enable rhel-7-server-optional-rpms && \

    yum install -y --setopt=tsflags=nodocs httpd24 \

    rh-php56 rh-php56-php rh-php56-php-mysqlnd rh-php56-php-pgsql rh-php56-php-bcmath \

    rh-php56-php-gd rh-php56-php-intl rh-php56-php-ldap rh-php56-php-mbstring rh-php56-php-pdo \

    rh-php56-php-pecl-memcache rh-php56-php-process rh-php56-php-soap rh-php56-php-opcache rh-php56-php-xml \

    rh-php56-php-pecl-xdebug && \

    yum clean all -y


# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH

COPY ./s2i/bin/ $STI_SCRIPTS_PATH


# Each language image can have 'contrib' a directory with extra files needed to

# run and build the applications.

COPY ./contrib/ /opt/app-root


# In order to drop the root user, we have to make some directories world

# writeable as OpenShift default security model is to run the container under

# random UID.

RUN sed -i -f /opt/app-root/etc/httpdconf.sed /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf && \

    sed -i '/php_value session.save_path/d' /opt/rh/httpd24/root/etc/httpd/conf.d/rh-php56-php.conf && \

    head -n151 /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf | tail -n1 | grep "AllowOverride All" || exit && \

    mkdir /tmp/sessions && \

    chmod -R a+rwx /etc/opt/rh/rh-php56 && \

    chmod -R a+rwx /opt/rh/httpd24/root/var/run/httpd && \

    chmod -R a+rwx /tmp/sessions && \

    chown -R 1001:0 /opt/app-root /tmp/sessions


USER 1001


# Set the default CMD to print the usage of the language image

CMD $STI_SCRIPTS_PATH/usage



일단 이거는 참고만 할 것이고 우리는 이렇게 만들어진 이미지를 기본 이미지로 해서 root 계정으로 변경한 다음, 필요한 패키지를 설치하고 다시 1001 계정으로 변경해서 동일하게 $STI_SCRIPTS_PATH/usage 스크립트를 실행해 볼 것이다.


생성한 Dockerfile

# Image with Linux Oracle instant client. 


FROM php-56-rhel7

MAINTAINER Yun In Su <ora01000@time-gate.com>


USER root

COPY ./glibc-2.17-157.el7_3.1.x86_64.rpm /tmp

COPY ./libaio-0.3.109-13.el7.x86_64.rpm /tmp


COPY ./php56-php-devel-5.6.30-2.el7.remi.x86_64.rpm /tmp

COPY ./oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm /tmp

COPY ./oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm /tmp

COPY ./rh-php56-php-devel-5.6.25-1.el7.x86_64.rpm /tmp

COPY ./rh-php56-php-pecl-jsonc-devel-1.3.6-3.el7.x86_64.rpm /tmp


RUN rpm -ivh --force /tmp/glibc-2.17-157.el7_3.1.x86_64.rpm

RUN rpm -ivh --force /tmp/libaio-0.3.109-13.el7.x86_64.rpm

RUN rpm -ivh --force /tmp/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm

RUN rpm -ivh --force /tmp/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm

RUN yum -y localinstall /tmp/rh-php* --nogpgcheck


RUN mkdir -p /usr/lib/oracle/12.1/client64/network/admin

RUN pecl install oci8-2.0.12

COPY ./php.ini /opt/rh/rh-php56/register.content/etc/opt/rh/rh-php56/php.ini

COPY ./php.ini /etc/opt/rh/rh-php56/php.ini



ENV ORACLE_HOME=/usr/lib/oracle/12.1/client64

ENV PATH=$PATH:$ORACLE_HOME/bin:/opt/rh/rh-php56/root/usr/lib64/php/modules

ENV LD_LIBRARY_PATH=$ORACLE_HOME/lib:/opt/rh/rh-php56/root/usr/lib64/php/modules

ENV TNS_ADMIN=$ORACLE_HOME/network/admin


USER 1001


RUN echo "-----------------------------------"

RUN echo $STI_SCRIPTS_PATH

CMD $STI_SCRIPTS_PATH/usage

 




Docker build


Dockerfile과 필요한 패키지 및 설정파일이 포함된 디렉토리에서 다음 명령을 수행한다.


# docker build -t <결과이미지>:<태크> <Dockerfile이 있는 디렉토리 경로>


ex)

# docker build -t php-56-rhel7-oracle:latest .


빌드 결과 이미지는 php56-rhel7-oracle:latest 이미지로 docker에 생성된다.




참고


Dockerfile에서 사용되는 rpm들은 미리 받아서 Dockerfile이 있는 디렉토리에 함께 있어야 한다.


  • glibc-2.17-157.el7_3.1.x86_64.rpm
  • libaio-0.3.109-13.el7.x86_64.rpm
  • php56-php-devel-5.6.30-2.el7.remi.x86_64.rpm
  • oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
  • oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
  • rh-php56-php-devel-5.6.25-1.el7.x86_64.rpm
  • rh-php56-php-pecl-jsonc-devel-1.3.6-3.el7.x86_64.rpm


참고


Dockerfile을 구성할 때 rpm을 컨테이너로 복사해서 만드는 것은 권장할 만한 방법은 아니다. 이는 복사된 rpm 파일이 삭제되지 않고 이미지에 남아 이미지 크기를 불필요하게 키우는 결과를 초래하기 때문이다. 가능하면 위 원본처럼 yum install 이나 wget 명령을 써서 다운로드/설치/삭제를 하나의 명령행으로 구성하는 것이 좋으나 보유한 yum repository에는 필요한 php 패키지가 없어서 어쩔 수 없이 rpm을 COPY한 것이다(그리고 시간이 부족......).


참고


마지막에 php.ini를 복사하는데 php에서 OCI 클라이언트를 사용하기 위해서는 아래 설정이 추가되어야 하기 때문이다.


extension=oci8.so


sed를 써서 화려하게 수정하고 싶지만 그럴 능력 부족 + 시간 부족으로 복사로 대체한다.



아래 첨부파일은 크기가 가장 큰 oracle-instantclient basic 만을 제외하고 모두 포함되어 있습니다.


php-oracle-dockerfile-sample.zip


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함