Introduction to Docker
http://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 App
Launch
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!

nerdear.la 2016 - Docker workshop

  • 1.
  • 2.
    Antes de empezar InstalarDocker: ● 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 registrylocal ● 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
  • 4.
    ¿Quiénes somos? Rodrigo Campos rata JuanBarreneche jbarreneche @jbarreneche
  • 5.
    Agenda Deployment tradicional Deployment concontainers Docker containers Corriendo nuestro primer container Docker registries Definiendo containers
  • 6.
  • 7.
    Consecuencias de estaforma ● 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
  • 8.
  • 9.
    Desventajas ● Más cosaspara 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 ● Aislacon 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 primercontainer ● docker run -P IP:5000/nginx:1.10.0 ● docker run -P IP:5000/nginx:1.9.3 ● docker ps
  • 13.
  • 14.
    $ docker run<image> $ docker images $ docker pull <image> $ docker build <directory> $ docker ps $ docker logs Basic docker commands
  • 15.
    Definiendo imágenes ● Seespecifica 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 RUNapt-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 primerimagen $ docker build -t workshop . $ docker run -P workshop $ docker ps
  • 18.
    docker build -tworkshop .
  • 19.
    docker run -Pworkshop
  • 20.
    FROM registry.restorando.com/ruby-2.1-web:v1.3 WORKDIR /app/ COPYGemfile 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
  • 21.
  • 22.
  • 23.
    ● Doc completadel 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
  • 24.
    Gracias! PD: Borren elinsecure registry de su docker!

Notas del editor

  • #2 Introducirnos (mencionar restorando)
  • #8 (multiples apps) ->
  • #14 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