Mes: agosto 2023

Comandos básicos en Docker

Este artículo contiene una recopilación de principios y Comandos básicos en Docker que permitirán realizar las acciones más comunes de administración y gestión de contenedores, así mismo, crear, y manipular imágenes, contenedores y utilizar las fuentes oficiales para descargar imágenes preconfiguradas.

Si quiere aprender a programar un buen lugar para empezar es este: Historia Funcionamiento y Características

1. ¿Qué es Docker?

Docker es una popular aplicación para correr contenedores super livianos en nuestra máquina, en muchos sentidos se asemeja a una máquina virtual con la principal diferencia que en Docker los contenedores suelen ser muy livianos lo cual nos permite tener incluso varios corriendo simultaneamente.

Estas máquinas virtuales se crean a partir de imágenes que corresponden a sistemas operativos y comandos que permiten configurar el sistema operativo con las aplicaciones y paquetes que necesitaremos, por razones de desempeño y tamaño se suele utilizar Linux en alguna de sus distribuciones.

Otro aspecto importante es que Docker permite la configuración a nivel de detalle de los contenedores, en este sentido permite cambiar los tamaños de los discos, las configuraciones de la red e incluso monitorear las máquinas, además de que todo lo anterior se puede hacer con código habilitando el escalamiento vertical.

2. DockerFile

Si quieres descargar imágenes oficiales preconfiguradas de software popular puedes utilizar el siguiente enlace

Hub Docker

Para crear tus propias imágenes puedes crear un archivo llamado Dockerfile con un contenido similar al del siguiente código. Observa que es necesario parámetros como -y, ya que no tendremos la posibilidad de interactuar con la consola.

FROM ubuntu

RUN apt install apache2 -y

Luego puedes construir la imagen usando el siguiente comando, estará disponible para crear contenedores como se indicará posteriormente. Observa que el directorio actual debe contener el archivo Dockerfile y además puedes personalizar el nombre de la imagen.

docker build --tag httpd-ubuntu .

Alternativamente, se puede descargar la imagen preconfigurada de un servidor http usando el siguiente comando. Link de la imagen httpd. Es importante anotar que las imágenes se pueden versiona y cuando descargamos una sin versión estaremos descargando la etiquetada como latest.

docker pull htttp

Un archivo Dockerfile completo tiene las siguiente secciones, cada uno de ellos comandos para acciones especificas, por ejemplo FROM especifica la imagen a usar y RUN ejecuta un comando, tal como se vio en el código anterior.

Comments
FROM
CMD
ENTRYPOINT
WORKDIR
ENV
COPY
LABEL
RUN
ADD
.dockerignore
ARG
EXPOSE
USER
VOLUME

3. Imágenes

Las imágenes de docker pueden ser descargadas desde las fuentes oficiales como se mostró anteriormente o construidas, en cualquier caso la manipulación de las mismas se realiza con los siguientes comandos.

docker images
docker rmi image_name:version
docker -f dangling=true

4. Contenedores

Una vez contamos con imágenes descargadas las podemos poner a correr en contenedores o pequeñas máquinas virtuales que emulan nuestro software, el siguiente comando permite verificar los contenedores que están corriendo, algunas opciones como -a muestran todos los contenedores incluso los detenidos.

docker ps

Algunos otros comandos como los listados a continuación permiten: renombrar contenedores, detener un contenedor, iniciar un contenedor, reiniciar un contenedor, abrir una consola del contenedor, respectivamente.

docker rename old_name new_name
docker stop id
docker start id
docker restart id
docker exec -u root -ti container_name bash

Las imágenes se pueden poner a correr, con lo cual se crea un contenedor, usando un comando como el siguiente que especifica puertos y volúmenes, es decir el mapeo de puertos y volúmenes desde el contenedor hacia la máquina host. Las opciones completas del comando se encuentran aquí.

docker run -d --name image_name -p hostport:containerport -e "envirment_variables_assing" -v volhost:volcontainer

5. Volúmenes

Los siguientes comandos permiten verificar los volúmenes y administrarlos

docker volumen ls
docker volumen ls -f dangling=true
docker volumen rm id

6. Red

Los siguientes comandos permiten administrar las configuraciones de red de los contenedores.

docker network ls
docker network create -d bridge --subnet ip/mask --gateway ip name
docker network inspect name

7. Artículos de Interés

Manejo de Excepciones en Java

El manejo de excepciones es un punto muy importante de cualquier programa, en esta página se explica todo lo concerniente a Manejo de Excepciones en Java, sintaxis y principales usos.

Si quieres saber más sobre la historia y funcionamiento de Java visita este link.

1. Generalidades del Manejo de Excepciones en Java

En general un programa puede fallar por diversas razones, por ejemplo un error de código, un recurso no disponible o un valor de una entrada incorrecto. Y aunque existen muchas otras razones para que se produzcan fallos, es muy importante al momento de programar tener en cuenta estos posibles errores y tratarlos.

Una excepción es la forma de decir que algo no funcionó como se esperaba, aquí es bueno considerar que la forma tradicional de manejar estos casos ha sido con códigos de error, sin embargo un programa profesional debería tener un manejo robusto de errores, lo cual implica en Java, la definición de diferentes clases que puedan representar errores y el manejo apropiado de los mismos.

2. Árbol de Excepciones, Excepciones verificadas y no verificadas

En Java no tenemos que empezar desde cero a escribir las excepciones, ya existen una gran cantidad de clases que las pueden representar. En la figura 1, se muestran la jerarquía de estas excepciones.

ExcepcionesJava
Figura 1. Excepciones en Java

Esta imagen muestra las principales clases para manejar excepciones todas ellas pertenecientes al paquete java.lang.

Las excepciones Error y RuntimeException y las que derivan de ellas vía herencia, se llaman excepciones no verificadas, con lo cual cuando un método lanza estas excepciones no es necesario realizar el proceso de captura como se explicará más adelante. En el caso de las excepciones no verificadas estas aparecerán en tiempo de ejecución causando la terminación del programa de forma abrupta sino fueron debidamente capturadas.

Las Excepciones referidas como Excpetion y derivadas de esta clase deben ser capturadas de forma obligatoria o el compilador arrojará un mensaje de error.

Como nota adicional, las excepciones siempre terminan en la palabra Exception, esto es más una convención que algo obligatorio, pero es bueno seguirla pues es la costumbre entre los desarrolladores de Java.

3. Lanzando y capturando Excepciones

Para lanzar una excepción basta que un método propio del entorno de Java o de una librería lo lance o también se puede realizar un lanzamiento manual a través de la palabra reservada throw, que requerirá una instancia de la clase de Excepción que se va a lanzar.

throw new Exception("Error detail");

Para capturar una Excepción basta con ejecutar el código que puede lanzar una excepción usando la estructura de control try – catch, que en general se muestra en la siguiente fragmento de código.

try {
    // Código susceptible de error
} catch(TipoExcepcion_1 ex1) {
    // Procesamiento del error
} catch(TipoExcepcion_2 ex2) {
    // Procesamiento del error
} catch(TipoExcepcion_n exn) {
    // Procesamiento del error
} finally {
    // Procesamiento obligatorio
}

En la sección try, se empezará a ejecutar el código, tan pronto se lance una excepción se dejará de ejecutar código y se continuará con la verificación de las cláusulas catch.

Los bloques catch atraparan la primera excepción que coincida con el error lanzado en la sección try. El orden de los catch es importante porque solo se procesará el primero. Además es conveniente indicar que la sección finally siempre se ejecutará, esta normalmente es reservada para liberar recursos.

Es frecuente encontrar que en los bloques catch o finally se vuelvan a lanzar excepciones en caso que el bloque o el punto donde se encuentra el código no sea capaz de manejarlo, a esto se le conoce como lanzamiento de segundas excepciones.

4. Manejo de Excepciones en los métodos

Cuando creamos un método en Java es posible que el mismo no tenga la capacidad o la suficiente información como para manejar alguna excepción en este caso es posible indicar en la firma del método, las excepciones que no se manejan allí y que puede eventualmente lanzar. En estos casos, la parte del código que llama a estos métodos deberá capturarlos con estructuras try – catch o a su vez volverlos a indicar que no puede manejar las excepciones. Estos e puede repetir, método tras método hasta que alguno de ellos maneje la excepción o hasta que se llegue al punto de entrada del programa, es decir al main.

ReturnType name(parameters) throws ClassException1, ClassException2 {
}

Note lo siguiente:

  • Al método main se le puede agregar la clausula throws
  • No es lo mismo throw para lanzar excepciones, que throws para indicar que un método puede lanzar esas Excepciones.
  • La cláusula throws puede tener varias clases de Excepción separadas por coma.
  • Las cláusulas throws pueden servir para diferenciar métodos con los mismos nombres, por lo cual, estas excepciones sirven para sobrecargar los métodos.

5. Excepciones personalizadas

El programador puede crear sus propias clases de Excepción para representar situaciones que deban ser controladas según el dominio del software en cuestión. Para hacer esto basta con heredar de alguno de las clases típicas de Excepción, mostrada en la Figura 1. Normalmente será heredado de Exception.

Adicionalmente, es común que se provea un mensaje explicativo de la Excepción redefiniendo el contenido del atributo message en la clase Exception.

6. Try – Catch con recursos

En programación es muy habitual que se manejen recursos, como archivos, páginas web y conexiones a bases de datos, todos estos siguen una regla general y es que cualquier recurso que se abra debe cerrarse, en caso de no hacerlo se corren grandes riegos de problemas debido agotar recursos, concurrencia y en general efectos indeseados difíciles de detectar.

Debido a lo habitual que es que los programadores olviden cerrar los recursos existe una variante de la estructura try – catch llamada try – catch with resources, que cierra automáticamente estos recursos por el programador.

La forma de definirlo es muy similar simplemente se debe declarar aquellos recursos que se puedan cerrar en los paréntesis del try tal como se muestra en el código 4.

try (FileReader fr = new FileReader(path);
    BufferedReader br = new BufferedReader(fr)) {
    return br.readLine();
}

Para que los recursos puedan ser utilizados entre los paréntesis deben haber implementado la interface AutoCloseable o Closeable y al final de del try se ejecutaran los métodos close de los respectivos recursos.

7. Artículos de Interés

© 2024 ochoscar's blog

Tema por Anders NorenArriba ↑