Docker para Bases de Datos

4
24671

En este tutorial vamos a comprobar como Docker nos va a facilitar el uso de Bases de Datos en nuestros proyectos.

0. Índice de contenidos

1. Introducción

Siguiendo con la serie de tutoriales dedicados a Docker:

, vamos a continuar con las BBDD y como Docker nos facilita su utilización dentro de nuestros proyectos.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 15' (2.3 GHz Intel Core i7, 16GB DDR3 SDRAM)
  • Sistema Operativo: Mac OS X El Capitan 10.11
  • Software: Docker 1.7

3. Objetivo

Lo que pretendemos, es poder integrar el uso de las bbdd más usadas del mercado (Oracle, DB2, Postgres) en nuestro entorno de desarrollo, sin
las engorrosas tareas de tener que instalárselas en nuestros equipos (en OSX esta tarea es casi imposible en muchos de los casos) y pudiéndola compartir con el resto de los miembros del equipo de una manera sencilla.

Para ello partiremos de imágenes disponibles en el Docker Hub con las versiones ‘express’ de los gestores (casos de DB2, Oracle) o con la versión oficial (Postgres) y las ‘enriqueceremos’ para crear nuestra propia BBDD, a partir de un ddl correspondiente a nuestro modelo.

Beneficios que nos aporta esta solución

  • Ahorro de espacio y consumo. (No tenemos la necesidad de crearnos maquinas virtuales en las que instalarlas)
  • Reutilización. Podemos crear tantas instancias necesitemos, destruirlas y reproducir el entorno inicial.
  • No ‘ensucia’. No tendremos que instalarlas dentro de nuestro equipo con la problemática que ello conlleva en algunos casos.
  • Compartir. Estas imágenes las podremos distribuir comodamente entre los componentes de nuestro equipo

El esquema que vamos a crear en los diferentes gestores es muy sencillo y lo ilustramos con la siguiente imagen:

4. Oracle

Por el momento Oracle no ha dejado disponible una versión de Oracle XE Dockerizada, por ello hemos seleccionado una de las imágenes disponibles de el Docker Hub wnameless/oracle-xe-11g

Esta imagen nos proporciona una Oracle Express 11g R2 sobre Ubuntu 14.04.1 LTS (más info sobre su uso en https://hub.docker.com/r/wnameless/oracle-xe-11g/ )

A partir de esta imagen, generaremos una nueva, con el esquema creado. Para ello vamos a crear un Dockerfile según describíamos en el tutorial
Docker for dummies

FROM wnameless/oracle-xe-11g

MAINTAINER jpacheco@autentia.com

ADD ddl.sql /ddl.sql

ENV ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe

ENV SQLPLUS=$ORACLE_HOME/bin/sqlplus

RUN service oracle-xe start;$SQLPLUS system/oracle@xe @ddl.sql;echo 'BBDD ready ...'

Vamos a describir los comandos del Dockerfile:

FROM : Indica la imagen que tomamos como base, en este caso wnameless/oracle-xe-11g

MAINTAINER: Especifica el autor de la imagen.

ADD: Añadimos nuestro ddl a la imagen.

ENV: Definimos unas variables de entorno en la imagen base.

  • ORACLE_HOME — Path de oracle
  • SQLPLUS — Path del SQLPLUS

RUN: Ejecutamos una serie de sentencias separadas por ;

  • service oracle-xe start : Arrancamos la instancia de oracle
  • $SQLPLUS system/oracle@xe @ddl.sql: Nos conectamos por sqlplus y ejecutamos el script ddl.sql
  • echo ‘BBDD ready …’ : Escribimos por consola

Una vez tengamos definido el fichero Dockerfile, vamos a construir la imagen:

docker build -t jpacheco/oracle-formacion .

Le estamos indicando a docker que construya una imagen con el nombre jpacheco/oracle-formacion a partir del DockerFile que se encuentra en la misma ruta donde ejecutamos el comando

Una vez finalizada la construcción de la imagen, ya estamos en disposición de arrancar un contenedor a partir de la imagen que hemos creado:

docker run -d -p 1521:1521 jpacheco/oracle-formacion

Arrancamos un contenedor, mapeando el puerto 1521 del contenedor con el 1521 de nuestra máquina, a partir de la imagen jpacheco/oracle-formacion.

Para comprobar que todo ha ido bien vamos a crearnos una conexión con
DBeaver tal como muestra la figura (username=system, password=oracle)

Podemos comprobar como esta nuestro esquema creado

5. DB2

Al contrario que en el caso anterior la gente de IBM nos ha dejado la imagen DB2 Express-C, bajo licencia Apache License 2.0.

Esta imagen nos proporciona una DB2 Express-C 10.5 sobre CentOS (más info sobre su uso en https://hub.docker.com/r/ibmcom/db2express-c/)

A partir de esta imagen, generaremos una nueva, con el esquema creado. Para ello vamos a crear el Dockerfile adecuado :

FROM ibmcom/db2express-c

MAINTAINER jpacheco@autentia.com

ENV DB2INST1_PASSWORD db2inst1

ENV LICENSE accept

ADD ddl.sql /ddl.sql

RUN su - db2inst1 -c "db2start;db2 -tvf /ddl.sql;echo 'BBDD ready ...'"

Vamos a describir los comandos del Dockerfile:

FROM : Indica la imagen que tomamos como base, en este caso ibmcom/db2express-c

MAINTAINER: Especifica el autor de la imagen.

ENV: Definimos unas variables de entorno en la imagen base.

  • DB2INST1_PASSWORD — Password del usuario
  • LICENSE — Aceptamos la licencia

ADD: Añadimos nuestro ddl a la imagen.

RUN: Ejecutamos una serie de sentencias separadas por ; bajo el usuario ‘db2inst1’: su – db2inst1 -c «….»

  • db2start : Arrancamos la instancia de db2
  • db2 -tvf /ddl.sql: Ejecutamos el script ddl.sql
  • echo ‘BBDD formación ready …’ : Escribimos por consola

Una vez tengamos definido el fichero Dockerfile, vamos a construir la imagen:

docker build -t jpacheco/db2-formacion .

Le estamos indicando a docker que construya una imagen con el nombre jpacheco/db2-formacion a partir del DockerFile que se encuentra en la misma ruta donde ejecutamos el comando

Una vez finalizada la construcción de la imagen, ya estamos en disposición de arrancar un contenedor a partir de la imagen que hemos creado:

docker run -d -p 50000:50000 jpacheco/db2-formacion db2start

Arrancamos un contenedor, mapeando el puerto 50000 del contenedor con el 50000 de nuestra máquina, ejecutando el comando db2start (arranca la BBDD)

Para comprobar que todo ha ido bien vamos a crearnos una conexión con DBeaver tal como muestra la figura (username=db2inst1, password=db2inst1)

Podemos comprobar como esta nuestro esquema creado

6. Postgres

Postgres dispone de un repositorio official dentro de Docker Hub
postgres repo donde podemos encontrar diferentes versiones del gestor.

El funcionamiento de esta imagen difiere de las anteriores, mientras en las imágenes anteriores creábamos un Dockerfile en el
que levantabamos la BBDD, ejecutábamos el script de creación generando una imagen con el esquema creado, con postgres, lo único que tenemos
que realizar es dejar el ddl en un directorio determinado y este se ejecutará cuando arranque el contenedor. (docker run ….)

FROM postgres

MAINTAINER jpacheco@autentia.com

ENV POSTGRES_PASSWORD admin

ENV POSTGRES_DB formacion

ADD ddl.sql /docker-entrypoint-initdb.d/ddl.sql

Vamos a describir los comandos del Dockerfile:

FROM : Indica la imagen que tomamos como base, en este caso postgres 9.4.5

MAINTAINER: Especifica el autor de la imagen.

ENV: Definimos unas variables de entorno en la imagen base.

  • POSTGRES_PASSWORD — Password del usuario
  • POSTGRES_DB — Nombre de la BBDD

ADD: Añadimos nuestro ddl al directorio docker-entrypoint-initdb.d de la imagen. Este se ejecutará al crear el contenedor

Una vez tengamos definido el fichero Dockerfile, vamos a construir la imagen:

docker build -t jpacheco/postgres-formacion .

Le estamos indicando a docker que construya una imagen con el nombre jpacheco/postgres-formacion a partir del DockerFile que se encuentra en la misma ruta donde ejecutamos el comando

Una vez finalizada la construcción de la imagen, ya estamos en disposición de arrancar un contenedor a partir de la imagen que hemos creado:

docker run -p 5432:5432 -d jpacheco/postgres-formacion

Arrancamos un contenedor, mapeando el puerto 5432 del contenedor con el 5432 de nuestra máquina.

Este contenedor al arrancar creará y configurará la instancia de la BBDD (con el nombre POSTGRES_DB) y ejecutará los scripts que se encuentre en el directorio /docker-entrypoint-initdb.d/

Para comprobar que todo ha ido bien vamos a crearnos una conexión con DBeaver tal como muestra la figura (username=postgres, password=admin)

Podemos comprobar como esta nuestro esquema creado

7. Conclusiones

Como hemos podido ver, de una manera muy sencilla, podemos disponer de diferentes gestores de BBDD listos para poder usarlos en nuestros diferentes desarrollos.

Un siguiente paso sería poder integrar estos contenedores en nuestros test de integración, pero esto lo dejo para otro tutorial 😉

Aquí os dejo el código utilizado

Un saludo.

8. Referencias

4 COMENTARIOS

  1. Muy buen tutorial, pero tengo una duda se muy bien que lo que se describio aquí es para entornos de desarrollo , pero en producción ? , cual seria el mejor metodo para crear un backup de la base de datos si se encuentra en una imagen de docker?, hablo de un backup con la información que tiene dentro nuestra BD, eso es en cuanto a base de datos, pero si hablamos de que tenemos un repositorio de git u otra cosa como respaldas esa información, creo que seria bueno un tutorial sobre como crear backups de tus imagenes de docker.

    Saludos.

  2. Enhorabuena por el tutorial, tanto este como los anteriores. Las posibilidades que ofrece docker son muy interesantes, nos puede permitir montar entornos personalizados a medida de nuestras necesidades.
    Eres un crack Jorge!! 😉

  3. Hola,
    he seguido tu tutorial y obtengo un error cuando creo mi imagen, el error es el siguiente
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM wnameless/oracle-xe-11g
    —> 38037473cce1
    Step 2 : MAINTAINER jpacheco@autentia.com
    —> Using cache
    —> 9c7a1109bdfb
    Step 3 : ADD ddl.sql /ddl.sql
    lstat ddl.sql: no such file or directory

    Podrias ayudarme?

  4. El ddl.sql se descarga del repositorio de Jorge:

    a) Echa un vistado a: «Paso 7. Conclusiones»
    b) Click en: «Aquí os dejo el código utilizado»
    c) Cada SGBD tiene su carpeta, en el interior un ddl.sql especifico

    Saludos
    Miguel

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad