Dockerize and Ship it

Introducción a Docker

¿Que es Docker?

Docker es una plataforma abierta para desarrollar, entregar y correr aplicaciones.

 

Docker permite empaquetar una aplicación con todas sus dependencias dentro de una unidad estandarizada para el desarrollo de aplicaciones.

Docker vs Virtual Machines

Docker vs Virtual Machines

Las aplicaciones dentro de containers corren en un ambiente aislado directamente sobre el host server y no requieren emulación de hardware.

 

En cambio las VM son sistemas operativos completos que corren en hardware virtualizado a través de un Hypervisor, quien se encarga de la comunicación entre el guest y el host os.

 

Docker vs Virtual Machines

Beneficios de aplicaciones en containers

  • Menor tiempo de inicio.
  • Mejor distribución de los recursos.
  • Acceso directo al hardware.
  • Menor redundancia.

Un poco de historia

Docker fue creado por Salomon Hykes como un proyecto interno en dotCloud presentado en la pyCon en 2013.

 

El runtime de Docker esta escrito en Go, para la fecha los grandes contribuidores del proyecto han sido Google, Microsoft, IBM, Huawei, Red Hat y el Docker Team.

 

 

Beneficios de Docker

  • Rapidez (deployment, migración, reinicio).
  • Ligereza (Disk & CPU)
  • Open Source.
  • Aplicaciones portables.
  • Microservicios e integraciones (APIs)
  • Simplifica DevOps
  • Control de versiones

Usos comunes de Docker

  • Ambientes Sandbox (develop, test, debug).
  • Integración continua y deployment.
  • Escalamiento de aplicaciones.
  • Desarrollo colaborativo.
  • Configuración de infraestructura.
  • Desarrollo local.
  • Aplicaciones multi-tier.
  • PaaS y SaaS.

Arquitectura de Docker

Componentes

  • Cliente
  • Deamon
  • Engine
  • Machine
  • Compose
  • Swarm
  • Registry

Componentes

Docker Client

 

Interface de usuario que interactúa con docker. Acepta comandos desde el usuario y tiene comunicación bidirecional con el Docker deamon.

Componentes

Docker Deamon

 

Deamon que corre en la maquina host. El usuario no interactua directo con el, sino a través del cliente vía Api Rest o Sockets.

Componentes

Docker Engine

 

Dupla Cliente-Deamon  al igual que Docker Compose. Usualmente conocido como "Docker".

Componentes

Herramienta que permite crear con facilidad docker hosts en tu computador o en cloud providers (Amazon, DO, Google) y dentro de un data center propio.

Docker Machine

Componentes

Herramienta para definir y correr aplicaciones más complejas con docker (ej. Multi-cointainer apps) con un solo archivo.

Docker Compose

Componentes

Herramienta para el clustering de Docker. Swarm agrupa varios docker host y los expone como un virtual docker host. Permite escalamiento de multiples host. 

Docker Swarm

Workflow

Text

  • Descarga la imagen ubuntu:15.04 de docker registry
  • Crea un nuevo container.
  • Aloja un filesystem y monta un capa de escritura y lectura.
  • Asigna una dirección IP
  • Ejecuta un proceso especificado ( bin/bash).
  • Captura y provee una salida a ala aplicación 
docker run -i -t -d ubuntu:15.04 /bin/bash

Docker Image

Text

Docker Container

Dockerfile

Archivo de texto que contiene los comandos usados por el usuario para crear una imagen

FROM busybox
MAINTAINER Gustavo Gimenez <gimenezanderson@gmail.com>
RUN mkdir /app
ADD build/geo /app
RUN mkdir /app/data
RUN chmod -R 777 /app
EXPOSE 4000

CMD ["./app/geo"]

Docker commands

Comandos de Docker más usados.

// Información general
man docker // man docker-run
docker help // docker help run
docker info
docker version
docker network ls

// Imagenes
docker images // docker [IMAGE_NAME]
docker pull [IMAGE] // docker push [IMAGE]

// Contenedores
docker run
docker ps // docker ps -a, docker ps -l
docker stop/start/restart [CONTAINER]
docker stats [CONTAINER]
docker top [CONTAINER]
docker port [CONTAINER]
docker inspect [CONTAINER]
docker inspect -f "{{ .State.StartedAt }}" [CONTAINER]
docker rm [CONTAINER]

Ejemplos

SSH dentro de un contenedor

docker pull ubuntu
docker run -it --name ubuntu_example ubuntu /bin/bash

Ejemplos

Crear una imagen

FROM busybox
MAINTAINER Gustavo Gimenez <gimenezanderson@gmail.com>
RUN mkdir /app
ADD build/server /app
RUN mkdir images
ADD images /images
RUN chmod -R 777 /app
EXPOSE 9000

ENTRYPOINT "/app/server"

Dockerfile

// Build image
docker build -t image-server .

// Run it
docker run -d -p 9000:9000 --name server-ex image-server

Comandos

Ejemplos

Docker Volume

// Run it
docker run -d -p 8080:90 --name volume-server-example -v $(pwd):/usr/share/nginx/html nginx

Usemos un Nginx Server

Ejemplos

Docker Compose

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose.yml

Ejemplos

Docker Compose

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app

Dockerfile

 

docker-compose up

Start up

Ejemplos

Test Docker Image

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app

Dockerfile

 

docker run -it --name sinatra-test sinatra-app rspec spec/app_spec.rb

Run image

Ejemplos

Test Docker Image

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app

Dockerfile

 

docker run -it --name sinatra-test sinatra-app rspec spec/app_spec.rb

Run image

Ejemplos

Test Docker Image

FROM gusga/sinatra-app:0.1
CMD [ "sh", "-c", "rspec"]

Build image

docker run -it --name sinatra-test sinatra-app rspec spec/app_spec.rb

Run it

docker build -f Dockerfile.test -t sinatra-test-image .

Dockerfile.test

Ejemplos

Share Image

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app

Build image

docker push gust/sinatra-app

Publish

docker build . -t gusga/sinatra-app

Dockerfile file

Alternativas a Docker

Rkt

Linux Containers LCX 

LXD container hypervisor

Docker Services

Tipo Software
Clustering/orchestration Swarm, Kubernetes, Marathon, MaestroNG, decking, shipyard
Docker registries Portus, Docker Distribution, hub.docker.com, quay.io, Google container registry, Artifactory, projectatomic.io
PaaS with Docker Rancher, Tsuru, dokku, flynn, Octohost, DEIS
OS made of Containers RancherOS

Mas allá de Docker

Cloud Native Apps

Cloud Native Apps

Stack

Cloud Native Apps

Stack

Dockerize

By Gustavo Giménez

Dockerize

  • 388