David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.

domingo, 28 de marzo de 2021

Perdiendo el miedo a generar archivos docker-compose.yml

Todavía hay muchisima referencia en internet a dockers en los que solo se muestra el comando largo y complejo de una línea para levantar un contenedor.

Docker-compose nos ayuda a levantar y parar los contenedores de una forma ágil, habiendo definido previamente todos los parámetros y sin tanto lio como lanzando un línea gigantesca de parámetros en la que si nos hemos confundido tenemos que andar reeditando de malas maneras.

Para instalar docker-compose lanzamos el comando:

   # apt install docker-compose -y

Con docker-compose, solo tenemos que generar un directorio, meter dentro un archivo llamado docker-compose.yml, si está bien contruido, en esa misma ruta lanzamos:

   # docker-compose up

Esto nos mostrará que hace el contenedor y sus logs. Podemos pulsar ctrl+c para parar la ejecución y el contenedor se parará, si cerramos la terminal también Si queremos que se lance en segundo plano, solo tenemos que incluir el parámetro -d

   # docker-compose up -d

Para revertir lo que acabamos de hacer lanzamos:

   # docker-compose down

Este comando detiene y elimina el contenedor, las redes, los volúmenes y las imágenes creadas por up.

El el archivo yaml tenemos que especificar la versión, para conocerla ejecutamos:

   # docker-compose version

Hay que tener en cuenta que siempre hay retrocompatibilidad, pero es importante especificar la versión correcta y seguir evolucionando con la herramienta.

Para tener mas detalles sobre que versión utilizar, tenemos la documentación oficial:

   https://docs.docker.com/compose/compose-file/

   https://docs.docker.com/compose/compose-file/compose-versioning/

Podríamos seguir revisando todos los parámetros posibles, pero según el título de esta entrada queremos perderle el miedo a generar estos archivos. El camino directo cuando nos encontramos un comando docker para levantar un contenedor, solo tenemos que ir a la siguiente página:

   https://www.composerize.com/

Solo tenemos que introducir el comando y aparecerá el archivo docker-compose definido.

SaluDOS

Doctor Jenkins y Mister Docker en uno solo

Jenkins es un servidor automatizado de integración continua de código abierto. Jenkins es capaz de automatizar y probar las compilaciones de código fuente y muestra los errores que puedan aparecer en este proceso. A través de complementos puede ser ampliado en cuanto a características y funcionalidades añadidas.

Jenkins puede ser montado sobre un docker, esto claramente aligera notablemente los pasos para desplegarlo y es lo que vamos a ver. Eso sí, elegiremos mapear volúmenes para que la instalación sea persistente.

El contenedor que mantiene la comunidad actualmente es: https://hub.docker.com/r/jenkins/jenkins

Y podemos encontrar la documentación ofician en la que nos especifican como montarlo aquí: https://github.com/jenkinsci/docker/blob/master/README.md

Algunos parámetros a tener en cuenta:

   -d --> Para que corra en segundo plano

   -v jenkins_home:/var/jenkins_home --> montamos el volumen para que los datos sean persistentes ante operaciones de parada, reinicio y borrado del docker.

   -p 8080:8080 -p 50000:50000 --> Puertos que debemos mapear entre host y contenedor. Si el puerto 8080 ya lo tenemos ocupado en nuestro host, podríamos mapearlo en otro, por ejemplo: -p 8087:8080

   jenkins/jenkins:lts --> especificamos la imagen que mantiene la comunidad.

 Así que el comando completo quedaría para ejecutarlo:

   # docker run -d -v /var/jenkins_home:/var/jenkins_home -p 8087:8080 -p 50000:50000 jenkins/jenkins:lts

DOCKER-COMPOSE

El fichero docker-compose.yml tendrá el siguiente contenido:

   version: '3.3' 

      services: 

         jenkins: 

            volumes: 

               - '/var/jenkins_home:/var/jenkins_home' 

            ports: 

               - '8087:8080' 

               - '50000:50000' 

            image: 'jenkins/jenkins:lts'

Una vez que el docker está arrancado, podremos ir a http://localhost:8087, habrá que esperar un poco hasta que jenkins esté preparado. Nos solicitará lo siguiente:

Unlock Jenkins

To ensure Jenkins is securely set up by the administrator, a password has been written to the log (not sure where to find it?) and this file on the server:

/var/jenkins_home/secrets/initialAdminPassword

Así que podemos ir a esa ruta en nuestro equipo local, copiar la contraseña e introducirla para poder continuar. Con el siguiente comando obtenemos la contraseña:

    # cat /var/jenkins_home/secrets/initialAdminPassword

Una vez que hemos confirmado que somos administradores los que estamos configurando Jenkins, ya podemos seguir con el siguiente paso, configurar los posibles complementos a instalar.

Para no complicarnos de momento la vida y probarlo, podemos instalar los plugins sugeridos entre los que a día de hoy se encuentran:

Folders
OWASP Markup Formatter
Build Timeout
Credentials Binding
Timestamper
Workspace Cleanup
Ant
Gradle
Pipeline
GitHub Branch Source
Pipeline: GitHub Groovy Libraries
Pipeline: Stage View
Git
SSH Build Agents
Matrix Authorization Strategy
PAM Authentication
LDAP
Email Extension
Mailer
 
Tendremos que definir el usuario administrador y su contraseña, después nos preguntará por la URL que queremos que tenga la instancia, esta URL es la que se ofrecerá a los usuarios de Jenkins. Exactamente dice:
 
Configuracíon de la instancia:
 
La URL de Jenkins se utiliza para proporcionar la URL raíz para los enlaces absolutos a varios recursos de Jenkins. Esto significa que este valor es necesario para el correcto funcionamiento de muchas características de Jenkins, incluyendo las notificaciones por correo electrónico, las actualizaciones de estado de PR, y la variable de entorno BUILD_URL proporcionada a los pasos de construcción.
El valor propuesto por defecto que se muestra no se guarda todavía y se genera a partir de la solicitud actual, si es posible. La mejor práctica es establecer este valor a la URL que se espera que utilicen los usuarios. Esto evitará confusiones al compartir o ver los enlaces.

Lo ideal sería generar una entrada DNS con certificado y que la llamada fuese a un subdominio concreto, de cara a los programadores quedará mucho mas profesional. Para probarlo en nuestro propio equipo lo dejamos así, sin complicaciones.
 
Listo, ya podemos comenzar a trabajar con Jenkins.

SaluDOS

sábado, 27 de marzo de 2021

Gestión de dockers con Portainer

Para la gestión de docker siempre tenemos disponible nuestra amiga la consola de comandos, pero... ¿que tal si podemos utilizar un entorno gráfico?

Portainer nos permite gestionar los dockers a través de un portal web. Se instala en forma de docker y a partir de ahí podrás gestionar todos los dockers locales y remotos. 

Algunos parámetros a especificar:

   -d --> Para que se ejecute en segundo plano (dettach)

   --name portainer --> nombre del contenedor

   --restart always

   -p 9000:9000

   -v /var/run/docker.sock:/var/run/docker.sock --> este volumen es necesario para poder gestionar los dockers locales.

 El comando completo

   # docker run -d --name portainer --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Al acceder a http://localhost:9000, la primera acción será configurar la contraseña de administrador de Portainer.

DOCKER-COMPOSE

El fichero docker-compose.yml tendrá el siguiente contenido:

   version: '3.3' 

   services: 

      portainer-ce: 

         container_name: portainer 

         restart: always 

         ports: 

            - '9000:9000' 

         volumes: 

            - '/var/run/docker.sock:/var/run/docker.sock' 

            - 'portainer_data:/data' 

         image: portainer/portainer-ce

SaluDOS

martes, 23 de marzo de 2021

SQL Server en Linux... tal cual lo estás leyendo!

Está claro que no hay limites cuando se trata de contenedores. Efectivamente, podemos montar un SQL Server con un contenedor en una máquina con Linux, en este caso sobre Debian 10.

Si vamos a Docker Hub, podemos encontrar esta imagen mantenida oficialmente por Microsoft:

   https://hub.docker.com/_/microsoft-mssql-server

Los requerimientos que debemos cumplir:

   - Docker Engine 1.8 o superior

   - Por lo menos 2 GB de memoria RAM

   - ACCEPT_EULA=Y, confirmamos que aceptamos estas condiciones

   - SA_PASSWORD=<contraseña robusta por lo menos 8 caracteres>

   - MSSQL_PID= ID de producto/Nombre de edición. Predeterminado el valor Developer.

Los valores aceptados para especificar la edición que desplegamos en el contenedor son:

   - Developer : Esto ejecutará el contenedor usando la Edición Developer (es el valor por defecto si no se suministra la variable de entorno MSSQL_PID) 

   - Express : Esto ejecutará el contenedor usando la Edición Express

   - Standard : Esto ejecutará el contenedor usando la Edición Standard

   - Enterprise : Esto ejecutará el contenedor usando la Edición Enterprise

   - EnterpriseCore : Esto ejecutará el contenedor usando la edición Enterprise Core 

Tenemos que tener presente que estamos aceptando el EULA al lanzar estos comandos, así que vaya por delante que tenemos que cumplir las condiciones de licenciamiento con Microsoft. Por ello podemos utilizar SQL Sever 2017 para entornos de desarrollo y SQL Server Express para entornos de producción.

Hay que tener en cuenta que la versión Express tiene varias limitaciones en la memoria máxima utilizada de 1 GB por el motor de base de datos, 1 MB de caché de buffer máximo, uso máximo de 1 socket y 4 cores de CPU y la limitación de 10 GB en el tamaño de base de datos. No tiene limite en el número de usuarios concurrentes.

Para lanzar un contenedor con una instancia de la última versión de SQL Server:

   # docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pa$$w0RD' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest

Para lanzar un contenedor con una instancia de la versión Express:

   # docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pa$$w0RD' -e 'MSSQL_PID=Express' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu 

Una vez lanzada la instancia, solo tenemos que abrir dbeaver, seleccionar una nueva conexión a SQL Server y rellenar los datos:

   - Servidor: localhost

   - Puerto: 1433

   - Database/Schema: Master 

   - Autenticación: SQL Server Authentication

   - Usuario: sa

   - Contraseña: Pa$$w0RD

Quizás haya que esperar un poco a que establezca la conexión y ya podemos trastear con SQL Server, crear una base de datos, tablas, etcétera. 

DOCKER-COMPOSE

Para la versión SQL Express el archivo docker-compose.yml tendría:

   version: '3.3' 

   services: 

      run: 

         environment: 

            - ACCEPT_EULA=Y 

            - SA_PASSWORD=Pa$$w0RD 

            - MSSQL_PID=Express 

         ports: 

            - '1433:1433' 

         image: run

SaluDOS

Reduciendo, recortando y rebajando la escritura de texto con MARKDOWN

Markdown es un lenguuaje de marcado ligero que trata de que sea fácil de escribir y fácil de leer.  

Este lenguaje, cada vez mas utilizado, tiene la extensión de archivo .md

Para aprender a escribir en markdown hay muchos tutoriales por internet, por ejemplo: https://www.markdownguide.org/ o también en castellano https://www.markdowntutorial.com/es

Editores hay cientos por no decir miles, pero podemos tener 2 alternativas interesantes y sobre todo sencillas:

   Editor on line:  https://stackedit.io/

   Editor instalable: https://remarkableapp.github.io/linux/download.html

Además siempre podemos escribir en formato markdown en Visual Studio Code.

Y por supuesto hay muchisimas referencias que contemplan gran parte de la sintaxis: https://markdown.es/sintaxis-markdown/

A continuación una referencia rápida, pero lo mas recomendable es seguir un tutorial y experimentar con markdown, es la única forma de aprender.

FORMATO DE FUENTE

   Cursiva:    _palabra_    _frase en cursiva_

   Negrita:    **palabra**    **frase en negrita**

   Negrita y cursiva:    **_palabra_**    **_frase en negrita y cursiva_**

   Tachado:    ~~palabra~~    ~~frase tachada~~

ENCABEZADOS

   Encabezado 1:    #Encabezado 1#

   Encabezado 2:    ##Encabezado 2##

   Encabezado 3:    ###Encabezado 3###

PARRAFOS

   Ruptura dura: [Enter] al final de cada linea, empieza un nuevo párrafo después de pulsar la tecla [Enter].

   Ruptura blanda: Introducimos 2 espacios en blanco al final de cada línea. Genera un salto de línea pero la nueva línea la mantiene en el mismo párrafo.

ENLACES

   Enlace a web:    [Visita mi web](www.gaizka.net)

   Enlace con formato:    [Visita mi **web**](www.gaizka.net)

   Enlace en encabezado:    ###Visita mi [web](www.gaizka.net)###

   Enlace referencia: Para que la referencia a una URL esté solo en un punto al que podamos referenciar en cualquier parte del documento. Si tenemos que cambiar el enlace lo hacemos solo donde realmente tenemos la referencia.

       Esto por ejemplo es una referencia a [Mi web][Enlace miweb]

       [Enlace miweb]:www.gaizka.net 

IMAGENES

   Imagen:    ![Texto alternativo opcional](URL de la imagen)

   Imagen referenciada: Es el mismo concepto de referencia a una URL mediante una etiqueta que podremos especificar mas adelante.   

       ![Texto alternativo opcional][Referencia imagen]

       [Referencia imagen]: URL de la imagen    

CITAS

   Cita:    > "Texto de la cita a una fuente" 

   Cita combinando formatos: Las citas pueden contener cursiva, negrita, imágenes, etcétera.

NOTAS AL PIE DE PÁGINA

Las notas se marcan con el símbolo ^ y el número de nota encerrados entre corchetes. Da igual donde pongamos la nota real, siempre irá al pie del documento. Veamos un ejemplo:

   De esta forma marcariamos la nota 1 [^1] y asi [^2] habríamos incluido la segunda nota al pie de página. Después en cualquier momento del documento pondriamos la nota.

   [^1]: Texto de la primera nota a pie de página. 

   [^2]: **Texto de la segunda nota de pie de página** a la que podemos aplicar *formato* como al resto del texto.

LISTAS

   Elementos de lista: Podemos utilizar guion (-), símbolo más (+) o asterisco

       * Elemento 1

       * Elemento 2 

       * Elemento 3

   Elementos de lista numerada:

       1. Elemento 1

       2. Elemento 2

       3. Elemento 3

   Listas con niveles: Solo hay que separar o tabular los asteriscos del subnivel

       * Elemento 1

          * Subelemento 1.1

          * Subelemento 1.2

       * Elemento 2 

   Listas numeradas y con subniveles. Combinando las listas anteriores podemos...

       1. Elemento 1

          * Subelemento 1.1

          * Subelemento 1.2

       2. Elemento 2

   Listas de verificación: Los elementos no seleccionados deben tener un espació en blanco entre los corchetes.

       [ ] Elemento 1

       [x] Elemento 2 seleccionado

       [ ] Elemento 3

TABLAS

Para crear tablas utilizaremos el símbolo 'tubería' (|)

   | Titulo Columna 1 | Titulo Columna 2|

   |----------------------------|---------------------------|

   | Contenido celda 1| Contenido celda 2|

   | Contenido celda 3| Contenido celda 4|

 

SaluDOS

lunes, 22 de marzo de 2021

Qucs simulando circuitos electrónicos

Quite Universal Circuit Simulator, en su abreviatura: Qucs, es un simulador integrado de circuitos que utiliza una interfaz gráfica para introducir los componentes que forman el circuito y realizar simulaciones. 

Permite la simulación: en corriente continua, alterna, análisis paramétrico, análisis de balance de armónicos, análisis de ruido, etcétera. Además presenta una interfaz sencilla y simple de manejar. 

Su página web:  http://qucs.sourceforge.net/

Para utilizarlo de forma sencilla sobre cualquier distribución linux, vamos a utilizar la opción de hacerlo a través de un contenedor.

Docker: https://hub.docker.com/r/qucs/qucs

Como especifican desde el docker oficial, para ejecutar el programa solo tenemos que ejecutar la siguiente línea:

   # docker run --rm \ --volume /tmp/.X11-unix:/tmp/.X11-unix \ --volume ~/workspace:/home/.qucs \ qucs/qucs

Automáticamente se abrirá la aplicación en una ventana con interfaz gráfica.

DOCKER-COMPOSE

El contenido del archivo docker-compose.yml será:

   version: '3.3' 

   services: 

      qucs: 

         volumes: 

            - '/tmp/.X11-unix:/tmp/.X11-unix' 

            - '~/workspace:/home/.qucs' 

         image: qucs/qucs

SaluDOS

viernes, 5 de marzo de 2021

Instalar docker-compose en CentOS 7

Para instalar docker-compose en un servidor con CentOS 7 tenemos que seguir los siguientes pasos:

Descargamos la última versión que podemos encontrar en:  https://github.com/docker/compose/releases/

En estos momentos vemos que la última versión es la 1.28.5. La descargamos introduciendo la versión adecuada que tenemos instalada mediante uname y lo llevamos a la ruta adecuada, todo en una misma línea:

   # curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Añadimos permiso de ejecución:

   # chmod +x /usr/local/bin/docker-compose

Comprobamos $PATH, queremos poder lanzar docker-compose desde cualquier ruta en la que nos encontremos:

   # echo $PATH

Añadimos la ruta a $PATH si no contiene la ruta donde está docker-compose:

   # export PATH="/usr/local/bin:$PATH"

Comprobamos la versión:

   # docker-compose --version

SaluDOS