Workshop de introducción a docker, desde lo más básico hasta un dockerfile de producción no muy sofisticado.
Incluye link a un repositorio para seguir un ejercicio a lo largo de la presentación
2. Antes de empezar
Instalar Docker:
● MacOS/Windows
○ Bajar docker toolbox: https://www.docker.com/products/docker-
toolbox
○ Mac: https://docs.docker.com/v1.8/installation/mac/
○ Windows: https://docs.docker.com/v1.8/installation/windows/
● Linux
○ Instalar del sistema de paquetes
○ O ver acá segun distro: https://docs.docker.com/v1.
8/installation/debian/
Clonar este repo: https://github.com/restorando/docker-workshop
3. Configurar nuestro registry local
● Por si no anda muy bien internet, pueden bajar las imágenes desde
la LAN
● Inseguro porque no tenemos DNSs ni sabiamos a priori nuestra IP
acá
● Con docker nativo en OSX:
○ pinata set daemon '{"insecure-registries":
["IP:5000"]}'
● Con docker-machine o Linux:
○ DOCKER_OPTS=”--insecure-registry IP:5000”
○ (ver https://docs.docker.com/registry/insecure/)
● IMPORTANTE probar: docker pull IP:5000/debian:jessie
7. Consecuencias de esta forma
● Servers mutables
○ Posibles diferencias entre ambientes y/o diferentes nodos
● Puede haber conflictos entre aplicaciones si usan el mismo
servidor
○ En general lleva a un server por app y desperdicio de recursos
● El escalado suele ser “manual” o complicado de automatizar por
completo
● Desarrolladores dependenden del sector de operaciones
9. Desventajas
● Más cosas para manejar
○ Complicado hacerlo manualmente o
con las herramientas tradicionales
● Otro layer de abstracción no
trivial
● Dificulta el deployment de
aplicaciones que mantienen
estado
Deployment con containers
Ventajas
● Devs más libertades e
involucrados en la definición de
infraestructura
● Menos dependencia con equipo
de “Operaciones”
● Permite monitoreo de recursos
más preciso
● Fácilmente adaptable a buenas
prácticas como 12 factor app
10. Docker containers
● Aisla con namespaces
○ PID, network, mount, IPC, users, etc.
● Limita los recursos con cgroups
● Se estandarizó el runtime
○ runC con la iniciativa OCI
○ CoreOS está haciendo rocket
○ Hyper es otro (runV) con VMs y un “mini kernel”
● Docker es más que un runtime
○ Formato de la imagen, crearlo, distribuirlo y correrlo
○ Es un daemon y un cliente
11. Corriendo nuestro primer container
● docker run -P IP:5000/nginx:1.10.0
● docker run -P IP:5000/nginx:1.9.3
● docker ps
15. Definiendo imágenes
● Se especifica paso a paso en un Dockerfile
● Cada imágen se compone de uno más “layers”
○ Cada paso genera un “layer”
● Es inmutable una vez que se construyó
● Se usa repositorio y tag para identificarla
○ Por ejemplo: myapp:v1.0
● Toma un contexto (“.”, URL) para crear el container
○ Por ejemplo: docker build .
16. El Dockerfile
FROM IP:5000/debian:jessie
RUN apt-get update &&
apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
→ Define la imágen base de la que
empezamos
→ Corre un comando en el container
(en el repo está completo)
→ Copia algo del contexto al container
→ Dice que este container expone ese puerto
→ Qué correr al levantar el container
17. Armando nuestra primer imagen
$ docker build -t workshop .
$ docker run -P workshop
$ docker ps
23. ● Doc completa del formato del Dockerfile:
○ https://docs.docker.com/engine/reference/builder/
● Más doc del CLI:
○ https://docs.docker.com/engine/reference/commandline/
● Training de docker:
○ https://training.docker.com/introduction-to-docker
● Why containers?
○ http://kubernetes.io/docs/whatisk8s/
○ Google “Lessons learned from three container-management systems
over a decade”: http://queue.acm.org/detail.cfm?id=2898444
Referencias y artículos interesantes
Container: basado en la imagen, layer nuevo para escribir, se pierde al matarlo y corre hasta que el proceso que iniciamos (CMD) muere! Ojo!
Imagen: read-only template used to create containers
Registry: publico/privado, aws y gcloud dan uno, se usa docker hub por default