viernes, 27 de marzo de 2020

Docker 101 ¡en mi maquina funciona!!!

En los últimos años todo el mundo está hablando de contenedores. Y especialmente de Docker.

Los contenedores solucionan un problema (o una disculpa) muy extendido en el mundo del desarrollo como es "En mi máquina funciona" también conocido como "works on my machine"

Una imagen docker no es como una máquina virtual, es mucho más ligera, pero es el símil más fácil para describir rápidamente lo que es. Aunque en el fondo no se parecen en nada.
Una maquina virtual simula una maquina completa, tanto su hardware, como su software. En el caso de un contenedor funcionan sobre el núcleo del sistema operativo de la maquina donde se ejecutan (host).
Por ejemplo una maquina linux puede hospedar una maquina virtual que ejecute windows, pero no puede ejecutar un contenedor basado en windows (sí, sí, hay contenedores basados en windows)

Para usar docker evidentemente lo primero que hay que hacer es instalarlo. Es bastante fácil, incluso en windows si quieres usar contenedores linux, docker
ofrece una solución basada en virtualización y en un futuro cercano lo hará sobre wsdl2.

Imágenes docker.
Evidentemente, lo primero que tienes que hacer es instalar docker
Lo segundo es elegir una imagen para comenzar a trabajar.

Prácticamente cualquier infraestructura que necesites tienes una imagen de docker lista para bajar y comenzar a usarla.
El mejor lugar para encontrar esas imagenes es en el repositorio oficial: el docker hub

En este post bajaremos una imagen con un servidor web apache, basada en una distribución de linux Alpine.  Para descargarnos la imágen lo único que tenemos que hacer es ejecutar el comando docker pull IMAGENAME y después listamos todas las imagenes instaladas en nuestra máquina con docker images así es como lo veo en mi máquina
~$ docker pull httpd:2.4-alpine
2.4-alpine: Pulling from library/httpd
Digest: sha256:06ad90574c3a152ca91ba9417bb7a8f8b5757b44d232be12037d877e9f8f68ed
Status: Image is up to date for httpd:2.4-alpine
docker.io/library/httpd:2.4-alpine
~$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
apache-krb5              1.0.0               af61fbda4863        2 days ago          112MB
httpd                    2.4-alpine          54b0995a6305        3 days ago          107MB
debezium/connect         0.9                 28e60fa48820        9 months ago        678MB
debezium/example-mysql   0.9                 c7585fcd90bc        9 months ago        373MB
mysql                    5.7                 7faa3c53e6d6        10 months ago       373MB
hello-world              latest              fce289e99eb9        15 months ago       1.84kB

Ejecutar una imagen
Una vez que tenemos la imagen descargada, pues la podemos ejecutar con el comando docker run. En este ejemplo, redijo el puerto 8080 de mi máquina al puerto 80 de la imagen docker que es donde el apache está funcionando.
~$ docker run -dit --name apache-test -p 8080:80 httpd:2.4-alpine
fea7823d78ab3b2f96f002b8524692a3037a18c76cd1ce8f088c9b12aa8a4ab5
~$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>
Me puede interesar abrir una shell en un contenedor docker. Alpine no trae bash por defecto pero puedes usar ash, por ejemplo:
~$ docker exec -it apache-test /bin/ash
/usr/local/apache2 # ls
bin      build    cgi-bin  conf     error    htdocs   icons    include  logs     modules
/usr/local/apache2 # curl localhost
/bin/ash: curl: not found
/usr/local/apache2 # exit

Dockerfile: cocinando imagenes
Como se puede ver en la ejecución anterior, la imagen que nos hemos bajado no tiene curl. Para añadirlo, la manera más fácil es usando el gestor de paquetes de la distribución. Las imagenes docker son como los ogros las cebollas, es una capa, sobre otra capa, sobre ortra... Cocinar nuestra version de una imagen crearemos un fichero llamado dockerfile y partimos sobre la imagen que queramos y le vamos añadiendo lo que queramos ficheros, paquetes, etc... En este caso como mencionamos antes vamos a añadir un curl al alpine y personalizaremos el sitio web que sirve el apache, así es como quedará el docker file:
FROM httpd:2.4-alpine RUN apk update && \ apk upgrade && \ apk add curl COPY ./www /usr/local/apache2/htdocs
con el comando RUN actualizamos el repositrio de paquetes y añadimos curl, con COPY copiaremos el contenido del directorio www en el directorio htdocs de la imagen Ahora solo tenemos que crear nuestra imagen con docker build y comprobar que la tenemos intalada con docker images
~/develop/docker-images/httpd$ docker build -t nocompila-httpd:1.0.0 .
Sending build context to Docker daemon   38.4kB
Step 1/3 : FROM httpd:2.4-alpine
 ---> 54b0995a6305
Step 2/3 : RUN apk update &&     apk upgrade &&     apk add curl
 ---> Using cache
 ---> 641365964ff4
Step 3/3 : COPY ./www /usr/local/apache2/htdocs
 ---> Using cache
 ---> b36d5ae4140f
Successfully built b36d5ae4140f
Successfully tagged nocompila-httpd:1.0.0

~/develop/docker-images/httpd$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nocmopila-httpd          1.0.0               b36d5ae4140f        2 minutes ago      110MB
apache-krb5              1.0.0               af61fbda4863        2 days ago          112MB
httpd                    2.4-alpine          54b0995a6305        3 days ago          107MB
debezium/connect         0.9                 28e60fa48820        9 months ago        678MB
debezium/example-mysql   0.9                 c7585fcd90bc        9 months ago        373MB
mysql                    5.7                 7faa3c53e6d6        10 months ago       373MB
hello-world              latest              fce289e99eb9        15 months ago       1.84kB

Antes de seguir como tenemos un contendor apache-test levantado y escuchando en el puerto 80 lo paramos y lo borramos con docker stop y docker rm
Ahora ya podemos lanzar nuestro nuevo container, levantamos una consola y comprobamos que los ficheros se copiaron y que tenemos curl en la caja linux:
~/develop/docker-images/httpd$ docker run -dit --name nocompila-test -p 8080:80 nocompila-httpd:1.0.0
eaf1d4c50ec557d0292250f36e0d0984b7acfa934d001ef1bea558be89302312
~/develop/docker-images/httpd$ docker exec -it nocompila-test /bin/ash
/usr/local/apache2 # ls htdocs/
index.html            worksonmymachine.png
/usr/local/apache2 # curl localhost
<html><body><h1>It works!</h1><img src="./worksonmymachine.png"></body></html>

Esto ha sido una muy pequeña introduccón, no hemos hablado de securización, despliegues, composicion, orquestación...

No hay comentarios:

Publicar un comentario