Translate

lunes, 28 de octubre de 2019

Crear un contenedor DOCKER (1) con APACHE+PYTHON36+MOD_WSGI

Cuando desarrollas aplicaciones, es muy importante complementar los desarrollos con test de pruebas. A menudo, ante las quejas de un usuario sobre el funcionamiento de una aplicación, podemos oir al soporte responder: "pues a mí me funciona correctamente".

Las prisas por entregar un proyecto NO permiten realizar extensas pruebas en distintas plataformas o versiones de S.O. y tampoco es posible plataformar un servidor o equipo en producción siempre que lo necesitemos.

Para proyectos como :
  • Sitios web
  • Servicios
  • Procesos
  • Aplicaciones

Los contenedores son una nueva forma de implementar aplicaciones, donde es posible ejecutar servicios y procesos en un entorno protegido. Los principales beneficios de los contenedores, si se comparan con las máquinas virtuales clásicas, son los siguientes: la implementación es mucho más rápida, la administración es mínima, no es necesario aplicar parches.

Mi objetivo es crear un CONTENEDOR que contenga un S.O. ( CENTOS 7 ) + APACHE + PYTHON3.6 + MOD_WSGI, y todo ello con el fín de empaquetar un sistema completo, incluyendo su propio entorno, donde se hayan realizado todos los test de prueba y carga.

DOCKER

Cuando hablamos de contenedores, no podemos evitar hablar de DOCKER, quizás la plataforma de contenedores más conocida. DOCKER es una herramienta que está diseñada para beneficiar tanto a los desarrolladores como a los administradores de sistemas. Docker está disponible en dos ediciones: Enterprise Edition y Community Edition. Esta última es la ideal para desarrolladores y pequeños equipos que desean experimentar con aplicaciones basadas en contenedores.


Está disponible para estos sistemas operativos:
  • Windows 10
  • MAC
  • Fedora
  • Debian
  • Ubuntu
  • CentOS
Existen dos canales de actualización:
  • Edge: nuevas características cada mes
  • Stable: actualizaciones confiables cada trimestre
El soporte se proporciona a través del Foro de la Comunidad de Docker.

Docker tiene el mismo motor en Linux y Windows.


INSTALAR DOCKER


 

Como plataforma de pruebas, estoy utilizando una RASPBERRY PI 3B+ con S.O. UBUNTU SERVER 16.04 y ahora comienzo a instalar el servicio DOCKER.

$ sudo su
$ sudo curl -sSL https://get.docker.com/ | sh
# Executing docker install script, commit: f45d7c11389849ff46a6b4d94e0dd1ffebca32c1
+ sudo -E sh -c apt-get update -qq >/dev/null 


Debemos agregar el usuario 'ubuntu' al grupo docker. Esto sirve para poder ejecutar Docker sin anteponer la opción sudo.

$ sudo usermod -aG docker ubuntu

Reiniciar..

$ sudo reboot

Una vez completado el reinicio

$ docker -v

Instalar python 3 :

$ sudo apt-get install python-pip python3-pip
$ sudo apt-get install python3-dev python3-cffi libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev

Instalar docker-compose
$ sudo su
$ sudo pip3 install docker-compose
ó si da error...
$ python3 -m easy_install docker-compose

Comprobar la version instalada

$ docker-compose --version

Creamos nuestro primer container de prueba, para lo que descargamos una IMAGEN de Apache:

$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
d852f02e2b4c: Pull complete
ab75f5d475d0: Pull complete
9647edb2ed9b: Pull complete
eeced0d4397e: Pull complete
a394083bd2d5: Pull complete
Digest: sha256:649bd29cc9284f06cf1a99726c4e747a83679e04eea3311b55022dd247026138
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

y creamos el contenedor :

$ docker run -p 81:80 httpd

solicito crear un contenedor con la imagen que acabo de descargar (pull), con apache ya configurado, y exponer el puerto 81 del contenedor que corresponde al puerto 80 interno de apache. La razón por la que no puedo usar el puerto 80 es porque solo hay un puerto 80 para cada Host de Contenedor, por lo que el NAT es fundamental cuando planeamos utilizar contenedores.

Desde un navegador podrá http://*.*.*.*:81 (sustituya los * por su propia ip o localhost si fuera su caso)


It works!

...será la respuesta.

Estos son algunos comandos útiles para administrar su máquina Docker, 'id_container' es el nombre que podemos proporcionar al contenedor en su creación o por defecto, el que DOCKER le dará al crearlo sin indicarle ninguno. 'id_immagine' es la imagen que previamente hemos descargado con 'pull' :
  • Descargar Imagen - docker pull id_immagine
  • Start Container – docker start id_container
  • Stop Container – docker stop id_container
  • Abrir una sesión – docker exec -it id_container /bin/bash
  • Abrir una sesión como root -- docker exec -u 0 -it id_container /bin/bash
  • Lista de Imagenes – docker images
  • Lista de contenedores – docker ps -a
  • Eliminar Imagen – docker rmi id_immagine
  • Eliminar Container – docker rm id_container
Para gestionar CONTENEDORES

En los comandos siguientes ID_CONTAINER es el nombre del contenedor, que podemos elegir al crearlo, y RED es el nombre de una red ya existente.

Para crear un contenedor (y ponerlo en marcha):
sudo docker run --name=
ID_CONTAINER  IMAGEN
El problema de este comando es que dejamos de tener acceso a la shell y sólo se puede parar el proceso desde otro terminal.
  • Para crear un contenedor (y ponerlo en marcha):
    docker run --name=
    ID_CONTAINER  IMAGEN
  • Para crear un contenedor (y ponerlo en marcha):
    docker run --name=
    ID_CONTAINER  IMAGEN
    El problema de este comando es que dejamos de tener acceso a la shell y sólo se puede parar el proceso desde otro terminal.
  • Lo habitual es poner en marcha el contenedor en modo separado (detached), es decir, en segundo plano, y así podemos seguir utilizando la shell:
    docker run -d --name=
    ID_CONTAINER IMAGEN
  • Si queremos ver la secuencia de arranque del contenedor, podemos poner en marcha el contenedor en modo pseudo-tty, que trabaja en primer plano, pero del que podemos salir con Ctrl+C.
    docker run -t --name=
    ID_CONTAINER IMAGEN
  • Al crear el contenedor se pueden añadir diversas opciones:
    Para incluir el contenedor en una red privada virtual (y que se pueda comunicar con el resto de contenedores incluidos en esa red):
    docker run --name=
    ID_CONTAINER --net=RED IMAGEN
     
  • Para que el contenedor atienda a un puerto determinado, aunque internamente atienda un puerto distinto:
    docker run --name=
    ID_CONTAINER -p PUERTO_EXTERNO:PUERTO_INTERNO
    IMAGEN 
  • Para establecer variables de configuración del contenedor:                                                      docker run --name=ID_CONTAINER -e VARIABLE=VALOR IMAGEN

Salir de la shell del contenedor con 'exit'


Para copiar (o mover) archivos entre el contenedor y el sistema anfitrión o viceversa:
docker cp
ID_CONTAINER:ORIGEN DESTINO
docker cp ORIGEN
ID_CONTAINER:DESTINO


Cosas importantes a saber antes de crear un contenedor DOCKER:

    *
El contenedor no tendrá nada instalado por defecto, lo primero que se hará es un 

      apt-get update  o yum update para descargar los repositorios del sistema

    * Crear un contenedor desde una imagen con -i permite acceder al contenedor inmediatamente despues de su creación :

      docker run -i -t --name=id_container centos:7 /bin/bash

    * Una vez dentro del contenedor se puede escribir 'exit' y se saldrá del contenedor, pero se perderá toda la  información del contenedor, archivos, aplicaciones, instalaciones… para salir sin cerrar el contenedor 'CTRL+Q+P'


    * Una vez configurado un contenedor con todos los elementos instalados, puede crear una nueva imagen del contenedor :

    $ docker commit ID_CONTAINER ID_NUEVA_IMAGEN
A partir de ahora, podrá crear nuevos contenedores a partir de ID_NUEVA_IMAGEN

CREAR CONTENEDOR DOCKER CON CENTOS 7+ APACHE + PYTHON3 + MOD_WSGI


$ docker pull centos:7

$ docker run -ti --name centos_one centos:7 /bin/bash 
[root@50b7b40cfd61 /]# 

...estará en la shell por crear el contenedor con -i ...
# yum update

Instalar PYTHON 3.6 desde los fuentes :
# yum groupinstall -y "Development Tools"

# yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel

# yum install -y wget


# mkdir /home/tmp

# cd /home/tmp 




# wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz
# tar -xJf Python-3.6.9.tar.xz
# cd Python-3.6.9
# ./configure    o  

   ./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
# make
# make altinstall


Instalar drivers para MySQL (mysql-connector) y PostgreSQL (Psycopg2)

# pip3.6 install mysql-connector-python 

# pip3.6 install Psycopg2

Instalar apache :


# yum install httpd httpd-devel mod_ssl

Instalar mod_wsgi desde fuentes:

# cd ..
# yum -y install python36-devel
# wget "https://github.com/GrahamDumpleton/mod_wsgi/archive/4.6.8.tar.gz"
# tar -xzf '4.6.8.tar.gz'
# cd ./mod_wsgi-4.6.8
#./configure --with-python=/usr/bin/python3.6

#make
#make install


Instalaciones varias y opcionales


# yum install zip unzip
# yum install ImageMagick ImageMagick-devel

Incorporar este software python es opcional, pero necesario para instalar PYMETRICK

# pip3.6 install datetime
# pip3.6 install pillow==4.0.0             
Tratamiento de imagenes
# pip3.6 install qrcode                          Generar cógidos QR
# pip3.6 install requests
# pip3.6 install openpyxl                     
Crear y leer ficheros EXCEL xlsx

# pip3.6 install fpdf                              Crear fichero PDF
# pip3.6 install certifi





Ya he instalado todo el software necesario para ejecutar un contenedor CENTOS7+APACHE+PYTHON3+MOD_WSGI. Si te preguntas por qué no incluir MySQL o PostgreSQL, la recomendación es no incluir más de una aplicación o servicio por cada contenedor. Siempre es posible crear redes entre contenedores para que se puedan intercomunicar o bien, comunicarse con los propios servicios del host, o de un cloud.

Salimos con CTRL+Q+P y paramos el contenedor con
$ docker stop centos_one

Crear una nueva imagen a partir del contenedor creado:

$ docker commit centos_one centos7_httpd_py3_mod_wsgi

Verá el resultado con :

$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
centos7_httpd_py3_mod_wsgi   latest              3ae42078c5f2        34 seconds ago      1.13GB


Hasta aquí la instalación de hoy, pero continuamos hasta crear una aplicación web completa basada en nuestro librería python 3 PYMETRICK

Nota: Todo el tutorial realizado solo tiene un fin teórico de aprendizaje sobre Docker, priorizando un s.o. y librerias python muy conocidas por todos. Los siguientes tutoriales priorizan las soluciones más profesionales para desplegar servicios en proveedores de la nube (Cloud) así como la creación de contenedores con fichero de configuración o dockerfiles. 






No hay comentarios:

Publicar un comentario