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
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