martes, 19 de septiembre de 2023

Oracle 7 - Nuevo enfoque (4).Preparando el sistema de archvos docker para hacer backups de Oracle.

 0. Introducción

Créditos 

https://www.tutorialspoint.com/how-to-copy-files-from-host-to-docker-container

https://www.baeldung.com/linux/docker-mount-host-filesystem#:~:text=To%20mount%20a%20filesystem%20within,container%20target%20directory%20path

https://www.baeldung.com/linux/docker-container-add-volume

http://www.rebellionrider.com/?s=expdp

http://www.rebellionrider.com/?s=impdp

http://www.rebellionrider.com/?s=rman

1. Eligiendo un destino de las copias de seguridad

Se pueden hacer copias de seguridad dentro del sistema de ficheros propios del contenedor o también el el propio servidor físico.

2. Backups dentro  del sistema de ficheros docker

Se pueden hacer copias de seguridad dentro del sistema de ficheros propios del contenedor o también el el propio servidor físico.

En el primer caso utilizaremos el comando docker cp para copiar los ficheros entre el servidor físico y el contenedor docker tal como vimos en la entrada anterior:

#1. Listar los contenedores activos para ver su nombre
docker ps

#2. Copiar un fichero del servidor al contenedor
docker cp <src-path> <container-name>:<dest-path> 

#3. Copiar un fichero desde el contenedor al servidor
docker cp <container>:<src-path> <local-dest-path> 

3. Backups en carpetas compartidas con el servidor

OJO: No se debe compartir directamente una carpeta con un contenedor existente. Se puede hacer de forma no recomendable segun Baeldung  modificando el fichero de configuración JSON de docker situado en /var/lib/docker en Ubuntu

Se puede compartir una carpeta entre el servidor y un NUEVO contenedor a crear mediante mapeo directo de una carpeta del servidor o mapeando un VOLUMEN previamente creado con docker.

4. Dos formas de compartir carpetas en el servidor: Montaje directo y volúmenes

Veamos como se pueden crear los dos tipos de contenedores y como arrancarlos. En este caso para simplificar las cosas usaremos la imagen del linux Alpine


# OJO: puede que se pida ejecutar docker con "sudo"!
#-------------------------------------------------------------
#1. Contenedor que comparte la carpeta
#   del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#   en dicho contenedor            
#--------------------------------------------------------------
#1.1 Crear el contenedor (alpine) 
#                             <nombre contenedor>       <carpeta server>  <carpeta container> <nombre imagen> <programa a ejecutar>
docker container create --name my-alpine-share   -it -v /home/ximo/prueba:/tmp_prueba         alpine:latest   /bin/sh

#1.2 Arrancar el contenedor (alpine) 
docker container start -i my-alpine-share

#--------------------------------------------------------------
#2. Proceso de crear un contendedor que comparta un volumen
#--------------------------------------------------------------
#2.1 Manejo de un volumen 
#2.1.1 Crear un volumen
docker volume create my-volume

#2.1.1 Ver los volumenes creados
docker volumen ls

#2.1.2 Mostrar informacion del volumen
docker volume inspect my-volume

# Y obtenemos la ruta de montaje
#[
#    {
#        "CreatedAt": "2023-09-20T09:12:31+02:00",
#        "Driver": "local",
#       "Labels": null,
#        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
#        "Name": "my-volume",
#        "Options": null,
#        "Scope": "local"
#    }
#]

#2.2 Manejo del contendor
#2.2.1 Crear un contenedor (alpine) compartiendo el volumen
#      del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#      en dicho contenedor                        

#                            <nombre contenedor>            <volumen>        <carpeta container>   <nombre imagen> <programa a ejecutar>
docker container create --name my-alpine-volume -it --mount source=my-volume,target=/opt/my-volume alpine:latest   /bin/sh

#2.2.2 Arrancar el contenedor (alpine) 
docker container start -i my-alpine-volume

Se recomienda crear un volumen pues es mas eficiente (la segunda opción)

5. Proceso de asignación de carpetas compartidas a un contenedor existente

En el apartado anterior hemos visto como crear contenedores nuevos a partir de imágenes y montando las carpetas compartidas o volumenes a compartir. Pero lo mas normal es que nos encontremos con contenedores previamente existentes que no se les ha montado una carpeta o volumen compartido.

Como no debemos asignar carpetas compartidas a un contenedor existente, lo mas cómodo es:

  1. Crear una nueva imagen a partir de un contenedor existente
  2. Crear un contenedor a partir de esta imagen al cual le añadiremos un VOLUMEN previamente creado o el mapeo de la carpeta del servidor (visto en el punto anterior
Para crear una imagen de un contenedor existente se puede hacer de dos maneras:
  1. docker container export y docker container import
  2. docker container commit
Vemos un ejemplo de cada uno de ellos

# OJO: puede que se pida ejecutar docker con "sudo"!
#-------------------------------------------------------------
#1. Contenedor que comparte la carpeta
#   del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#   en dicho contenedor            
#------------------------------------------------------------------
#1. Exportar el contenedor como imagen en un fichero "tar" (export)
#------------------------------------------------------------------
#1.1 Comando a utilizar para exportar
#                          <fichero.tar>    <nombre-contenedor>
docker container export -o my-alpine.tar     my-alpine

#1.2. Ver el contenido del fichero "tar"
tar -tvf myalpine-vol.tar

#

#1.3. Crear una imagen a partir de este fichero "tar"
#                   <fichero tar> <-nombre nueva imagen>
docker image import my-alpine.tar my-alpine-imported
#------------------------------------------------------------- #2. Exportar el contenedor como imagen directamente (commit) #------------------------------------------------------------- # <nombre-contenedor> <nombre nueva imagen> docker container commit my-alpine my-alpine-committed
#----------------------------------------------------------------------- #3. Ahora solo falta crear los contenedores a partir de las imagenes #----------------------------------------------------------------------- #3.1 Listamos imagenes docker images

6. Proceso completo de asignación de  volumen al contenedor docker existente de Oracle

Vamos a :
  1. Crear una imagen del contenedor de la BD Oracle con un commit
  2. Crear un volumen
  3. Crear un contenedor a partir de la imagen montando el volumen. Hay que advertir que al crear el contenedor SI hace falta dar puertos ni contraseñas.
<
#-------------------------------------------------------------
#1. Exportar el contenedor como imagen directamente (commit)
#    y listamos las imagenes para comprobar
#-------------------------------------------------------------
#                       <nombre-contenedor>  <nombre nueva imagen>
docker container commit ximo-oracle-db       oracle-db-image-committed

docker images

#REPOSITORY                                       TAG             IMAGE ID       CREATED         SIZE
#oracle-db-image-committed                        latest          036d3ff6a2cf   9 minutes ago   16.5GB
#container-registry.oracle.com/database/express   latest          8da8cedb7fbf   6 weeks ago     11.4GB


#-----------------------------------------------
#3. Creamos un volumen y listamos para combrobar
#-----------------------------------------------
docker volume create ximo-oracle-volume

docker volume ls

#DRIVER    VOLUME NAME
#local     ximo-oracle-volume


#------------------------------------------------------------
#4. Creamos un nuevo contenedor a partir de la imagen y 
#   le montamos el volumen
#   OJO: SI hace falta dar pawssword y puertos 
#------------------------------------------------------------
#                             <nombre-contenedor>      <mapeo puerto1> <mapeo puerto2>                                         <volumen a montar>        <punto montaje>  <nombre imagen>
docker container create --name ximo-oracle-db-new -it -p 1111:1521 -p 2222:5500 -e ORACLE_PWD=myPassword --mount source=ximo-oracle-volume,target=/opt/ximo-volume oracle-db-image-committed #-------------------------------- 5. Arrancamos el contenedor #--------------------------------
#                         <nombre-contenedor>
docker container start -i ximo-oracle-db-new


Y vemos que podemos conectar mediante DBeaver.







No hay comentarios :

Publicar un comentario