Contenedores con Dr. Pedro J. Molina Desarrollador Independiente @pmolinam
Agenda 1. 2. 3. 4. 5. 6. 7.
Introducción a Docker (teórica) Introducción a Docker (práctica): manos a ello Docker files Docker CLI Docker-Compose Casos de uso Y más allá…
¿A qué me dedico? Domain Specific Languages
Generación de código
Desarrollador Independiente
Colaboro con: http://www.formacion.lemoncode.net Anteriormente:
Microservicios
CTO
JavaScript, TypeScript, C#
App Builders
Backends
Project Manager
Despliegues en nube Arquitectura de Software Consultoría
DSLs
Arquitectura de Software DSLs DSLs
Generación de código
Evolución: Aplicaciones Aplicación clienteservido pesada sobre cliente pesado.
Stack estandarizado: - SO - Runtime - Middleware
Infraestructura Física Monolítica
1995
2015
Aplicación ligera en un móvil o tablet.
Ensamblada por desarrolladores usando los mejores servicios disponibles.
Corriendo en cualquier conjunto de recursos disponibles (públicos/privados/ o virtualizados)
La nube Llego para quedarse CPD caros para PYMEs Nube = Commodity
Guerra de precios A medio plazo concentración Solo quedarán los grandes
User DB Static website
postgresql + pgv8 + v8
nginx 1.5 + modsecurity + openssl + bootstrap 2
Background workers Python 3.0 + celery + pyredis + libcurl + ffmpeg + libopencv + nodejs + phantomjs
Queue
Analytics DB
Redis + redis-sentinel
hadoop + hive + thrift + OpenJDK
Web frontend Ruby + Rails + sass + Unicorn
API endpoint
Do services and apps interact appropriately?
Multiplicity of Stacks
El problema que solventa Docker
Development VM
Production Cluster
Public Cloud
QA server Disaster recovery Contributor’s laptop
Customer Data Center Production Servers
Can I migrate smoothly and quickly?
Multiplicity of hardware environments
Python 2.7 + Flask + pyredis + celery + psycopg + postgresql-client
El problema que solventa Docker Static website
?
?
?
?
?
?
?
Web frontend
?
?
?
?
?
?
?
Background workers
?
?
?
?
?
?
?
User DB
?
?
?
?
?
?
?
Analytics DB
?
?
?
?
?
?
?
Queue
?
?
?
?
?
?
?
Development VM
QA Server
Single Prod Server
Onsite Cluster
Public Cloud
Contributor’s laptop
Customer Servers
Multiplicity of Goods
Do I worry about how goods interact (e.g. coffee beans next to spices)
Can I transport quickly and smoothly (e.g. from boat to train to truck)
Multipilicity of methods for transporting/storing
Símil: Transporte en antes de los años 60
Problema N x M No escala ?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
Solución: El Container Do I worry about how goods interact (e.g. coffee beans next to spices)
Multiplicity of Goods A standard container that is loaded with virtually any goods, and stays sealed until it reaches final delivery.
Can I transport quickly and smoothly (e.g. from boat to train to truck)
Multiplicity of methods for transporting/storing
…in between, can be loaded and unloaded, stacked, transported efficiently over long distances, and transferred from one mode of transport to another
Docker Static website
User DB
Web frontend
Queue
Analytics DB Do services and apps interact appropriately?
Multiplicity of Stacks An engine that enables any payload to be encapsulated as a lightweight, portable, self-sufficient container…
…that can be manipulated using standard operations and run consistently on virtually any hardware platform
Multiplicity of hardware environments
Can I migrate smoothly and quickly Development VM
QA server
Customer Data Center
Public Cloud
Production Cluster
Contributor’s laptop
Docker elimina el problema estandarizando Static website
Web frontend
Background workers
User DB
Analytics DB
Queue
Development VM
QA Server
Single Prod Server
Onsite Cluster
Public Cloud
Contributor’s laptop
Customer Servers
Beneficios para desarrolladores Entornos limpios, seguros y portables. Despliegues reproducibles (sin perdida de dependencias) Aislamiento de aplicaciones Tests, integración, empaquetado automatizado Menores problemas de compatibilidad Despliegues rápidos y baratos
Una Maquina Virtual sin la penalización de una MV
Beneficios para devops Configura una vez, corre cientos Despliegues estandarizados y repetibles Elimina inconsistencias entre entornos (devel, qa, prod, etc.) Permite segregación de responsabilidades Mejora la velocidad de CI y CD Más ligeros que una MV
Separación de Responsabilidades (SoC) Alicia, la Desarrolladora Precupada por “que hay dentro” del container. Su código Sus librerias Su gestor de paquetes Sus Apps Sus datos Todos los Servidores Linux son iguales
• Carmen, la Devop • Preocupada por lo que hay fuera del contedor • • • •
Logging Acceso Remoto Monitorización Configuración de Red
• Todos los contenedores se arrancan, para, copian, mse migran del mismo modo.
Docker: Las tripas ¿Porqué? • Corre en cualquier sitio (Linux) • • • •
Sin importar version del kernel 2.6.32+ Sin importar distribución Físico, virtual, nube o no. Container & Arquitectura de Host deben emparejar
• Corre cualquier cosa: • Si corre en el host, corre en el container • Si corre en un kernel Linux, correrá
¿Qué es? • Alto Nivel – MV ligera • • • •
Espacio de proceso propio Configuración de red propia Puede correr como root Puede tener su propio /sbin/init
• Bajo Nivel – chroot con esteroides • • • •
Puede no tener su propio /sbin/init Contenedor = proceso aislado Comparte Kernel con el host No emula dispositivo
Contenedores vs Maquinas Virtuales App A
App A’
App B
Bins/ Libs
Bins/ Libs
Bins/ Libs
Guest OS
Guest OS Guest OS
VM
Los contenedores están aislados, pero comparten SO y opcionalmente binarios y librerías Da como resultado despliegues mas rápidos, con menos sobrecoste, más facilites de migrar y reiniciar.
Guest OS Guest OS
Host OS
Host OS
Server
Server
Docker
Bins/Libs
App B’
App B’
App B’
Bins/Libs
App B
App A’
Hypervisor (Type 2)
App A
Container
¿Porqué son contenedores Docker son ligeros? MVs
Bins/ Libs
Bins/ Libs
Bins/ Libs
Guest OS
Guest OS Guest OS
Bins/ Libs
App Original (Sin SO que tome espacio, recursos o requiera ser reiniciado)
MVs Cada pequeño cambio a una Aplicación Require un nueva máquina virtual.
App Δ
App A
App A
App A Bins/
App A’
App A
Guest OS
Contenedores
Copia de App No SO. Puede compatir bins/libs
App Modificada Copia con solo las diferencias entre el contenedor A y A’
Funcionamiento básico Docker Container Image Registry
Push
Container A
Search
Run
Build Dockerfile For A
Docker
Container C
Host 1 OS (Linux)
Container B
Docker Engine
Container A
Source Code Repository
Pull
Host 2 OS (Linux)
Cambios y actualizaciones Push
App Δ
App A
Bins/
Bins/ Libs
Docker Container Image Registry
Container Mod A’
Container Mod A’’
App Δ
Base Container Image
Bins/ Libs
Bins/ Libs
Docker Engine Host is now running A’’
Bins/
App A
Bins/
App A’’
Docker Engine
Update
La tecnología bajo Docker Linux Kernel
Servicios de aislamiento de recursos cgroups Kernel namespaces Union file-systems aufs Libvirt, LXC
Git
Control de versiones: delta a las imágenes de contenedores V1
Registro (Docker Hub)
V2
V3
…
Glosario Docker:
Veamos algo de jerga.
Glosario Docker: Dockerfile # A basic apache server.
FROM ubuntu:14.04 MAINTAINER Kimbro Staken version: 0.1 RUN apt-get update && apt-get install –y apache2 ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
Glosario Docker: Container Contenedor La aplicación paquetizada, aislada
Glosario Docker: Host (anfitrión) Es el porta-contenedores Múltiples sabores: local, private cloud, public cloud. Virtual o físico. Expone los recursos
Glosario Docker: Imagen Fichero binario que contiene todo el sistema de ficheros de un contenedor. Sistema de ficheros Union. Estructurado en capas (layers) por delta.
https://imagelayers.io
Glosario Docker: Volumen Discos o directorios externos que podemos montar en el contenedor.
Recursos externos (alojados en el host) que sobreviven al contenedor Configuración / Datos / Recursos
Datos
Conf.
Glosario Docker: Registro Biblioteca de imágenes de contenedor Listas para ser usadas
Registro publico
Compartidas por la comunidad Libre acceso
Registro privado
Contenedores corporativos o privados
https://hub.docker.com
Ciclo de vida de un contenedor create
rm
Stopped
run / start
restart
stop/kill
Running
pause
unpause
Paused
Deleted
Ciclo de vida de una imagen *.tar.gz
STDIN/ STDOUT
Registry
load/save import/export pull/push build
image
commit
rmi
deleted
Command Line Interface
Dockerfile. Referencia de comandos FROM MAINTAINER LABEL ADD COPY ENV EXPOSE
USER WORKDIR VOLUME STOPSIGNAL ENTRYPOINT CMD RUN
Reference: https://docs.docker.com/engine/reference/builder
docker. CLI. Referencia de comandos help build run list ps kill lm
log exec cp images rmi pull / push pause / unpause
Reference: https://docs.docker.com/engine/reference/commandline/cli
docker. CLI. Referencia de comandos Networks
docker network create docker network rm
Reference: https://docs.docker.com/engine/reference/commandline/cli
Docker como fuente de software enjaulado Lenguajes
golang rails node php java erlang lisp microsoft/aspnet
DBs
mongo maria mysql postgres memcached redis
Docker como fuente de software enjaulado CI
Otros jenkins sjoerdmulder/teamcity meteogroup/concourse-ci
Project Management redmine jira
consul redis prometheus nginx haproxy
Docker como fuente de software enjaulado Navajas suizas
busybox
(1-5 Mb)
alpine
(5 Mb)
Manos a la obra git clone https://github.com/pjmolina/docker-training
Un primer container con Docker
docker-compose.yml. Ref. de comandos version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
web redis
db
Reference: https://docs.docker.com/compose/compose-file
docker-compose. CLI. Ref. de comandos help
etc…
build up scale down kill log Reference: https://docs.docker.com/compose/reference
Manos a la obra Docker-Compose
Casos de Usos CI & CD Maquinas de desarrollo Pruebas Simular Entornos complejos Sistemas en Producción (¡¡¡casi!!!)
Raspberry PI 3 ¡¡Corre docker!! ARM versión RAM limitada Útil para proyectos embebidos
+info: http://blog.hypriot.com
Y mas allá… Unikernels
Kernel de SO compilado de modo estático con tu aplicación. Modular, pequeño, solo lo que se necesita. Corriendo sobre un hiper-visor.
Y mas allá… Amazon EC2 Container Service
Y mas allá…
Joyent TRITON
Y mas allá…
Kubernetes
Plataforma de orquestación de contenedores de Google http://kubernetes.io
Apache Mesos
http://mesos.apache.org
Y mas allá… HashiCorp Terraform Infrastructure as Code
https://www.hashicorp.com/terraform.html
Referencias
Docker
https://www.docker.com
Ejemplos
https://github.com/pjmolina/docker-training
Contacto ¿Te gusto lo que viste o todo lo contrario? En cualquier caso, ¡retroaliméntame! Pedro J. Molina
[email protected] @pmolinam