Si eres de los que entraron a la profesión computacional e informática, sabrás que cada día salen nuevas herramientas que es necesario aprender. Entre ellas, el concepto de contenedores de Linux, que nos permiten construir y desplegar aplicaciones de manera mas eficiente. Docker es una herramienta necesaria de conocer en ese sentido, así que explicaré de que se trata después del salto.
Contenedores
La mayor parte de la tecnología existen de Internet hoy, se basa en el paradigma cliente-servidor, donde una máquina envía una petición de información (cliente) a otra que procesa y envía la respuesta (servidor). En estas últimas, lo ideal es saber dividir y administrar los procesos, aplicaciones y servicios para que la respuesta sea rápida y concisa a las necesidades del cliente.
Ahora bien, ya existen aparte del sistema de contenedores, otras de realizar la separación, mediante máquinas y host virtuales, Las grandes diferencias existentes eso si. están en que, mientras la máquina virtual, es un servidor dentro de otro, el virtual host es un espacio, con su propio usuario, dentro del mismo servidor web. Algo como lo que podría ejemplificar abajo.
- Virtual Host: Separa las aplicaciones web por usuario y directorios, pero siempre ocupan el mismo servidor web (apache o nginx).
- Virtual Machine: Una máquina virtual, "virtualiza" un servidor dentro del real. Pueden ser varias dentro del mismo, con todo lo que este conlleva, compartiendo eso si, recursos de la máquina huésped.
- Contenedores: Son imágenes que que trabajan en conjunto dentro del servidor, muy parecidas a las VM, con la salvedad que tienen lo necesario para trabajar ciertas partes de la aplicación y pueden comunicarse entre si de manera mas fácil que dos VM. La diferencia con las anteriores es que son una imagen con solo lo necesario para el despliegue.
En los sistemas basados en Linux, que son los más usados en el mundo, poseen varias herramientas a la hora de administrar las peticiones del servidor, entre ellas lo que se conocen como virtual host para web y los contenedores. Estos últimos son "imágenes" del sistema con lo necesario para que un web-server, una base de datos relacional , sistema de archivos etc., puedan funcionar independientemente dentro del servidor. Como son algo complicados de utilizar, es que aparece la solución, de entre varias similares, conocida como Docker.
¿Qué es Docker?
Docker es un conjunto de herramientas de software que se utilizan para el despliegue y mantenimiento de aplicaciones y su función principal, está basado en el paradigma de los contenedores. Permite crear imágenes con lo necesario para ejecutar dichas aplicaciones. Cada versión viene con Linux, por lo genera Ubuntu, con los archivos necesarios para la ejecución, que se llaman imágenes, las cuales se pueden ejecutar y administrar en paralelo, de forma independiente, pero que pueden interconectarse entre si.
Esto permite varias cosas entre las que se destacan, el poder aislar y comunicar los distintos componentes de una aplicación, por ejemplo, la aplicación web, de la API y/o las bases de datos, mayor facilidad en el despliegue e incluso en el control de versiones. Eso sin contar que posee una gran biblioteca de imágenes creadas, tanto por la comunidad, como por empresas que gestionan software libre.
Instalación.
El proceso de instalación de Docker es sencillo. Aquí explicaré su instalación en Ubuntu.
Lo primero es actualizar el gestor de paquetes
sudo apt update
Lo siguiente es instalar los paquetes necesarios para la certificación HTTPS
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Se agrega la key GPG del repositorio oficial de Docker.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Y luego se agrega el repositorio al gestor de paquetes.
echo "deb \[arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg\] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Se vuelve a actualizar el gestor de paquetes y se revisa cual es la versión estable.
sudo apt update
Se procede a la instalación.
sudo apt install docker-ce
Una vez instalado, se comprueba si el demonio se ha inicializado.
sudo systemctl status docker
La salida
Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 7854 (dockerd)
Tasks: 7
Memory: 38.3M
CPU: 340ms
CGroup: /system.slice/docker.service
└─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Por último, se asigna un usuario a Docker.
sudo usermod -aG docker ${USER}
# Una vez el usuario esta con privilegios.
su - ${USER}
Usando Docker.
Si bien tiene varios comandos. Acá se solo mostraré los esenciales para su uso. Docker en su repositorio oficial tiene varias imagenes ya creadas que nos serán esenciales. Aquí explicare el uso básico para el despliegue de una simple aplicación web.
Lo primero que haremos es instalar el contenedor oficial de apache.
docker search apache
La salida nos mostrará algo así.
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4583 \[OK\]
tomcat Apache Tomcat is an open source implementati… 3600 \[OK\]
maven Apache Maven is a software project managemen… 1529 \[OK\]
zookeeper Apache ZooKeeper is an open-source server wh… 1391 \[OK\]
cassandra Apache Cassandra is an open-source distribut… 1501 \[OK\]
solr Apache Solr is the popular, blazing-fast, op… 968 \[OK\]
flink Apache Flink® is a powerful open-source dist… 405 \[OK\]
groovy Apache Groovy is a multi-faceted language fo… 144 \[OK\]
tomee Apache TomEE is an all-Apache Java EE certif… 113 \[OK\]
storm Apache Storm is a free and open source distr… 195 \[OK\]
spark Apache Spark - A unified analytics engine fo… 19 \[OK\]
...
El comando anterior, nos busca la imagen por nombre desde el repositorio oficial de docker. Aparte de este, hay muchos otras imagenes customizadas por la comunidad, pero por ahora usaremos esta.
docker pull httpd
Nota: el comando anterior permite descargar la imagen, sin embargo, podemos hacerlo directamente con el comando docker run *nombre de la imagen*
Una vez descargada veremos las imágenes que tenemos con el siguiente comando:
docker images
Nos dará la siguiente salida:
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 181007c9adb9 4 weeks ago 77.8MB
portainer/portainer-ce latest d7f7a88e1acc 6 weeks ago 294MB
postgres latest f7d9a0d4223b 7 weeks ago 417MB
En este caso, tengo 3 imágenes instaladas. En la lista se detalla lo siguiente.
- Repository: el nombre del repositorio de la imagen.
- TAG: nos indica que la última versión disponible.
- Image ID: Es el identificador de la imagen.
- Created: Los días que lleva creado el sistema.
- Size: El tamaño de la imagen.
Para instalar un contenedor a partir de una imagen, se usa el siguiente comando.
docker run --webserver test -it httpd # el tag --name es el nombre del contenedor
Con el siguiente comando, veremos los contenedores creados y sus status
docker ps -a
# Salida
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 31679f076b43 postgres "docker-entrypoint.s…" 11 days ago Up 10 minutes 5432/tcp database
181007c9adb9 httpd "/bin/bash" 11 days ago Exited (137) 10 days ago webserver
cab1cfd94b3c portainer/portainer-ce:latest "/portainer" 11 days ago Up 2 hours 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 8000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer
En esta salida, podemos apreciar lo siguiente:
- Container ID: el identificador del contenedor.
- Image: La imagen utilizada para crearlo.
- Command: el comando requerido para ingresar a el (opcional al /bin/bash/)
- Created: dias y horas en que fue creado.
- Status: el estado en que se encuentra (indica los días y horas en que fue ejecutado si esta detenido)
- Ports: los puertos que utiliza. Si aparecen son los puertos públicos. Algunas imagenes traen los puertos configurados. Para arrancar los contenedores se requiere el siguiente comando.
docker start 181007c9adb9
donde al lado de start
, pondremos la ID del contenedor. En nuestro caso, arranqué httpd
y postgres
.
Dentro del contenedor.
Una vez inicializado el contenedor, para ingresar a el, necesitamos el siguiente comando.
docker exec -it 181007c9adb9 /bin/bash
En nuestro caso, ingresamos al del servidor web. Dentro de este, podremos gestionar todo lo que será la aplicacion web. Ahora bien ¿Qué pasa si quiero separar la aplicacion web, de la base de datos? Por defecto, Docker posee una subred que actúa de puente y que utiliza por defecto, la IP 172.17.0.0/16 o 172.17.0.1/16. Se puede verificar con el comando ip adress en el host principal.
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:29:ab:78:66 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:29ff:feab:7866/64 scope link
valid_lft forever preferred_lft forever
Las ips asignadas dentro del rango de IP's del contenedor, van siendo realizadas por orden de creación y siempre son las mismas. Aquí por ejemplo, veremos la IP de uno de los contenedores.
docker inspect -f \\
La salida sería la siguiente
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \\
31679f076b43 // el contenedor de la base de datos
Cada contenedor posee su propia IP, por lo que es fácil conectarla. Vamos entonces a conectar la aplicacion web con la base de datos usando las IP
Ingresamos al config.php
de la aplicacion.
$cfg = new stdClass();
$cfg->url = 'http://ipmaquina:81/erp'; // en cuanto se asigne un dominio, se cambia
$cfg->dbhost = '172.16.0.4'; // La IP del contenedor de base de datos. En este caso PostgreSQL $cfg->dbport = '5432';
$cfg->dbuser = 'nombreusuario'; $cfg->dbpass = 'claveusuario';
$cfg->dbname = 'nombrebasededatos';
// $cfg->log = 'C:\\\\tools\\\\Apache24\\\\htdocs\\\\erp\\\\logs\\\\'; $cfg->log = $\_SERVER\['DOCUMENT_ROOT'\].'/erp/logs/';
Una vez terminado, la aplicación se estará ejecutando.
Concluyendo.
Docker tiene muchas otras herramientas que no detallaré aquí, pero con esto, pueden desplegar una aplicacion web, API o cualquier servicio de manera simple. Es una forma eficaz de trabajar sin tener que sobrecargar el servidor.
Por cierto, tambien tiene una herramienta gráfica llamada Portainer, la cual muestra el estado de los contenedores y permite gestionar Dockers desde la web, lo que facilita mucho el uso.
En fin, esto es más que nada para comenzar a utilizar el poder de los contenedores y administrar mejor los recursos del server. Nos vemos en otro post.
Top comments (0)