/Docker

Practica Docker 2DAW

Practica Docker

Iván Pérez Fita

Introducción

Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos.​ Docker utiliza características de aislamiento de recursos del kernel Linux, tales como cgroups y espacios de nombres (namespaces) para permitir que "contenedores" independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales. Con DOCKER, puede usar los contenedores como máquinas virtuales extremadamente livianas y modulares. Además, obtiene flexibilidad con estos contenedores: puede crearlos, implementarlos, copiarlos y moverlos de un entorno a otro, lo cual le permite optimizar sus aplicaciones para la nube. Ventajas de los contenedores Docker

Modularidad

El enfoque Docker para la creación de contenedores se centra en la capacidad de tomar una parte de una aplicación, para actualizarla o repararla, sin necesidad de tomar la aplicación completa. Además de este enfoque basado en los microservicios, puede compartir procesos entre varias aplicaciones de la misma forma que funciona la arquitectura orientada al servicio (SOA). Control de versiones de imágenes y capas

Cada archivo de imagen de Docker se compone de una serie de capas. Estas capas se combinan en una sola imagen. Una capa se crea cuando la imagen cambia. Cada vez que un usuario especifica un comando, como ejecutar o copiar, se crea una nueva capa.

Docker reutiliza estas capas para construir nuevos contenedores, lo cual hace mucho más rápido el proceso de construcción. Los cambios intermedios se comparten entre imágenes, mejorando aún más la velocidad, el tamaño y la eficiencia. El control de versiones es inherente a la creación de capas. Cada vez que se produce un cambio nuevo, básicamente, usted tiene un registro de cambios incorporado: control completo de sus imágenes de contenedor. Restauración

Probablemente la mejor parte de la creación de capas es la capacidad de restaurar. Toda imagen tiene capas. ¿No le gusta la iteración actual de una imagen? Restáurela a la versión anterior. Esto es compatible con un enfoque de desarrollo ágil y permite hacer realidad la integración e implementación continuas (CI/CD) desde una perspectiva de las herramientas. Implementación rápida

Solía demorar días desarrollar un nuevo hardware, ejecutarlo, proveerlo y facilitarlo. Y el nivel de esfuerzo y sobrecarga era extenuante. Los contenedores basados en Docker pueden reducir el tiempo de implementación a segundos. Al crear un contenedor para cada proceso, puede compartir rápidamente los procesos similares con nuevas aplicaciones. Y, debido a que un SO no necesita iniciarse para agregar o mover un contenedor, los tiempos de implementación son sustancialmente inferiores. Además, con la velocidad de implementación, puede crear y destruir la información creada por sus contenedores sin preocupación, de forma fácil y rentable.

Por lo tanto, la tecnología Docker es un enfoque más granular y controlable, basado en microservicios, que prioriza la eficiencia.

¿Hay limitaciones para el uso de Docker?

En sí mismo, Docker es una excelente herramienta para la gestión de contenedores individuales. Al comenzar a utilizar cada vez más contenedores y aplicaciones en contenedores, divididas en cientos de piezas, la gestión y la organización se pueden tornar muy difíciles. Finalmente, debe retroceder y agrupar los contenedores para ofrecer servicios, como redes, seguridad, telemetría, etc., en todos sus contenedores. Es aquí donde aparece Kubernetes.

Con Docker no se obtiene la misma funcionalidad tipo UNIX que se obtiene con los contenedores Linux tradicionales. Esto incluye poder usar procesos como cron o syslog dentro del contenedor, junto con su aplicación. También hay limitaciones, por ejemplo, en cuanto a la eliminación de procesos nieto después de terminar con los procesos hijo; algo que se gestiona de forma inherente en los contenedores de Linux tradicionales. Estas cuestiones se pueden mitigar mediante la modificación del archivo de configuración y el ajuste de esas habilidades desde el comienzo (algo que no es inmediatamente obvio a simple vista).

Asimismo, existen otros subsistemas y dispositivos de Linux que no tienen espacios de nombres. Estos incluyen SELinux, Cgroups y dispositivos /dev/sd*. Esto implica que si un atacante obtiene control de estos subsistemas, el host se ve comprometido. Para permanecer liviano, compartir el kernel del host con contenedores abre la posibilidad de una vulnerabilidad de la seguridad. Esto difiere de las máquinas virtuales, las cuales están mucho más segregadas del sistema host.

¿Los contenedores Docker son realmente seguros?

El daemon de Docker también puede ser una preocupación en materia de seguridad. Para usar y ejecutar los contenedores Docker, es muy probable que utilice el daemon de Docker, un tiempo de ejecución persistente para los contenedores. El daemon de Docker requiere privilegios de raíz, por lo que se debe prestar especial atención a quiénes obtienen acceso al proceso y en dónde reside este. Por ejemplo, un daemon local tiene una superficie de ataque más pequeña que uno que se encuentra en un sitio más público, como un servidor web.

Fuente: https://www.redhat.com/es/topics/containers/what-is-docker

MySQL & Wordpress

Comandos

docker network create my_net

Crea la network por la que se contectaran los 2 containers

docker volume create vol_mysql

docker volume create vol_wordpress

Se crean los volumenes donde se guardaran los datos de los contenedores de wordpress y de MySql

docker run --name mysql_practice \
 -e MYSQL_ROOT_PASSWORD=12345678 \
 -e MYSQL_DATABASE=wordpress \
 -e MYSQL_USER=wordpress \ 
 -e MYSQL_PASSWORD=wordpress \ 
 -v vol_mysql:/var/lib/mysql \ 
 -p 3306:3306 \
 -h172.26.0.2 \
 --net=my_net \ 
 mysql:5.7

Este comando ejecuta el contenedor con MySQL se compone de:

  • --name: Indica el nombre del contenedor
  • -e: Indica las variables de entorno
  • -v: Indica el volumen que vamos a utilizar (Previamente creado) y se asocia al path /var/lib/mysql
  • -p: Enruta los puertos en este caso el puerto 3306 del contendor con el 3306 de nuestra maquina
  • -h: Indica la ip del contendor esto nos sera util para que wordpress se pueda conectar a el
  • --net: Indica la network que va a usar (Previamente creada)
  • Finalmente indicamos la imagen que se va a utilizar. Se esta usando la version 5.7 de MySQL ya que la version latest daba problemas al conectarse con Wordpress
docker run --name wordpress_practice \
 -e WORDPRESS_DB_HOST=172.26.0.2:3306 \
 -e WORDPRESS_DB_USER=wordpress \
 -e WORDPRESS_DB_PASSWORD=wordpress \ 
 -e WORDPRESS_DB_NAME=wordpress \ 
 --net=my_net \ 
 -p 80:80 \ 
 -v vol_wordpress:/var/www/html \
 wordpress:latest

Este comando ejecuta el contendor de Wordpress de compone de:

  • --name: Igual que en anterior indicamos el nombre del contenedor
  • -e: Indicamos las variables de entorno. En la variable de entorno WORDPRESS_DB_HOST indicamos la ip que hemos puesto en el contenedor de MySQL con el parametro -h
  • -p: Enrutamiento de puertos igual que el anterior pero en este caso del puerto 80
  • -v: Indicamos el volumen en este caso el path va a /var/www/html
  • Finalmente igual que en anterior indicamos la imagen a utilizar

Funcionalidad

Con estos comandos ya podemos ejecutar los 2 containers:

Al acceder a localhost podremos ver la pagina de instalación de wordpress

Configuramos la cuenta y podremos acceder tanto a la pagina como al panel de administración

Finalmente vamos a comprobar que la información se esta guardando correctamente asi que vamos a apagar los 2 contendores. El de wordpress de puede apagar con ctrl + c El de MySQl hay que apagarlo con el comando:

docker stop mysql_practice

Ahora limpiamos el ordenador de los containers antiguos con:

docker rm mysql_practice
docker rm wordpress_practice

Finalmente volvemos a crear los contedores con el comando mostrado anteriormete y al entrar a localhost

Veremos directamente la pagina que habiamos creado sin pasar por la instalación asi que los datos se estan guardando correctamente en los volumenes

Apache

Archivos

Vamos a crear 4 archivos

000-default.conf: Este sera el archivo de configuración de site en apache. Se usa 000-default.conf para ahorrarnos tener que hacer el enlace simbolico

404.html: Pagina de error de la pagina que vamos a mostrar con apache

index.html: Index de la pagina de apache

Finalmente el mas importante Dockerfile:

Dockerfile

FROM ubuntu Indicamos que vamos a usar la imagen de ubuntu

RUN apt-get update Ejecutamos un update para bajarnos los paquetes correctamente

RUN apt-get install apache2 -y Instalamos apache

COPY 000-default.conf /etc/apache2/sites-available/000-default.conf Copiamos el 000-default.conf a el site de apache

COPY index.html /var/www/html/index.html Copiamos el index.html para que se muestre al ejecutar el apache

COPY 404.html /var/www/html/404.html Copiamos el 404.html para mostrarlo en caso de error

CMD apache2ctl -D FOREGROUND Ejecutamos el apache cuando se cree el contenedor el FOREGROUND se indica ya que si se ejecuta en background el contendor se cerraria

EXPOSE 80 Exponemos el puerto 80

Contenedor

Antes de nada vamos a crear un archivo donde pasaremos los logs del contendor

mkdir dockerlog

Ejecutamos el

docker build .

Finalmente realizamos el run

docker run -v /home/ivan/dockerlog:/var/log/apache2/ -p 80:80 8ed3989330c0
  • -v: Indicamos el volumen en este caso guardaremos los archivos de /var/log/apache2 en /home/ivan/dockerlog
  • -p: Enrutamos el puerto 80
  • Finalmente ponemos el id de la imagen que se ha creado

Ahora podremos acceder a locahost para ver index.html

Podremos ver la pagina de error

Y si vamos a la carpeta /home/ivan/dockerlog veremos los logs