miércoles, 11 de abril de 2018

Usar Oracle 12c en Docker sobre Windows 10 con Oracle Container Registry

¿Docker? ¿En Windows? ¿Oracle en Docker?

Docker es de las más populares tecnología de containers y funciona en Linux, Windows y Mac OS.
Oracle se puede usar con Docker pero no está soportado para ambientes de producción todavía, como se explica en la nota de soporte “2216342.1 Oracle Support for Database Running on Docker”.

Pueden ver una introducción más completa al tema este artículo que publiqué en OTN, donde muestro los pasos necesarios para instalar y ejecutar una base Oracle usando el repositorio GIT oracle/docker-images.

En este blog vamos a ver otra forma de hacerlo, usando Oracle Container Registry, también sobre Windows 10.
Al usar imagenes de Oracle Container Registry no necesitamos descargar los binarios de instalación de Oracle desde OTN porque vienen incluidos. Por el momento están disponibles imágenes con las versiones 12.2.0.1 y 12.1.0.2.

Primer paso: registrarse en container-registry.oracle.com

Esto es gratuito, debemos entrar con nuestro usuario de OTN (crearlo también es gratuito) y aceptar las políticas uso.
Son sólo esos dos pasos, pero si les quedan dudas pueden ver una explicación detallada acá (en inglés).

Como pueden ver, al día de hoy tenemos dos ediciones disponibles (standard y enterprise) y el cliente:



Siguiendo cualquier de los tres links vamos a la documentación, que explica como usar cada imagen en las dos versiones disponibles. Es la referencia para cualquier cambio en la configuración que nos interese hacer.

Ya creamos nuestro usuario y aceptamos los términos de uso.
Lo siguiente es abrir una terminal en nuestro PC e iniciar sesión con Docker:
    C:\Users\calero>docker login container-registry.oracle.com
    Username: nelson.calero@gmail.com
    Password:
    Login Succeeded

Mientras no hayamos hecho los dos pasos anteriores, si intentamos bajar una imagen vamos a tener este error:
    C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise
    Using default tag: latest
    Error response from daemon: pull access denied for container-registry.oracle.com/database/enterprise, repository does not exist or may require 'docker login'

Pero si hicimos ambos pasos, podemos descargar la imagen con la que nos interesa trabajar.
En este ejemplo vamos a usar la version 12.2.
La sintaxis para esta URL la vemos en la página de OCR que visitamos antes con la documentación.    
C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise:12.2.0.1
12.2.0.1: Pulling from database/enterprise
9bd4d110366e: Downloading [>                                                  ]  2.668MB/143MB
af8b29651e27: Download complete
4c242ab1add4: Download complete

Vemos el progreso de la descarga en nuestra terminal.
Cuando está completa, después de bajar 3.44Gb:
C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise:12.2.0.1
cbb9821ba51c: Pull complete
9bd4d110366e: Pull complete
af8b29651e27: Pull complete
4c242ab1add4: Pull complete
7bda1e55bd08: Pull complete
Digest: sha256:42809e491491d7f07a2aa76903bb5feabe3a0d23abcb7e680264074f043a604c  5.853MB/2.737GB
Status: Downloaded newer image for container-registry.oracle.com/database/enterprise:12.2.0.1

Podemos consultar en docker los detalles de la imagen recién bajada:
    C:\Users\calero>docker images
    REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
    container-registry.oracle.com/database/enterprise   12.2.0.1            12a359cd0528        5 months ago        3.44GB

Y también comprobar que no está ejecutando:
    C:\Users\calero>docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

La documentación de la imagen docker (misma URL que visitamos antes) explica que debemos crear una mínima configuración antes de poder ejecutar nuestro container.
En mi caso sólo definí la memoria RAM a usar:
    C:\Users\calero>d:

    D:\>cd github

    D:\GitHub>echo DB_MEMORY=1Gb >ora.conf

    D:\GitHub>type ora.conf
    DB_MEMORY=1Gb

Y levantamos nuestro container, indicando el archivo de configuración a usar:
    D:\GitHub>docker run -d -it --name ora122 -P --env-file ora.conf container-registry.oracle.com/database/enterprise:12.2.0.1
    5896d37c1cae083c9ab82ec52cf9900a3b22a012b5257c1cb065a6093d7d55c5

La terminal nos devuelve el control enseguida porque docker queda ejecutando en un proceso del sistema.
Podemos ver el avance del inicio del containter consultando su log.
De nuevo en nuestra terminal, usamos la opcion -f de "docker logs" para ver los cambios que recibe el log sin que nos retorne el control.

    D:\GitHub>docker logs -f 5896d37c1cae083c9ab82ec52cf9900a3b22a012b5257c1cb065a6093d7d55c5
    Setup Oracle Database
    Oracle Database 12.2.0.1 Setup
    Sun Feb 11 21:09:42 UTC 2018

    Check parameters ......
    log file is : /home/oracle/setup/log/paramChk.log
    paramChk.sh is done at 1 sec

    untar DB bits ......
    log file is : /home/oracle/setup/log/untarDB.log
    untarDB.sh is done at 329 sec

    config DB ......
    log file is : /home/oracle/setup/log/configDB.log
    Sun Feb 11 21:15:10 UTC 2018
    Start Docker DB configuration
    Call configDBora.sh to configure database
    Sun Feb 11 21:15:11 UTC 2018
    Configure DB as oracle user
    Setup Database directories ...

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:15:11 2018

    Copyright (c) 1982, 2016, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL>
    File created.

    SQL> ORACLE instance started.

    Total System Global Area  671088640 bytes
    Fixed Size                  8796384 bytes
    Variable Size             192939808 bytes
    Database Buffers          465567744 bytes
    Redo Buffers                3784704 bytes
    Database mounted.
    Database opened.
    SQL>
    Database altered.

    SQL>
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      /u01/app/oracle/product/12.2.0
                                                     /dbhome_1/dbs/spfileORCLCDB.or
                                                     a
    SQL>
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    encrypt_new_tablespaces              string      CLOUD_ONLY
    SQL>
    User altered.

    SQL>
    User altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    update password

    Enter password for SYS:
    create pdb : ORCLPDB1

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:16:12 2018

    Copyright (c) 1982, 2016, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL>   2    3    4    5
    Pluggable database created.

    SQL>
    Pluggable database altered.

    SQL>
    Pluggable database altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    Reset Database parameters

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:17:49 2018

    Copyright (c) 1982, 2016, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL>
    System altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 11-FEB-2018 21:17:49

    Copyright (c) 1991, 2016, Oracle.  All rights reserved.

    Starting /u01/app/oracle/product/12.2.0/dbhome_1/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 12.2.0.1.0 - Production
    System parameter file is /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
    Log messages written to /u01/app/oracle/diag/tnslsnr/5896d37c1cae/listener/alert/log.xml
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
    Start Date                11-FEB-2018 21:17:54
    Uptime                    0 days 0 hr. 0 min. 4 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
    Listener Log File         /u01/app/oracle/diag/tnslsnr/5896d37c1cae/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    The listener supports no services
    The command completed successfully

    DONE!
    Remove password info
    Docker DB configuration is complete !
    configDB.sh is done at 493 sec

    Done ! The database is ready for use .
    # ===========================================================================
    # == Add below entries to your tnsnames.ora to access this database server ==
    # ====================== from external host =================================
    ORCLCDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLCDB.localdomain)))
    ORCLPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLPDB1.localdomain)))
    #
    #ip-address : IP address of the host where the container is running.
    #port       : Host Port that is mapped to the port 1521 of the container.
    #
    # The mapped port can be obtained from running "docker port "
    # ===========================================================================
      Current log# 1 seq# 4 mem# 0: /u04/app/oracle/redo/redo001.log
    2018-02-11T21:17:48.196143+00:00
    ORCLPDB1(3):Opening pdb with no Resource Manager plan active
    Pluggable database ORCLPDB1 opened read write
    Completed:     alter pluggable database ORCLPDB1 open
    2018-02-11T21:17:49.269276+00:00
        alter pluggable database all save state
    Completed:     alter pluggable database all save state
    2018-02-11T21:17:49.666526+00:00
    ALTER SYSTEM SET encrypt_new_tablespaces='DDL' SCOPE=BOTH;
    2018-02-11T21:25:41.683157+00:00
    Resize operation completed for file# 3, old size 706560K, new size 727040K
    2018-02-11T21:25:42.432198+00:00
    ORCLPDB1(3):Resize operation completed for file# 18, old size 583680K, new size 604160K
    2018-02-11T21:26:53.618735+00:00
    Thread 1 advanced to log sequence 5 (LGWR switch)
      Current log# 2 seq# 5 mem# 0: /u04/app/oracle/redo/redo002.log
    2018-02-11T21:31:52.534344+00:00
    Thread 1 advanced to log sequence 6 (LGWR switch)
      Current log# 3 seq# 6 mem# 0: /u04/app/oracle/redo/redo003.log

     
Después de unos minutos nuestra base está lista para ser usada, así que podemos cancelar el despliegue de logs o abrir otra terminal para comprobarlo:
    D:\GitHub>docker ps
    CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS                    PORTS                                              NAMES
    5896d37c1cae        container-registry.oracle.com/database/enterprise:12.2.0.1   "/bin/sh -c '/bin/ba…"   24 minutes ago      Up 24 minutes (healthy)   0.0.0.0:32769->1521/tcp, 0.0.0.0:32768->5500/tcp   ora122

Podemos abrir una sesion ssh a nuestro container y revisar cómo quedó:
    D:\GitHub>docker exec -i -t 5896d37c1cae /bin/bash
    [oracle@5896d37c1cae /]$ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    none             94G   29G   61G  32% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs          1002M     0 1002M   0% /sys/fs/cgroup
    /dev/sda1        94G   29G   61G  32% /ORCL
    shm              64M     0   64M   0% /dev/shm
    tmpfs          1002M     0 1002M   0% /proc/scsi
    tmpfs          1002M     0 1002M   0% /sys/firmware
    [oracle@5896d37c1cae /]$ ps -eaf | grep pmon
    oracle     112     1  0 21:15 ?        00:00:00 ora_pmon_ORCLCDB
    oracle     991   973  0 21:36 pts/1    00:00:00 grep --color=auto pmon
    [oracle@5896d37c1cae /]$ env | grep ORA
    ORACLE_SID=ORCLCDB
    ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
    [oracle@5896d37c1cae /]$ sqlplus / as sysdba

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:37:06 2018

    Copyright (c) 1982, 2016, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL> show sga

    Total System Global Area  671088640 bytes
    Fixed Size                  8796384 bytes
    Variable Size             230688544 bytes
    Database Buffers          427819008 bytes
    Redo Buffers                3784704 bytes
    SQL> show pdbs

        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 ORCLPDB1                       READ WRITE NO
    SQL> show parameter sga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    allow_group_access_to_sga            boolean     FALSE
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     TRUE
    sga_max_size                         big integer 640M
    sga_min_size                         big integer 0
    sga_target                           big integer 640M
    unified_audit_sga_queue_size         integer     1048576
    SQL> show parameter pga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_limit                  big integer 2G
    pga_aggregate_target                 big integer 384M
    SQL> exit
    Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Los archivos usados por Docker para configurar nuestra base están dentro del container, tal como se vio en los logs más arriba. Podemos revisar cuales son todos estos scripts, por si nos interesa hacerles cambios:
    [oracle@5896d37c1cae /]$ cd /home/oracle/setup
    [oracle@5896d37c1cae setup]$ ls -lrt
    total 60
    -rwxr-xr-- 1 oracle oinstall 1340 Aug 17 20:42 untarDB.sh
    -rwxr-xr-- 1 oracle oinstall 1708 Aug 17 20:42 tnsentry.sh
    -rwxr-xr-- 1 oracle oinstall 1361 Aug 17 20:42 startupDB.sh
    -rwxr-xr-- 1 oracle oinstall 1298 Aug 17 20:42 shutDB.sh
    -rwxr-xr-- 1 oracle oinstall 3019 Aug 17 20:42 setupDB.sh
    -rwxr-xr-- 1 oracle oinstall 1229 Aug 17 20:42 patchDB.sh
    -rwxr-xr-- 1 oracle oinstall   18 Aug 17 20:42 patchDB.dat
    -rwxr-xr-- 1 oracle oinstall 1782 Aug 17 20:42 paramChk.sh
    -rwxr-xr-- 1 oracle oinstall  763 Aug 17 20:42 healthcheck.sh
    -rwxr-xr-- 1 oracle oinstall 2165 Aug 17 20:42 dockerInit.sh
    -rwxr-xr-- 1 oracle oinstall 6587 Aug 17 20:42 configDBora.sh
    -rwxr-xr-- 1 oracle oinstall 1476 Aug 17 20:42 configDB.sh
    drwxr-xr-- 2 oracle oinstall 4096 Feb 11 21:15 log
    -rw-r--r-- 1 oracle oinstall  163 Feb 11 21:17 DB_ENV
    [oracle@5896d37c1cae setup]$ ls -lrt log
    total 20
    -rw-r--r-- 1 oracle oinstall  292 Feb 11 21:09 paramChk.log
    -rw-r--r-- 1 oracle oinstall  127 Feb 11 21:09 untarDB.log
    -rw-r--r-- 1 oracle oinstall 3542 Feb 11 21:17 configDB.log
    -rw-r--r-- 1 oracle oinstall  404 Feb 11 21:17 setupDB.log
    -rw-r--r-- 1 oracle oinstall   52 Feb 11 21:17 dockerInit.log
    [oracle@5896d37c1cae setup]$

También podemos conectarnos a la instancia de base de datos usando un cliente instalado en nuestro host, en vez de usar la instalación de Oracle dentro del container.
Los puertos usados por Oracle vienen mapeados en esta imagen para que se puedan usar fuera del container:
    D:\GitHub>docker port ora122
    5500/tcp -> 0.0.0.0:32768
    1521/tcp -> 0.0.0.0:32769

Revisando los logs de creación del contanier que vimos antes, podemos identificar los datos que se necesitan para armar el string de conexión a la base de datos, y usar sqlplus instalado en el PC para conetarnos:
    D:\GitHub>docker-machine ip
    192.168.99.100

    D:\GitHub>sqlplus system/Oradoc_db1@//192.168.99.100:32769/ORCLPDB1.localdomain

    SQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 11 18:51:14 2018

    Copyright (c) 1982, 2014, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL> exit
    Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Espero les sea útil.
Un saludo

No hay comentarios.:

Publicar un comentario