domingo, 22 de noviembre de 2020

PROCESO DE COMPILACION

Un lenguaje de programación es un tipo de lenguaje, que permiten generar un conjuntos de órdenes para el ordenador y que de este modo pueda realizar tareas. 

El primer lenguaje es el codigo maquina o binario que crean un grupo de instrucciones en base de 0's y 1's y es el lenguaje

Existen 2 grupos grandes de lenguajes.

Lenguajes de alto nivel:

Es el lenguaje mas compresible para el desarrollador pero en terminos de optimizacion no es lo mas adecuado al trabajar con hadware.

lenguajes de alto bajo nivel

Es el lenguaje as cercano al lenguaje maquina, en algunas ocaciones se suele utilizar directamente con el hardware, por ser el mas adecuado en terminos de rendimiento.

Ademas existen lenguajes que son considerados en un estado intermedio como es C, aunque otros los llaman de bajo nivel, su uso de punteros y rutinas en codigo ensamblador.

 

Sin importar como se considere un lenguaje de alto o bajo nivel, si es un lenguaje compilado necesitara forzosamente un compilador,que es una especie de traductor que transforma en este código en instrucciones binarias que la computadora pueda entender. Dependiendo de la arquitectura y el sistema operativo, los compiladores más usados son: gnu compiler collection para linux, clank para mac y Msvc para windows. En mi caso voy a utilizar OS linux asi que debo usar para compilar gcc.

Para convertir este código fuente en algo que nuestra computadora pueda interpretar y ejecutar tenemos que compilarlo en 4 pasos:

  •  Pre-procesamiento 

  • Compilación 

  • Ensamble 

  • Enlace 

En el pre procesamiento, el pre procesador identificando las directivas incluidas en el código fuente, haciendo que algunas como puede ser #define #include #ifdef, sean sustituidas, por el valor en donde han sido invocadas.

Con el comando: 

gcc -E edad.c > edad.pp 

Se vera un archivo con extencion .pp Durante este proceso se buscará el contenido del archivo que se indica como directivas y se reemplaza por completo de modo recursivo posiblemente haciendo llamado a otras dependencias. Asi es como un pequeño codigo de una pocas lineas termina con un poco mas de 700 lineas. 

La segunda etapa llamada compilación lo que hace es convertir esas 700 líneas en unas cuantas instrucciones en assembler.

Con el comando:

 gcc -S edad.c 

 Se obtendra un archivo con extension .s, si lo abre, obtendra algo similar a lo anterior, un archivo en codigo en lenguaje esamblador, aunque puede variar dependiendo la arquitectura es de x64 o x86. 

 

La tercera etapa en el proceso de compilación es el ensamblado,

independiente del sistema o la arquitectura, en este punto, el ensamblador tomara el archivo con el codigo assembler y lo conviete en codigo binario. 

Con el comando: 

gcc -c edad.c 

Se obtendra un archivo objeto, con extencion .o . Aunque no es tan frecuente hacer pasar por las etapas anteriores y tener un archivo en codigo assembler, se puede convertir a un archivo objeto con el comando:

 as -o edad.o edad.s 

Al abrir el archivo con extencion .o se puede aprenciar que es ilegible para los humanos. 

La última etapa es el enlazado, el compilador en cadena los archivos.o ademas creando los enlcaes de lsa distintas librerias que se invocan desde estos archivos. El enlazador se denomina ld, por motivos practicos no voy a ejemplificarlo, por tener que especificar las rutas de las librerias que seran consumidas por el programa.

En cambio, gcc con el siguiente comando, permite hacer este enlace con los archivo con extension .o:

gcc -o edad edad.o 

Para hacer los 4 pasos con un solo comando: 

gcc -o edad edad.c 

Por defecto cuando se crea un enlace dinamico, esto quiere decir que el ejecutable carga desde la memoria del equipo las liberias necesarias para funcionar correctamente, mientras que el enlace estatico hace que el ejecutable sea mas independiente por tener sus librerias incorporadas, pero esto hace que el archivo sea mas pesado. 

Para especificar el enlace estatico con el flag -static: 

gcc -static -o edad edad.c

 

ref: https://gcc.gnu.org/onlinedocs/ 

ref: man gcc

martes, 17 de noviembre de 2020

Chat Socket Tcp Con Node.js

 Profundizando un poco sobre los sockets bajo los protocolos TCP / UDP, como es la implementacion de socket tcp con nodejs, con un pequeño ejemplo de un chat room.


server.js

Como ya hemos visto, lo primero seria importar la libreria .net de node.js, se guarda en una variable la instancia del servidor. En la linea 6, se crea el evento connection, que se ejecutara si hay algun socket hace una conexión, ademas muestra por consola la ip y el puerto del usuario. Como esta recibiendo un socket, con el evento data, recibe la informacion que haya enviado el usuario, en este caso el consol log mostrara el buffer y los datos transformados a utf-8, en otras palabras,legible para humanos, asimismo devuelve con el metodo write lo que el usuario escribio. Y al final la instancia del servidor necessita en el evento listen, un puerto y host en este caso se le especifico que corriera con ip4 en el host y mostrara en consola el puerto en el que esta corriendo el servidor.

 

client.js

 El cliente tambien importa la libreria .net e instancia un socket en una variable.
En la linea 4 se esta importando una libreria tambien nativa de node.js que permite leer flujos de datos de distintas fuentes, como archivos, peticiones http, una consola, entre otras, una linea a la vez a travez de una interfaz, declarando el input y output.
El socket se pasa en el evento socket el host y el puerto del servidor, en la siguiente linea convierte los buffer recibidosen utf-8. En la liña 12 se instancia la interfaz de readline con el evento line que emite una linea, que se la enviaran al servidor a travez del evento socket.write.
Y por ultimo el socket data, recibe la respuesta del servidor y lo mostrará por consola.
Lo que se acabo de hacer, en el ejemplo anterior es conocido como servidor espejo, que reenvia los datos hacia el mismo usuario.
 

 server.js

Los cambios se hizo al ejemplo anterior, es comprobar que una clave que enviada desde el cliente cierre la coneccion del socket. En este caso es FINISH, cuando es enviada al servidor muestra un mensaje por consola y desconecta el server, en caso contrario solo mostrar la enformacion recibida.

client.js

Los cambios al cliente son si envía una clave cierre la coneccion con el servidor, y esperar una respuesta cuando este completamente cerrado. En este caso no espera una respuesta del servidor pero cerra la interfaz que captura lo que el cliente escribe por consola.


server.js

Para finalizar este ejemplo, severifica si hay una conexión  sin registrar, delo contrario se continua normalmente y se esta atento a los errores del servidor. Cuando hay una nueva conexión de socket al servidor, se guarda ese mensaje y el socket en un mapa declarado en la linea 5. Si el usuario envía la clave para terminar la conexión, el socket del usuario es eliminado junto con su usuario. Delo contrario se pasara la información del usuario formateada, junto al socket a una función creada en la linea 7, que enviará un el mensaje a todos los sockets almacenados excepto al socket del emisor.


client.js

En la interfaz, hay un método query que permite es un método que permite recibir un dato como entrada por el usuario y utiliza como salida este dato. Para utilizarlo en la interfaz debe especificar el output  debajo del input así output: process.stdout. Este dato de entrada la utilizara el servidor como nombre de usuario y se le muestra por consola la clave para cerrar la conexión.

Hasta aquí el ejemplo de chat desde consola utilizando librerías nativas de node.js a través del protocolo tcp.

ref: https://nodejs.org/en/docs/

viernes, 13 de noviembre de 2020

Sockets Nodejs

Socket es un interfaz con la cual, se crearon las implementaciones de la pila de protocolos tcp-ip con la que permite que internet se creara, y con ello dos servicios colección 

TCP

Los tcp sockets son los que gestionan todo lo relacionado a los circuitos vistuales conectando tanto a clientes como a sevidores. Tiene una serie de metodos como el connect que permite establecer el circuito desde el cliente hasta el servidor,destruirlos datos , crear eventos y utilixando el modelo de cliente servidor.

El socket de server sirve para escuchar eventos de forma pasiva y establecer la comunicación con el cliente.

El  socket de cliente que son las estructuras de datos despues de haberse establecido todo el circuito permitiran la interacción con el servidor.

UDP

Es la alternativa mas rapida y simple, enviando datagramas sin establecer un enlace obligatorio como es el 3 handshake, que utiliza tcp para establecer la conexión entre el cliente y servidor. El envio de datagramas, tiene unos datos asociado con un tamaño maximo.Es una comunicacion sensilla, sin embargo, no hay garantía de la integridad de los datos. Al  no establecer una conexión con el receptor de los datos, no se espera mensajes de respuesta, mucho menos el orden de llegada de los datos o si los paquetes están completos, haciéndolo un caso de uso muy especifico primando la velocidad de transmisión como lo son o servicios de voz y vídeo.

Ejemplo  

ServerUdp.js

En la primer linea se implementa la libreria dgram nativa de nodejs, la siguiente línea se crea un socket con ipv4 y la almacena en la variable server, e inicializa el socket con el método bind que recibe por parámetro un puerto por donde escuchara a los clientes. Los demás son eventos, el primero se emitee cuando un nuevo datagrama esta disponible en el socket, el segundo dgram.Socket es direccionable y puede recibir datos y el tercero si ocurre un error. 

Para entrar mas en detalle lo que esta haciendo el código, en el evento message, lo que esta haciendo es retornar al cliente el mensaje enviado, el evento listening esta guardando los datos del socket y los retorna en consola y el evento close si detecta un error, va a mostrarlo por consola y cerrara la conexión.

ClientUdp.js


De manera similar, tenemos al cliente que es muy similar al servidor, en este caso los process.stdin y
process.stdout fueron utilizados para que desde la consola se pudiera escribir e imprimir texto. Como se había mencionado antes los eventos del servidor son pasivos y necesita que el cliente los active. En este caso en la linea ocho, el socket llama al método send, que lo que hace es mandar datos al servidor. En el evento message su funcion aquí sera escribir en consola la respuesta  del servidor ypor último el evento error, mostrar por pantalla el error, cerrará la conexión y cerrara todolo demás. 

 

ClientTcp.js

Para trabajar con sockets tcp se debe cargar la libreria net que es nativa de nodejs, en la 2 linea se almacena un socket en una variable, en la linea siguiente, en el evento connect se le pasa el host y puerto del servidor al que se quiere conectar.

Cuando se trabaja con sockets los datos no se transmiten en texto plano sino en secuencia de bytes llamado buffer, por eso en la linea 5 se esta convirtiendo a texto legible por humanos. En la linea 7 se envia datos en el socket y en la linea 9, se espera el evento data que envie datos y los muestre por consola.

ServerTcp.js

En las primeras 2 lineas se carga la libreria, se crea y almacena una variable del servidor tcp, en la 4 linea se emite cuando hay una nuevo socket conectado, imprime por consola el host y el puerto del socket que se conecto. En la linea 7 en evento data, recibe los datos y los imprime en pantalla y devulve al socket lo que envio. En la linea 8 imprime en pantalla 2 valores, el primero el buffer recibido y el segundo, ese mismo buffer convertido a texto con el metodo .toString.

Con esto se ha profundizado un poco sobre protocolo y como nodejs desde sus librerías nativas permite realizarlo probando con un servidor eco.

ref: https://nodejs.org/api/

martes, 27 de octubre de 2020

Primeros Pasos de SQL Comandos (mysql)

 

La gestión de base de datos es una de las tareas más comunes que competen a todas las industrias, desde las más pequeñas, hasta las más grandes corporaciones. Es normal que muchos utilicen herramientas como en el caso de PhpMyAdmin para administrar la base de datos, pero no siempre es el caso cuando no existe interfaz gráfica y no hay más remedio de utilizar la consola, por eso hoy les traigo como administrar MySQL desde la consola y sobrevivir en el intento.

 

Iniciar sesión.

Nota: Utiliza el parámetro -h si solo es necesario.
 mysql -h hostname -u root -p

 

Crear una base de datos en el servidor SQL.

create database [databasename];

 

Listar todas las bases de datos en el servidor SQL.

show databases;

 

Cambiar de base de datos.

use [db name];

 

Ver todas las tablas en la base de datos.

show tables;

 

Para ver los formatos de los campos de la base de datos.

describe [table name];

 

Borrar la base de datos.

drop database [database name];

 

Borrar una tabla.

drop table [table name];

 

Mostrar toda la información de una tabla.

SELECT * FROM [table name];

 

Devuelve las columnas y la información de las columnas correspondientes a la tabla designada.

show columns from [table name];

 

Mostrar ciertas filas seleccionadas con el valor "algo".

SELECT * FROM [table name] WHERE [field name] = "algo";

 

Mostrar todos los registros que contengan el nombre "Luis" Y el número de teléfono '1234567'.

SELECT * FROM [table name] 
WHERE name = "Luis" AND phone_number = '1234567';

 

Mostrar todos los registros que no contengan el nombre "Luis" Y el número de teléfono '1234567' ordenados por el campo phone_number.

SELECT * FROM [table name] 
WHERE name != "Luis" AND phone_number = '1234567' 
order by phone_number;

 

Mostrar todos los registros que empiecen por las letras "Luis" Y el número de teléfono "1234567".

SELECT * FROM [table name] 
WHERE name like "Luis%" AND phone_number = '1234567';

 

Utilice una expresión regular para encontrar registros. Utilice "REGEXP BINARY" para forzar la distinción entre mayúsculas y minúsculas. Esto encuentra cualquier registro que empiece por a.

SELECT * FROM [table name] WHERE rec RLIKE "^a$";

 

Mostrar los registros únicos.

SELECT DISTINCT [column name] FROM [table name];

 

Mostrar los registros seleccionados ordenados de forma ascendente (asc) o descendente (desc).

SELECT [col1],[col2] FROM [table name] ORDER BY [col2] DESC;

 

Contar los registros.

SELECT COUNT(*) FROM [table name];

 

Unir tablas en columnas comunes.

select lookup.illustrationid, lookup.personid, person.birthday 
from lookup 
left join person 
on lookup.personid = person.personid;

 

Cambie a la base de datos mysql. Cree un nuevo usuario.

INSERT INTO [table name] (Host,User,Password) VALUES('%','user',PASSWORD('password'));

 

Cambiar la contraseña de un usuario (desde el Shell Unix).

mysqladmin -u root -h hostname.blah.org -p password 'new-password';

 

Cambiar a mysql db. Dar privilegios de usuario para una db.

INSERT INTO [table name] 
(Host,Db,User,Select_priv,Insert_priv,Update_priv,
Delete_priv,Create_priv,Drop_priv) 
VALUES ('%','db','user','Y','Y','Y','Y','Y','N');

 

Para actualizar la información que ya está en una tabla.

UPDATE [table name] 
SET Select_priv = 'Y',Insert_priv = 'Y',Update_priv = 'Y' 
where [field name] = 'user';

 

Borrar registro(s) de una tabla.

DELETE from [table name] where [field name] = 'algo';

 

Actualizar permisos/privilegios de una base de datos.

FLUSH PRIVILEGES;

 

Borrar columna

alter table [table name] drop column [column name];

 

Añadir una nueva columna a una tabla.

alter table [table name] add column [new column name] varchar (20);

 

Cambiar nombre de columna.

alter table [table name] 
change [old column name] [new column name] varchar (50);

 

Haz una columna única para que no haya duplicados.

alter table [table name] add unique ([column name]);

 

Ampliar una columna.

alter table [table name] modify [column name] VARCHAR(3);

 

Borrar el índice de una tabla.

alter table [table name] drop index [colmn name];

 

Cargar un archivo CSV en una tabla.

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

 

Volcar todas las bases de datos para la copia de seguridad. El archivo de copia de seguridad es para recrear todas las db's.

mysqldump -u root -ppassword --opt >/tmp/alldatabases.sql

 

Volcar una base de datos para la copia de seguridad.

mysqldump -u username -ppassword --databases databasename >/tmp/databasename.sql

 

Volcar una tabla para la copia de seguridad.

mysqldump -c -u username -ppassword databasename tablename > /tmp/databasename.tablename.sql

 

Restaurar una copia de seguridad.

mysql -u username -ppassword databasename < /tmp/databasename.sql

 


viernes, 9 de octubre de 2020

Como configurar entornos virtuales en Python3

 


Los entornso virtuales, son mecanismos utilizados en para trabajar en distintos entornos separados de los directorios del sistema.Cada entorno funciona independiente de los demas, una vez activos puede tener conjuntos independientes de las librerias sin importar las versiones, solucionando multiples problemas de compatibilidad.

 

PYTHON3

PASO 1: Instalar python3-venv

Primero como buena practica siempre actualizar los paquetes del sistema antes de instalar cualquier paquete:

sudo apt-get update -y

Ahora instalar python3-venv

sudo apt-get install python3-venv

 

PASO 2: Crear el entorno virtual de python

Despues instalado, es hora de crear el directorio donde se almacenara el entorno virtual

mkdir byte_fate cd byte_fate

Ahora se crea el entorno virtual para en la carpeta del proyecto.

python3 -m venv bytefate_env

Si quieres comprobarlo te mostrar una carpeta nueva con el nombre que le diste al entorno

ls -l
 

PASO 3: Activar el entorno

Es hora de trabajar, para activar el entorno es necesario utilizar el siguiente comando

source bytefate_env/bin/activate

Una vez activado se podra ver el nombre del entorno virtual en la barra antes de la informacion del sistema, algo asi..

(bytefate_env) user@host:~/byte_fate#
 

PASO 4: Instalar paquetes

Ya tienes un entorno en limpio para jugar con diferentes versiones, sin ningun inconveniente al momento de agregar un nuevo paquete. Prueba instalando este paquete.

pip install requests
 

Paso 5: Cerrar el entorno Virtual

Para cerrarlo es muy sencillo, es ubicar la terminal que esta ejecutando el entorno virtual y ejecutar el siguiente comando
deactivate
 
 

Ahora que ya estas listo para crear, sus propios entornos con paquetes independientes.

viernes, 18 de septiembre de 2020

NODE.JS Y DOCKER

Docker es una software open-source que lo que permite asilar o enpaquetar aplicaciones y sistemas en contenedores, similar como lo hace la virtualizacion pero de manera mas eficiente y liviana.


Instalar las dependencias 

Ya sea que estes comenzando o estes trabajando con un proyecto, la confuguracion de las dependencias sera crucial al momento dev desplegar la aplicacion.Si vas a crear un nuevo proyecto prueba el comando

npm init

Te pedira informacion relacionada con la aplicacion, como el nombre, la version, el tipo de licencia entre otras cosas. Ahora solo debes especificarle los paquetes que necesita. En este caso, se necesita a express solo para este proyecto.

npm install --save express //version completa o npm i -s express //version reducida

O en el caso de trabajar con previamente creado, y contenga un archivo package.json en este caso solo con el packete de express similar a este. 

package.json
{ "name": "bytefate_app_node", "version": "1.0.0", "description": "Node.js Bytefate App on Docker", "author": "name ", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.17.1" } }

Crear el servicio web, en mi caso se vera algo asi.

app.js
'use strict'; const express = require('express'); // Constants const PORT = 8080; // App const app = express(); app.get('/', (req, res) => { res.send('Welcome to Byte Fate'); }); app.listen(PORT, HOST); console.log(`Running on http://localhost:${PORT}`);
Si hay algunas retricciones por parte del firewall, con este comando habilitara la operacion del puerto donde estara corriendo la aplicacion.
sudo ufw allow 8080

 

 Dockerfile 

Ahora a lo que vinimos Dockerfile es un archivo que se le va a indicar en secuencia, al contenedor el comportamiento una vez se ejecute. Lo primero es escoger la imagen, hay distintas distribuciones dependiendo del tamaño de las imagenes, en este ejemplo se utilizara la mas ligera con la version 14 que hasta el momento es la version recomendada

FROM node:14-alpine
Lo siguiente es prepara la ruta para guardar los archivos dee la aplicacion y en lo posible limitar los permisos asignados al contenedor como buena practica
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
Luego se asigna el espacio de trabajo.
WORKDIR /home/node/app
Copia el archivo en el directorio que se le asigno en el comando anterior
COPY package*.json ./
Se asegura que los archivos de la aplicacion este con el usuario node
USER node
Descarga las dependencias de la aplicacion
RUN npm install
Copia los archivos y le asigna como propietario el usuario node
COPY --chown=node:node . .
Espone con el puerto asignado el contenedor
EXPOSE 8080
Inicia la aplicacion, con los parametros que se le han pasado.
CMD [ "node", "app.js" ]
 
El archivo queda algo asi.
Dockerfile
FROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ USER node RUN npm install COPY --chown=node:node . . EXPOSE 8080 CMD [ "node", "app.js" ]
Nota: En dockerfile si tienes varios cmd solo el ultimo se ejecutara. Cuando se trabaja con git, es conveniente que los anexes tambien a este archivo, el .git y gitignore. .dockerignore
.dockerignore
node_modules .dockerignore Dockerfile

 

 Ahora a crear la imagen, con el siguiente comando.

docker build -t username/bytefate_app_node .
La -t es para colocarle un tag, que la usaremos para reconocer las imagenes personalizadas y es usual que primero se coloque el nombre de usuaro de dockerhub, seguido del tag de la aplicacion(username/tag). Y el punto (.) es para ejecutarlo en el contexto actual. Para listar las imagenes que tenemos usa el comando.
docker images
Estando todo listo, es hora de ejecutar la imagen con el siguiente comando
docker run --name bytefate_app_node -p 80:8080 -d username/bytefate_app_node
lo que hace el --name es darle un nombre al contenedor que esta corriendo, -p para redirigir el trafico a otro puerto de ser necesario y -d es para correr en segundo plano.Para verificarlo es facil, con el siguiente comando podras ver todos los contenedores que estan corriendo.
docker ps

 

 Bueno eso es todo por el momento, espero que les haya sido de utilidad y nos veremos pronto.

viernes, 11 de septiembre de 2020

Basico - Docker II

DOCKER BASICO

 Requisitos: 

 

Cliclo de vida de los Contenedores

Arrancar en segundo plano

docker run -d <opciones> <image_name>
Con el comando -d corre el contenedor en segundo plano, cuando termine su proceso muera el contenedor, en opciones puede hacer port forwarding para que el contenedor se conecte por ese puerto.

docker run -di <image_name>
La opcion -i permite que el contenedor aun al terminar su proceso siga vivo o esperando.

Arrancar en segundo plano y acceder a el
Existiendo ya un contener accediendo el comando exec
docker exec -it <container_name_or_id> terminal
Puede usar sh o bash como terminal pasandola como parametro

Parar un contenedor
docker stop <container_name_or_id> 


Eliminar una imagen

docker rmi -f <image_name_or_id> 


Eliminar una imagen forzado

docker rmi <image_name_or_id>

Eiminar un contenedor

docker container rm <container_name_or_id>


Eiminar un contenedor forzado

docker container rm -f <container_name_or_id>


Dockerfile

Es un archivo en el que secuencialmente ejecuta una tareas dentro de una imagen docker, desde definir variables de entorno hasta instalacion de paquetes y ejecucion de aplicaciones, todo esto definido en un archivo llamado Dockerfile.


- FROM: Recibe el nombre de la imagen que se usara de base en el contenedor.

- RUN: Ejecuta un comando sobre la capa actual del contedor y almacena el cambio.

- CMD: Proporciona un valor predeterminados durante ejecucion del contenedor, si existen mas de una instruccion CMD solo se ejecutara la ultima dentro del Dockerfile.

- LAVEL: Añade metadatos a traves de llave - valor.

- EXPOSE:Informa a docker en que puerto estara escuchando el contenendor en el tiempo de ejecucion pero aun no estan accesibles.

- ENV: Establece de forma clave - valor el variables de entorno.

- COPY:  Copia nuevos archivos, directorios o url al contenedor, por defecto lo establece como usuario root. Como buena practica se deberia utilizar --chown = <user>:<group> para darle propiedades de propietario tambien aplicables a ADD.

- ADD: Copia nuevos archivos, directorios o url al contenedor (recomendable no usarlo).

- ENTRYPOINT: Configura un contenedor que se ejecutara como un ejecutable.

- VOLUMEN: Crea un montaje dentro del contenendor que accede a otros contenedores o el host nativo.

- USER: Crea un user en el sistema que puede interactuar con los comando RUN, CMD y ENTRYPOINT.

- WORKDIR: Crea un directorio de trabajo.

- ARG: Crea una argumentos utilizados en tiempo de ejecucion del dockerfile.

- ONBUILD: Ejecuta un disparador cuando una imagen es usada por otra.

- STOPSIGNAL: Envia una señal de salida al contenedor, llamando al sistema.

- HEALTHCHECK: Comprueba el status del contenedor del docker en intervalos de tiempo.

- SHELL: Permite anular la shell por defecto, es comunmente utilizada en sistemas windows donde hay 2 shells nativas (cmd, powershell).

Una vez terminado el Dockerfile lo siguiente es crear la imagen y luego ejecutar la imagen recien creada

EJEMPLO

FROM ubuntu:16.04
CMD ["/bin/echo","Hello World ByteFate!]

 para construir la imagen debe se utiliza el siguiente comando

#docker build -t <tag> .
 docker build -t saludo:1.0 .
Lo que traduce es que se esta creando una imagen, -t indica que le pasa el nombre a la imagen por convenciones se utiliza name:version y el punto es el contexto actual, osea donde se encuentra el archivo Dockerfile.
#docker run --options <image_name>
docker run --name bytefate_saludo saludo:1.0
Con la operacion run arranca un contenedor y las opciones se le pasan como parametro al contenedor, como una variable de entorno, un puerto de escucha, etc.


ref: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
ref: https://docs.docker.com/engine/reference/commandline/docker/

jueves, 3 de septiembre de 2020

PRIMEROS PASOS CON DOCKER - Docker I

 

 




Docker es una instancia de ejecucion de imagen, que permite de cierta manera virtualizar un entorno, combinando solo las librerias y configuracion necesarias para su ejecucion,haciendo mas facil el encapsulamiento portatil para un programa.

 REQUISITOS: Tener en el sistema operativo instalado docker. Si aun no lo tienes sigue este enlace.

COMENZANDO

Pero antes unos cuantos conceptos que ayudara a entender un poco mejor a Docker

Image: Es un tipo de plantilla para un contenedor donde estan los componentes basicos para funcionar.
 
Container: Es una instancia de una imagen, permitiendo encapsular un programa completo y hacerlo portable para cualquier otra maquina que tenga docker.

Docker Hub: Es un servicio de repositorio donde estan almacenadas muchas de las imagenes publicas, las imagenes mas confiables son las que fueron posteadas por las mismas empresas y son catalogadas como imagenes oficiales. Las imagenes varian de tamaño dependiendo de que base de sistema utilicen la mas pequeña es alphine-linux y llega a pesar 5mb.

DockerCompose: Es utilizado como archivo de configuracion para crear las imagenes, en este archivo se escribe el conjunto de instrucciones que se quiere ejecutar de forma sincrona.

 

Verificar la version de docker 

docker -v

Descargar una imagen

Descarga una imagen de docker hub explicitamente, o se descarga automaticamente cuando hace llamado a docker run
docker pull alpine

Hacer un echo

Al ejecutarse el contenedor mostrar en consola un "Hola Mundo"
$docker container run alpine echo 'Hola Mundo'

Abrir un archivo

Mostrara el contenido del archivo que incluye le mensaje del dia, que se muestra cada vez que se inicia sesion. 
$ docker container run alpine cat/etc/motd
 

Muestra las imagenes locales

$ docker images

Lista de Contenedores Activos

$ docker container ls
//tambien con el comando
$ docker ps

Lista de Contenedores 

Si has llegado hasta este punto podras ver un par de contenedores de alpine, fueron contenedores que se ejecutaron cumplieron con su proposito y se detuvieron.
$ docker container ls -a
//tambien con el comando
$ docker ps -a

Con esta breve introduccion de algunos conceptos y ejemplo ayudara a enterder la interaccion de los contenedores en un proximo post.

 

ref:https://docs.docker.com/reference/


 

jueves, 13 de agosto de 2020

COMO INSTALAR DOCKER EN UBUNTU 20.04

Docker

es un sistema opensource que busca empaquetar, gestionar el despliegue de las aplicaciones con los recursos necesarios para que funcione, en algo llamado contenedores. Así creando una especie de máquinas virtualizadas super ligeras que favorece la implementación rápida y modular de un software en cualquier equipo que posea Docker.


Prerequisitos

Es necesario contar con una máquina con sistema operativo Ubuntu 20.04 con permisos de usuario. Además de actualizar la lista de paquetes del sistema y unos complementos de HTTP que apt requiere.

 sudo apt-get update
 sudo apt install apt-transport-https ca-certificates curl software-properties-common

Instalacion

Lo primero que se hace es descargar la llave GPG para verificar la firma de los paquetes

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Luego descargar el repositorio de Docker

 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Se actualiza los paquetes del sistema

 sudo apt update

Ahora se instala la versión comunity de Docker

 sudo apt install docker-ce

Solo falta verificar si el servicio de Docker está corriendo

 sudo systemctl status docker

Docker-Compose

Si piensa trabajar con varios contenedores a la vez y que se comuniquen entre ellos, es recomendable instalar Docker-Compose

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

En el siguiente post, profundizaremos un poco más Docker.

martes, 11 de agosto de 2020

COMO INSTALAR MYSQL EN UBUNTU

Mysql

Mmysql es una ase de datos relacional actualmente cuenta con la version comunity y la version enterprise  communmente encontrada en stack como lamp o wamp y en saas (sofw as service) como owrkpress, joomla, drupal entre otros. 


Lo primero que hay que hacer, es actualizar los paquetes del sistema

$ sudo apt-get update

Luego instalar el paquete correspondiente de mysql

sudo apt install mysql-server
 

NOTA:En el caso de presentar problemas por haberlo tenido anteriormente

Elimina o remueve paquetes propios d mysql
sudo apt-get remove --purge mysql-server* mysql-client mysql-common
Con autoremove se eliminan aquellos paquetes perdidos, generalmente instalados como dependencias de otras instalaciones, que ya no son necesarios:
sudo apt-get autoremove
Elimina del cache los paquetes .deb con versiones anteriores
sudo apt-get autoclean
Ahora actualizar los packetes del sistema con los siguientes comandos
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade
Despues volver a instalar mysql
sudo apt install mysql-server
 

Es hora de ejecutar el siguiente script, permitira cambiar algunas opciones que trae por defecto la base de datos, mejorando bastante la seguridad.

sudo mysql_secure_installation
 
La siguiente opcion permitira configurar el complemento que validad la contraseña de los usuarios en la base de datos. En este caso lo valido, dependiendo que tan robusto quiere que sea la validacion, siendo 0 la mas baja y 2 la mas alta.
Press y|Y for Yes, any other key for No: Y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:

Sin importar la opcion que hayan elejido, el usurio root de la base de datos le pedira restablecer la contraseña y confirmar si esta agusto con la longitud de la contraseña.

 
Una vez terminada toda la parte de configuracion, se puede verificar si el servicio esta actualmente habilitado y corriendo en el servidor con el siguiente comando.
systemctl status mysql.service
Deberia aparecerles algo muy similar a este resultado.
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-08-1 12:05:04 UTC; 2min ago Main PID: 10382 (mysqld) Status: "Server is operational" Tasks: 39 (limit: 1137) Memory: 370.0M CGroup: /system.slice/mysql.service └─10382 /usr/sbin/mysqld

 

CONCLUSION

 Con esto se puede estar seguro de que el sistema de base de datos esta corriendo satisfactoriamente, para hacer operaciones en la base datos revisa el siguiente post. Sql (mysql)