티스토리 뷰
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
'RedHat OpenShift > 기술문서' 카테고리의 다른 글
[빌드] eap64 custom build - JDK 버전 수정 (0) | 2017.03.07 |
---|---|
[기능] OPENSHIFT PIPELINES (TECHNOLOGY PREVIEW) (0) | 2017.02.08 |
[배포] 애플리케이션 PostgreSQL 배포(초간단버전) (0) | 2017.02.07 |
[설치] 오픈시프트 테스트 환경 설치(초간단버전) (0) | 2017.02.06 |
[기타] CLI 명령어 Part-4 (PV) (0) | 2017.02.06 |
- Total
- Today
- Yesterday
- XF23
- 캠핑
- 예전사진
- 전붙이기
- xf14mm
- SAVOR
- m42 55mm
- m42 135mm
- 연대앞
- m42
- Classic Chrome
- mf
- 논뷰
- velvia
- 야경
- 신촌
- xt3 #MMCA #국립현대미술관
- XF14
- 황용식
- 수지
- XT3
- 보문호수
- 손주등장
- 55mm
- 매거진스탠딩
- 필름시뮬레이션
- 23mm
- 브런치
- XF23mm
- 퍼플라떼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |