Date post: | 15-Apr-2017 |
Category: |
Internet |
Upload: | julio-palma-vazquez |
View: | 218 times |
Download: | 0 times |
Introducción aDocker
23-Feb 2017
• Arquitecto en Coritel Málaga• Más de 16 años diseñando y desarrollando
aplicaciones Java.• Ponente en eventos locales (UMA Hackers
Week 2016) e internacionales (Java One 2015 & 2016).• Aficionado a al ciencia ficción y el ciclismo
de montaña.• Podéis encontrarme en twitter (@restalion)
o github (http://github.com/restalion)
Sobre la sesión• Instalación• Conceptos generales• docker-machine• Docker Hub• docker• Creación de aplicación SpringBoot de ejemplo• Dockerfile• Generación de imágenes con Maven• Push y Pull a Docker Hub• Envío de parámetros• Docker Compose
Instalación de Docker• Docker dispone de instalaciones paraMac,
Windows, Windows Server y Linux• https://www.docker.com/products/overview
• También tiene soporte para plataformas en la cloud como AWS o Azure.
Do It Yourself
Servidores• Podemos representar todos los
recursos de un servidor como un gran cubo vacío.
OS
Servidores• Podemos representar todos los
recursos de un servidor como un gran cubo vacío.• El cubo empezamos a rellenarlo
con el sistema operativo que ocupa una parte del espacio disponible.
OS
Servidores
Librerías
• Podemos representar todos los recursos de un servidor como un gran cubo vacío.• El cubo empezamos a rellenarlo
con el sistema operativo que ocupa una parte del espacio disponible.• Librerías necesarias para la
ejecución de nuestro programa.
OS
Servidores
Librerías
Aplicación 1
• Podemos representar todos los recursos de un servidor como un gran cubo vacío.• El cubo empezamos a rellenarlo
con el sistema operativo que ocupa una parte del espacio disponible.• Librerías necesarias para la
ejecución de nuestro programa.• Y finalmente nuestra aplicación.
OS
Servidores
Librerías
Aplicación 1
• Podemos representar todos los recursos de un servidor como un gran cubo vacío.• El cubo empezamos a rellenarlo
con el sistema operativo que ocupa una parte del espacio disponible.• Librerías necesarias para la
ejecución de nuestro programa.• Y finalmente nuestra aplicación.
¿Cómo escalamossiguiendo este esquema?
HOST OS
Máquinas virtuales
Librerías
Aplicación 1
Hypervisor
GUEST OS
Librerías
Aplicación 2
GUEST OS
Librerías
Aplicación 3
GUEST OS
• Podemos mejorar el uso de los recursos de la máquina mediante la virtualización.• Por cada máquina virtual tenemos
que instalar un sistema operativo que también consume recursos.
Librerías
Aplicación 4
Librerías
Aplicación 1 Aplicación 2 Aplicación 3
Librerías
Aplicación 7
Librerías
Docker Engine
HOST OS
Contenedores
Librerías
Aplicación 5
Librerías• El uso de contenedores propone la
reutilización del sistema operativo pero manteniendo el aislamiento de cada aplicación.• Así mejoramos el uso de los
recursos aumentando la densidad de aplicaciones.
Docker-machine• Nos permite instalar docker en máquinas virtuales y gestionar los
hosts con una serie de comandos.• Los comandos más comunes para empezar son:• create: Permite crear una máquina docker. Puede ser virtual u hospedada en
la cloud.• ls: lista las máquinas virtuales disponibles.• kill: fuerza la parada de una máquina virtual.• env: informa las variables de sistema para trabajar con una máquina.• start/stop: inicia o detiene una máquina.• ssh: abre una consola contra la máquina.• …
Docker-machine• Para nuestro ejemplo sobre una máquina Windows crearemos una
máquina local usando el driver de virtualbox:• docker-machine create --driver virtualbox malagaJUG
C:\Users\restalion>docker-machine create --driver virtualbox malagaJUGRunning pre-create checks...(malagaJUG) Image cache directory does not exist, creating it at C:\Users\julio.palma.vazquez\.docker\machine\cache...(malagaJUG) No default Boot2Docker ISO found locally, downloading the latest release...(malagaJUG) Latest release for github.com/boot2docker/boot2docker is v1.13.1(malagaJUG) Downloading C:\Users\restalion\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.13.1/boot2docker.iso...(malagaJUG) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%Creating machine...(malagaJUG) Copying C:\Users\restalion\.docker\machine\cache\boot2docker.iso to C:\Users\restalion\.docker\machine\machines\malagaJUG\boot2docker.iso...(malagaJUG) Creating VirtualBox VM...(malagaJUG) Creating SSH key...(malagaJUG) Starting the VM...(malagaJUG) Check network to re-create if needed...(malagaJUG) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.(malagaJUG) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #3"(malagaJUG) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.(malagaJUG) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.(malagaJUG) Waiting for an IP...Waiting for machine to be running, this may take a few minutes...Detecting operating system of created instance...Waiting for SSH to be available...Detecting the provisioner...Provisioning with boot2docker...Copying certs to the local machine directory...Copying certs to the remote machine...Setting Docker configuration on the remote daemon...Checking connection to Docker...
Docker is up and running!To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env malagaJUG
Do It Yourself
Docker-machine• Ejecutamos el comando propuesto:• docker-machine env malagaJUG
C:\Users\restalion>docker-machine env malagaJUGSET DOCKER_TLS_VERIFY=1SET DOCKER_HOST=tcp://192.168.99.100:2376SET DOCKER_CERT_PATH=C:\Users\restalion\.docker\machine\machines\malagaJUGSET DOCKER_MACHINE_NAME=malagaJUGSET COMPOSE_CONVERT_WINDOWS_PATHS=trueREM Run this command to configure your shell:REM @FOR /f "tokens=*" %i IN ('docker-machine env malagaJUG') DO @%i
C:\Users\restalion>@FOR /f "tokens=*" %i IN ('docker-machine env malagaJUG') DO @%i
Do It Yourself
DockerHub• Se trata de un repositorio de imágenes
• https://hub.docker.com/
• Podemos encontrar imágenes oficiales de muchos productos• Es necesario registro pero el servicio es gratuito• Existe la posibilidad de tener repositorios privados (con coste)• Un ejemplo de uso sería descargarnos y ejecutar la imagen de MongoDB:
• docker run -p 27017:27017 mongo
• El comando se descargará la imagen de mongo y dejará operativa una instancia de la misma en el puerto que se le indique.• El parámetro -p nos permite mapear los puertos al valor que deseemos.
Docker• Comando para interactuar con imágenes y contenedores:• docker images: muestra las imágenes disponibles• docker ps: muestra los contenedores• docker rm/rmi: elimina los contenedore/imágenes• docker run: ejecuta un comando en un nuevo contenedor• docker start/stop: inicia o detiene un contenedor existente• docker build: construye una imagen a partir de un fichero Dockerfile• docker push/pull: envía/recupera una imagen desde un registro
Spring boot application• La aplicación spring boot más sencilla posible que utilice una BBDD
mongoDB:• Vamos a http://start.spring.io/• En dependencies seleccionamos: MongoDB, Rest Repositories, Lombok
Do It Yourself
Spring boot application• La aplicación spring boot más sencilla posible que utilice una BBDD
mongoDB:• Vamos a http://start.spring.io/• En dependencies seleccionamos: MongoDB, Rest Repositories, Lombok• Importamos el proyecto descargado en nuestro IDE favorito (Eclipse en mi
caso)• Creamos una entidad sencilla.
Do It Yourself
Spring boot application• La aplicación spring boot más sencilla posible que utilice una BBDD
mongoDB:• Vamos a http://start.spring.io/• En dependencies seleccionamos: MongoDB, Rest Repositories, Lombok• Importamos el proyecto descargado en nuestro IDE favorito (Eclipse en mi
caso)• Creamos una entidad sencilla.• Creamos el dao para ésa entidad.
Do It Yourself
Spring boot application• La aplicación spring boot más sencilla posible que utilice una BBDD
mongoDB:• Vamos a http://start.spring.io/• En dependencies seleccionamos: MongoDB, Rest Repositories, Lombok• Importamos el proyecto descargado en nuestro IDE favorito (Eclipse en mi
caso)• Creamos una entidad sencilla.• Creamos el dao para ésa entidad.• Configuramos la aplicación para usar la BBDD de docker.
Do It Yourself
Spring boot application• La aplicación spring boot más sencilla posible que utilice una BBDD
mongoDB:• Vamos a http://start.spring.io/• En dependencies seleccionamos: MongoDB, Rest Repositories, Lombok• Importamos el proyecto descargado en nuestro IDE favorito (Eclipse en mi caso)• Creamos una entidad sencilla.• Creamos el dao para ésa entidad.• Configuramos la aplicación para usar la BBDD de docker.
• … o clonamos el código desde github:• https://github.com/restalion/docker-demo
Do It Yourself
Dockerfile• Fichero que nos permite describir un contenedor Docker para nuestra aplicación• El formato del fichero es el siguiente:
# ComentarioINSTRUCCIÓN argumentos
• Contiene una serie de instrucciones:• FROM <imagen>• RUN <comando>• CMD comando parametro1 parametro2• EXPOSE <port>• ADD <origen> <destino>• VOLUME <directorio>• ENV <opciones>
Dockerfile# imagen origenFROM azul/zulu-openjdk:8u121
# volumen necesario para el contenedor tomcatVOLUME /tmp
# modificamos el nombre de la aplicaciónADD docker-demo-0.1.0-SNAPSHOT.jar app.jar
# actualizamos el timestampRUN sh -c 'touch /app.jar'
# creamos las opciones de entorno de javaENV JAVA_OPTS=""
# marcamos como punto de entrada la ejecución de nuestra aplicaciónENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
# Exponemos el puerto 8080EXPOSE 8080
Do It Yourself
Genera tus imágenes como Spotify• Una vez creado el fichero Docker lo situamos dentro del proyecto en
la ruta /src/main/docker/Dockerfile• Podemos ejecutar la generación de la imagen con: • mvn package docker:build
• Una vez ejecutado tendremos la imagen instalada en nuestra máquina local.• Podemos ejecutarlo y realizar directamente el push:• mvn package docker:build -DpushImage
Do It Yourself
Espíritu colaborador:Añade tus imágenes a docker hub• Es necesario estar logado para poder interactuar con el docker hub• docker login
• Añadir una imagen generada es tan sencillo como hacer un push:• docker push <nombre imagen>:<versión>
• Descargarla es tan sencillo como hacer un pull:• docker pull <nombre imagen>:<versión>
• Podéis probar a descargar la imagen que hemos creado para esta demo:• docker pull restalion/docker-demo:latest
Do It Yourself
Espíritu colaborador:Añade tus imágenes a docker hubLa imagen de la aplicación usada para la presentación de hoy podéis descargarla desde el docker hub:https://hub.docker.com/r/restalion/docker-demo/
Do It Yourself
Enviando parámetros a la imagen• En el momento de crear las propiedades de la aplicación hemos
tenido la precaución de permitir que se envíen propiedades:spring.data.mongodb.port=${MONGO_PORT:27017}server.port=${PORT:8080}spring.data.mongodb.host=${MONGO_IP:192.168.99.100}spring.data.mongodb.database=test
• Podemos ejecutar las imágenes informando los parámetros:docker run -e "PORT=8082" -p 8082:8082 restalion/docker-demo:latest
Do It Yourself
Docker Compose• Normalmente nuestras “soluciones” están
compuestas por varias aplicaciones.• Podemos levantar los contenedores “a
mano” como hemos hecho hasta ahora…• … o podemos usar Docker Compose
docker-demo
mongo
Docker Composemongodb: image: mongo:latest ports: - "27017:27017" command: mongod --smallfiles
app: image: restalion/docker-demo:latest links: - mongodb ports: - "8080:8080"
docker-demo
mongo
Do It Yourself
Docker Compose• Una vez generado el fichero docker-
compose.yml para ejecutarlo:• docker-compose up
• Información sobre docker compose:• https://docs.docker.com/compose/compose-
file/
docker-demo
mongo
Do It Yourself
Preguntas
Referencias• docker-machine: https://docs.docker.com/machine/• docker: https://docs.docker.com/engine/reference/commandline/docker/• Dockerfile: https://docs.docker.com/engine/reference/builder/• Compose file: https://docs.docker.com/compose/compose-file/