Ruby on Docker

docker

by Daniel Romero / @infoslack

Daniel Romero

daniel romero

infoslack.com/about

initsec

www.enjoei.com.br / jobs@enjoei.com.br

Livro começando com Linux
livro docker

The matrix from hell

Matrix from hell

A batalha começa...

  • stackoverflow
  • server fault
  • receitas prontas em shell script
  • você pede ajuda aos amigos

e quando você finalmente acha que está funcionando...

Virtualização de Hardware

  • 1966-1972 - IBM CP/CMS
  • 1989 - Insignia SoftPC
  • 1997 - Connectix VirtualPC
  • 1999 - VMWare Workstation
  • 2002 - Xen
  • 2001 - IBM AIX LPAR
  • 2006 - Amazon EC2
  • 2007 - Sun Logical Domains
  • 2007 - Linux KVM
  • 2007 - InnoTek VirtualBox
  • 2008 - MS Hyper-V

Virtualização de Processos

  • 1979-1982 - UNIX chroot
  • 1998 - FreeBSD jail
  • 2001 - Parallels Virtuozzo
  • 2001 - Linux-VServer
  • 2005 - Solaris Containers
  • 2005 - OpenVZ
  • 2008 - Linux LXC
  • 2007-2008 - (Heroku)
  • 2013 - Docker

O que é Docker ?

  • Projeto PaaS da dotCloud
  • Open source escrito em Go
  • Facilita a criação de containers LXC
  • Iniciado em 18/01/2013
  • Versão 0.1 em 25/03/2013

Virtualização

vm vs container

vm vs container

Containers

vm vs container

Voltando ao problema

E se...

docker container
solve matrix

Arquitetura

  • Libcontainer ou LXC - container format
  • Namespaces - isolamento
  • Cgroups - sharing
  • Unionfs - layering
Arquitetura

Onde funciona ?

  • Linux - (Nativo)
  • OS X - (Boot2Docker/kitematic)
  • Windows - (Boot2Docker)
no windows

Como funciona ?

Imagens

  • Template read only
  • Faz uso de UFS
  • Contém arquivos da sua app
  • Criadas por Commit ou Dockerfile

Containers

  • Depende de uma imagem
  • Geram novas imagens
  • Conectividade com o host e outros containers
  • Execução controlada - CPU,RAM,I/O,etc
  • Descartáveis ou persistentes
camada fase 1
camada fase 2
camada fase 3
camada fase 4

Inicializando containers

              
# Opção run com interatividade:
$ docker run -i -t image_name [command]

# Executando em background:
$ docker run -d image_name

# Eliminando após o uso:
$ docker run --rm -it image_name [command]
              
              

Criando imagens por commit

              
# Iniciar container interativo:
$ docker run -it ubuntu bash

# Realizar alterações:
$ sudo apt-get update && apt-get install -y ruby

# Encerrar e commitar;
$ docker commit [image_id]
              
              

Trabalhando com Dockerfile

              
FROM ubuntu

RUN apt-get update && apt-get install -y nginx

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]
              
              

Gerando a imagem

              
# Opção build seguido de user/serviço e dockerfile
$ docker build -t infoslack/nginx [path_dockerfile]
              
              
docker-hub

Docker Hub

              
# Login em https://registry.hub.docker/com
$ docker login

# Baixando imagens:
$ docker pull image_name

# Buscando imagens:
$ docker search name

# Enviando imagens:
$ docker push infoslack/nginx
              
              

Containers

Images

Executando serviços

Comunicação entre containers

E os arquivos da minha app ?

docker volumes

Docker volumes

Bootstrap

              
FROM rails:onbuild


$ docker run -it --rm --user "$(id -u):$(id -g)" \
-v "$PWD":/usr/src/app \
-w /usr/src/app rails \
rails new webapp


$ docker run --name my-rails-app \
-p 8080:3000 \
-d my-rails-app
              
              

Um pouco de automação

              
db:
  image: postgres:9.3
  volumes:
    - "~/.volumes/app/db/:/var/lib/postgresql/data/"
  expose:
    - 5432

app:
  build: .
  command: bundle exec rails s
  volumes:
    - .:/usr/src/app
  ports:
    - 80:3000
  links:
    - db
              
              

Docker Compose

pergutas

Obrigado! =)

Links