nerdear.la 2016 - Docker workshop

24
Introduction to Docker http://bit.do/nerdearla-docker

Transcript of nerdear.la 2016 - Docker workshop

Introduction to Dockerhttp://bit.do/nerdearla-docker

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

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

¿Quiénes somos?

Rodrigo Campos

rata

Juan Barreneche

jbarreneche

@jbarreneche

Agenda

Deployment tradicional

Deployment con containers

Docker containers

Corriendo nuestro primer container

Docker registries

Definiendo containers

Configure Provisioning

Deployment tradicional

Deploy AppLaunch server

New Application

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

¿Cómo podríamos solucionar estos problemas?

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

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

Corriendo nuestro primer container

● docker run -P IP:5000/nginx:1.10.0

● docker run -P IP:5000/nginx:1.9.3

● docker ps

Docker basic concepts

Container

Image

Registry

$ docker run <image>

$ docker images

$ docker pull <image>

$ docker build <directory>

$ docker ps

$ docker logs

Basic docker commands

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 .

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

Armando nuestra primer imagen

$ docker build -t workshop .

$ docker run -P workshop

$ docker ps

docker build -t workshop .

docker run -P workshop

FROM registry.restorando.com/ruby-2.1-web:v1.3

WORKDIR /app/

COPY Gemfile Gemfile.lock /app/

RUN bundle install -j 4 --retry 5 --without development test --deployment

COPY . /app/

RUN bin/rake assets:precompile

EXPOSE 3000

CMD ["bin/unicorn", "-p", "3000", "-c", "config/unicorn.rb"]

Un Dockerfile productivo

Build en CI

¿Preguntas?

● 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

Gracias!

PD: Borren el insecure registry de su docker!