¿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