Mostrando entradas con la etiqueta cp. Mostrar todas las entradas
Mostrando entradas con la etiqueta cp. Mostrar todas las entradas

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.







miércoles, 19 de mayo de 2021

Ubuntu copiar proyectos java

 Veamos como hacer una copia de seguridad de un proyecto gradle (o mejor dicho de todo e directorio del WORKSPACE donde se guardan los proyecots )de varias maneras:


1. Mediante find combinado con cp

Aquí buscamos todos los ficheros que sean:
  • gradle.properties
  • *.java
  • *.gradle
y tambien incluimos todo el contenido recursivo de las carpetas cuyos nombres sean
  • src
  • mylibs
  • frontend
Para ello previamente nos sitamos en la carpeta donde estan los proyectos a copiar y ejecutamos

find . \( -type f \( -iname gradle.properties -o -iname \*.java -o -iname *.gradle \)  -o -type d \( -iname src -o -iname mylibs -o -iname frontend \) \) -exec cp -r -a --parents {}  /home/eduard/copia-seguretat/ \;


2. Mediatne un tar


OJO: 
  • La sentencia tar es en una sola línea!!!!
  • Solo nos interasan las fuentes, descartamos lo demas

cd /WORKSPACES  # Cambiamos a la carpeta donde estan todos los proyectos

tar -cJvf /home/ximo/copia-seguretat/copia.tar 
   --exclude='*/target' 
   --exclude='*/.*' 
   --exclude='*/node_modules' 
   --exclude='*/gradle' 
   --exclude='*/bin'  
   --exclude='*/mytarget' 
   --exclude '*/gradlew*' 
   --exclude '*/libs' 
   --exclude '*/Servers' 
   --exclude '*/build' 
   --exclude '*/LICENSE' 
   --exclude '*/package.json' 
   --exclude '*/tsconfig.json' 
   --exclude '*/pnpm*.*' 
   --exclude '*/types.d.ts' 
   --exclude '*/webpack*.*' 
   WS_GRDL_VAADIN.02   

Creemos un script que lo recoja todo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

#--Parameters
parent_folder='/home/ximo/WORKSPACES/'
workspace_folder='WS_GRDL_VAADIN.02'
tar_folder='/home/ximo/BACKUPS/'

echo '--------------------------------------------------------------'
echo 'Project: ' $parent_folder $workspace_folder
echo '--------------------------------------------------------------'
echo Por favor, verificar que se guarda el WORKSPACE correcto. Intro continua..
read continuar

#--Calculations
project_file=${parent_folder}${workspace_folder}
my_time=`date +"%Y%m%d_%H%M"`
tar_file=${tar_folder}${workspace_folder}"_"${my_time}".tar"


echo $tar_file
echo $project_file

#--Execution
cd ${parent_folder}

tar -cJvf ${tar_file} --exclude='*/target' --exclude='*/.*' --exclude='*/node_modules' --exclude='*/gradle' --exclude='*/bin'  --exclude='*/mytarget' --exclude '*/gradlew*' --exclude '*/libs' --exclude '*/Servers' --exclude '*/build' --exclude '*/LICENSE' --exclude '*/package.json' --exclude '*/tsconfig.json' --exclude '*/pnpm*.*' --exclude '*/types.d.ts' --exclude '*/webpack*.*' ${workspace_folder}