Despliegue de Oracle HTTP Server 12c sobre Containers Docker

Por Francisco Riccio Oracle ACE
Publicado en Julio 2017


Introducción

Este artículo está enfocado a explicar el concepto básico de Containers y su implementación mediante Docker para desplegar un Oracle HTTP Server 12c (OHS).

Los containers son softwares de “virtualización” que utilizan ciertas capacidades de cómputo dentro de un sistema operativo de manera aislada para ejecutar una aplicación determinada sin importar algunos aspectos del anfitrión que lo alberga.

Algo interesante, es que los containers son ligeros y portables, porque puedo trasladarlos entre diferentes sistemas operativos con la finalidad de ejecutar nuestra aplicación sin importar los softwares que tenga instalado el Sistema Operativo anfitrión, utilizando los recursos más básicos.

Hoy los contenedores son una de las herramientas más utilizadas en un Cloud PaaS y disponible en muchos proveedores de Nube como: IBM, Oracle, Microsoft, Amazon, etc.

Entre los líderes de Containers se encuentra Docker (https://www.docker.com/), siendo una tecnología open-source y nos permite un fácil entorno de despliegue de nuestras aplicaciones mediante contenedores.

Mi implementación estará enfocada en un ambiente On-Premise y se detallará todas las fuentes publicadas por Oracle para el correcto soporte y certificación de su producto sobre esta tecnología.

Implementación

Docker puede ser descargado para el S.O Linux en la mayoría de distribuciones conocidas y Windows.

Asimismo Oracle ha certificado múltiples productos sobre Docker entre ellos: Oracle Database y Oracle Weblogic pero para ello debemos cumplir con ciertas especificaciones definidas.

Para esta implementación nos guiaremos de la siguiente matriz de certificación:

http://www.oracle.com/technetwork/middleware/ias/oracleas-supported-virtualization-089265.html

Asimismo recomiendo revisar las siguientes notas de Oracle Support:

  • Oracle Weblogic 12.2.1 Support On Docker Multicontainer (Doc ID 2140342.1)
  • Support for Oracle WebLogic Server Running in Docker Containers on Non-Certified Linux Host Operating Systems (Doc ID 2017945.1)

Realizaremos la instalación sobre Oracle Linux versión 7 Update 3 con el Kernel Unbreakable Enterprise, versiones inferiores no están soportadas. Los instaladores de Docker para dicha distribución están disponibles en el siguiente url: https://www.docker.com/docker-oracle-linux.

I. Instalación

La guía de instalación se encuentra documentado en el siguiente url: https://docs.docker.com/engine/installation/linux/oracle/#os-requirements

En una instalación básica de Oracle Linux 7.3, los siguientes paquetes serán solicitados:

01

Los paquetes marcados con color rojo son proporcionados por Docker al momento de descargar el producto.

Una vez instalado los pre-requisitos se procede a instalar Docker.

02

Nota: La distribución gratuita de Docker no está soportada para Oracle Linux. Se recomienda revisar el siguiente url:

https://docs.docker.com/engine/installation/

Terminada la instalación, procedemos con la activación de los servicios.

Habilitando e Iniciando el Servicio de Docker:

03

Nota: Recomiendo por temas de simplicidad detener el firewall incluido en Oracle Linux 7 con la finalidad de no tener puertos cerrados. Esto lo conseguimos con el comando: systemctl stop firewalld. Este comando debe ser ejecutado antes de subir los servicios de Docker.

II. Comandos Básicos

a) Validando la Versión de Docker:

04

b) Información completa de la Instancia Docker:

05

c) Listado de Imágenes:

06

d) Listado de Containers:

07

Nota: Todas los comandos están disponible a través de la ayuda: docker --help.

III. Creando Imagen

Una imagen en Docker, es una plantilla que cuenta con una serie de softwares instalados y que servirá para instanciar Containers. Los Containers harán copias de todos los archivos que irán modificando en el tiempo. Es importante notar que la imagen es estática y no será alterado por los Containers que la instancien.

Para crear la imagen que nos permitirá desplegar un Oracle HTTP Server 12c debemos seguir los siguientes pasos:

a) Creamos una carpeta.

08

b) El archivo oraclelinux-7.3-rootfs.tar.xz complementará a nuestra imagen con una serie de comandos básicos de Linux.

Dicho archivo se encuentra en el repositorio de Oracle:

https://github.com/oracle/docker-images/tree/OracleLinux-images/OracleLinux/7.3

El archivo lo copiamos en la carpeta previamente creada.

c) Descargamos la versión de Java 1.8 del siguiente url: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Procedemos a copiar el instalador descomprimido en la carpeta previamente mencionada.

d) Copiar los siguientes archivos personalizados en el directorio ohs.

  • Dominio que queremos desplegar en Docker. En mi caso a través del utilitario pack ($OH/ oracle_common/common/bin) generé el archivo web_friccio.jar que contiene el dominio que deseo desplegar.
  • Generar un archivo Response File (rsp) de la Instalación de Oracle HTTP Server para ejecutarlo en modo no asistido.
  • Crear el archivo oraInst.loc con el siguiente contenido:

    inventory_loc=/u01/app/oraInventory
    inst_group=oinstall
    

  • Generar archivos que nos permitan iniciar el servicio de NodeManager y de OHS.
    En mi implementación he creado 2 archivos para este fin.
    • startall.sh
      sh /u01/app/oracle/product/middleware/Oracle_Home_1/user_projects/
      domains/web_friccio/bin/startNodeManager.sh &
      sleep 5
      sh /u01/app/oracle/product/middleware/Oracle_Home_1/oracle_common/
      common/bin/wlst.sh /u01/start-ohs.py
      echo "EJECUTÁNDOSE - OHS"
      read
      


    • start-ohs.py (Utilizando WLST).
      import os, sys
      java_home=os.environ.get("JAVA_HOME","/usr/java/jdk1.8.0_131")
      nm_pass=os.environ.get("NM_PASSWORD","oraclesqldb2")
      ohs_comp_name=os.environ.get("OHS_COMPONENT_NAME","ohs1")
      domain_name=os.environ.get("DOMAIN_NAME","web_friccio")
      domain_path='/u01/oracle/ohssa/user_projects/domains/' + domain_name
      oracle_home = os.environ.get("ORACLE_HOME","/u01/app/oracle/
      product/middleware/Oracle_Home_1")
      nmConnect(username='weblogic',password=nm_pass,domainName=domain_name)
      nmServerStatus(serverName=ohs_comp_name,serverType='OHS')
      nmStart(serverName=ohs_comp_name,serverType='OHS')
      nmServerStatus(serverName=ohs_comp_name,serverType='OHS')
      exit()
      


e) Identificar los rpms requeridos para certificar el Sistema Operativo y los copiamos en una sub-carpeta de ohs.

Después de estos puntos, tendríamos los siguientes archivos:

09

f) Creamos el archivo de configuración de la imagen, para ello creamos un archivo con el nombre Dockerfile con el siguiente contenido:

10

Donde:

LÍNEA EXPLICACIÓN
1 Toda imagen debe basarse en una imagen y en este caso la imagen SCRATCH es la imagen más básica que presenta Dockers.
2 Copiamos desde nuestro servidor el archivo oraclelinux-rootfs.tar.xz al entorno virtualizado en Dockers en la raíz del Sistema Operativo.
3 El comando RUN nos permite ejecutar un comando en el entorno virtualizado. En este caso creamos dos carpetas: /install y /install/rpm.
4-9 Copiamos todos los archivos mencionados en los puntos previos en las respectivas carpetas.
10 El comando COPY es similar al comando RUN con la única diferencia que si existe un archivo comprimido lo descomprime si es conocido el formato.
11 El comando WORKDIR permite ubicarnos en una carpeta específica para ejecutar algún comando posteriormente.
12-16 Procedemos a instalar todos los paquetes requeridos para contar con el Sistema Operativo certificado. Por temas didácticos he instalado solo los principales. Recomiendo configurar el repositorio YUM para simplificar la instalación de los pre-requisitos.
17-20 Procedemos a instalar JAVA 1.8 en el entorno virtualizado por Docker.
21-23 Creamos el grupo oinstall y el usuario oracle con el password “riccio”. Estos pasos son requeridos para realizar posteriormente la instalación de Oracle HTTP Server 12c.
24-26 Definimos el oraInventory y entregamos los accesos adecuados.
27 y 38 Copiamos los archivos que nos permitirán iniciar el NodeManager y el OHS.
28 Nos logueamos con el usuario oracle.
29-33 Procedemos a definir las variables de ambiente e instalamos Oracle HTTP Server 12c de manera no asistida.
34-37 Procedemos a copiar el Dominio en el Oracle_Home previamente desplegado.
39-40
y 42
Procedemos a entregar los correctos permisos a los archivos que permitirán subir los servicios.
41 Procedemos a publicar los puertos que deseamos que el servidor anfitrión pueda tener acceso, en este caso sería el puerto 7777.
42 Procedemos a ejecutar los scripts que permiten iniciar los servicios NodeManager y OHS.

La diferencia entre el comando RUN y CMD es que el primero se ejecuta durante la fase de BUILD, el segundo se ejecuta en la fase de RUN.

Adicionalmente el comando CMD solo puede ser especificado 1 vez, si hay más los omitirá.

e) Construimos la imagen.

docker build --force-rm=true -t "ohs/friccio:v1" .

Donde el parámetro –t indica el nombre y tag adicional de la imagen.

Al ejecutar el comando deberíamos tener una salida como se presenta:

11

Posterior a la creación deberíamos visualizarlo:

12

Cabe mencionar que la imagen se almacenará en la ruta: /var/lib/Docker como veremos a continuación:

13

Nota: Si en algún momento tenemos problemas con el punto de montaje overlay2 simplemente procedemos a ejecutar los siguientes pasos para recrearlo:

  • Desmontar el punto de montaje (umount / var/lib/docker/overlay2).
  • rm –Rf /var/lib/docker
  • systemctl restart docker.

IV. Creando Container

Un Container en Docker es la instancia de una imagen, donde una imagen podría tener n contenedores y cada uno de ellos es independiente.

Para crear y ejecutar un container ejecutamos cualquiera de los siguientes comandos:

  • docker run -i -t ohs/friccio:v1 (Inicia en modo Asistido)
  • docker run -d -t ohs/friccio:v1 (Inicia en modo Background)

Para visualizar los containers en ejecución ejecutamos lo siguiente:

14

Para nuestra implementación he agregado los siguientes parámetros adicionales:

  • -m 6G => Definí un límite de 8 GB (Incluyendo la memoria SWAP) para el ambiente virtualizado. Si deseamos excluir la memoria SWAP de manera independiente podemos utilizar el parámetro --memory_swap).
  • -p 7778:7777 => Aquí permitimos que el servidor anfitrión pueda publicar por el puerto 7778 el contenido que está presentando el ambiente virtualizado en Docker por el puerto 7777. Si también necesitamos definir por una ip específica, podemos configurarlo de la siguiente manera: -p IP:PUERTO_ANFITRION:PUERTO_VIRTUAL. Asimismo si necesitamos definir el protocolo UDP, simplemente agregamos al final /udp (7778:7777/udp).

Algunas operaciones sobre Containers que nos pueden servir:

  • docker start –t “” => Inicia un Container previamente creado.
  • docker stop –t “” => Detiene un Container.
  • docker rm –t “” => Elimina un Container.
  • docker rmi –t “” => Elimina una Imagen.
  • docker exec -t “ => Permite ejecutar comandos a nivel de S.O a un Container en ejecución, ejemplo:

    15

    Aquí estamos mostrando todos los procesos que están ejecutándose que pertenecen al usuario Oracle dentro del entorno virtualizado.

Por último procedemos a probar la página web por defecto que se encuentra en Oracle HTTP Server. Para ello, nos conectaremos a la IP del servidor Oracle Linux 7.3 a través del puerto 7778, donde este, está haciendo NAT al puerto 7777 del entorno virtual en Docker.

16

Conclusión

Como podemos apreciar, hoy tenemos una tecnología disponible desde hace unos años que nos permite ir a otro nivel de virtualización distinto, permitiéndonos obtener las siguientes ventajas:

  • Instalación simple y capacidad de ejecutar múltiples aplicaciones en entornos aislados sobre un mismo sistema operativo, permitiéndonos ahorrar horas de trabajo en la administración de Infraestructura.
  • Independiente a la plataforma, permite contar con soluciones más portables.
  • Despliegue de Aplicaciones mucho más rápida y flexible.
  • Disponible en múltiples proveedores de Nube.

Asimismo es importante siempre validar la matriz de certificación en caso exista del producto a desplegar con la finalidad de contar con una solución estable y con soporte.


Ing. Francisco Riccio. Es un Cloud Architect en IBM Perú e instructor de cursos oficiales de certificación Oracle. Está reconocido por Oracle como un Oracle ACE y certificado en productos de Oracle Application & Base de Datos.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.