Docker 201

Miguel Angel Gordián

@ilcapitanozoek

Docker Machine

Monitoreo de contenedores

Service Discovery

Provisioning con docker y ansible

Docker API

Provisioning de contenedores con Ansible

Debemos usar sistema convergentes para el  provisionado de contenedores, y usar las instrucciones que provee docker para la administración de recursos.

Empleando un contenedor con ssh

docker pull varrocen/docker-ssh
docker run -d -p 2222:22 --name sshd varrocen/docker-ssh

ansible-playbook -k -u root -i hosts prepare.yml

Se necesitan tres pasos para tener un entorno listo para ser provisionado por herramientas como Ansible.

  • Obtener una imagen con ssh.
  • Crear el contenedor y exponer el puerto.
  • Instalar python para que Ansible pueda  ser independiente en  futuras ejecuciones.

Playbooks

- hosts: docker
  roles:
    - { role: geerlingguy.ruby }
  tasks:
    - file: path=/app state=directory mode=0755
    - copy: src=./files/config.ru dest=/app/config.ru
    - copy: src=./files/app.rb dest=/app/app.rb
    - gem: name=cuba state=latest

- hosts: docker
  gather_facts: no
  tasks:
    - raw: apt-get -qq update

    - raw: >
      apt-get -qq --yes install 
      python python-apt  
      python-pycurl sshpass

prepare.yml

cook.yml

Provisionado

$ ansible-galaxy install -p roles geerlingguy.ruby
$ ansible-playbook -k -u root -i hosts cook.yml

$ docker stop sshd
$ docker commit sshd cubaapp
$ docker run --rm -it --name cuba -w /app \
  --expose=9292 \
  --entrypoint=/root/.gem/ruby/2.1.0/bin/rackup \
  cubaapp -o 0.0.0.0

Ya solo necesitamos obtener los playbook, correr el playbook y dejar a Ansible hacer su labor.

Packer es una herramienta para crear máquinas y contenedores para múltiples plataformas usando la misma fuente de configuración.

{
  "builders": [{
	  "type": "docker",
	  "image": "docker/alpine",
	  "commit": true
  }],
  "provisioners": [{
      "type": "ansible-local",
      "playbook_file": "php-session.yml"
  }],
  "post-processors": [{
      "type": "docker-tag",
      "repository": "zoek1/phpsession",
      "tag": "0.1"
  }]
}

Monitoreo 

Existen pocos monitores para contenedores, uno de ellos es cadvisor.

sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

Dockerfile

Phrometheus 

Sistema para monitoreo creado en SoundCloud.

docker run \
 -p 9090:9090 \
 -v /prometheus.yml:/prometheus.yml \
 prom/prometheus \
 -config.file=/prometheus.yml

Promdash 

Constructor de tableros para prometheus.  Es una aplicación Rails y mantiene los metadatos de los tableros en un backend SQL configurable.

docker run -v /tmp/prom:/tmp/prom \
  -e DATABASE_URL=sqlite3:/tmp/prom/file.sqlite3 \
  prom/promdash ./bin/rake db:migrate

docker run -p 3000:3000 -v /tmp/prom:/tmp/prom \
  -e DATABASE_URL=sqlite3:/tmp/prom/file.sqlite3 \
  prom/promdash

Promdash

Logging

Docker soporta múltiples loggins drivers, solo necesitas pasar una flag:

--loggin-driver=<driver>
  • json-file
  • syslog
  • journald
  • fluentd

Logspout

Log routing para los logs de los contenedores.

docker run --name="logspout" \
    --volume=/var/run/docker.sock:/tmp/docker.sock \
    gliderlabs/logspout \
    syslog://logs.papertrailapp.com:55555

Papertrail

Service Discovery

DNSDock

Servidor DNS para discovery automático de contenedores.

docker run -d -v \
  /var/run/docker.sock:/var/run/docker.sock \
  --name dnsdock \
  -p 172.17.42.1:53:53/udp \
  tonistiigi/dnsdock

DNSDock

Cada contenedor esta mapeado a una url siguiendo el formato: 

<anything>.<container-name>.<image-name>.<environment>.<domain>

$ docker run -d --name redis1 redis

$ dig @172.12.42.1 redis.test +short
172.17.0.5

nginx-proxy

Proxy automático para contenedores.

docker run -d -p 80:80 \
   -v /var/run/docker.sock:/tmp/docker.sock:ro \
   jwilder/nginx-proxy


docker run -d -e VIRTUAL_HOST=redmine.docker.test \ 
    redmine

Alternativas

  • HA-Proxy
  • hipache
  • Skydock
  • Consul

Machine

Es una herramienta que permite crear instancia docker ya sea en local o en la nube.

  • Iniciar, detener y reiniciar instancias.
  • Actualizar la versión de docker.
  • Configurar al cliente para ejecutar en la instancia creada.

Opciones

ls Muestra las instancias creadas.

create -d  virtualbox name crea una nueva instancia con el id name.

 env name Muestra las variables para conexión con la instancia remota.

destroy name Elimina una instancia.

stop name Detiene la instancia especificada.

Docker API

Provee acceso a la administración de imágenes y contenedores.

  • Crea, iniciar, detener, eliminar contenedores e imágenes.

 

Crea nuevos contenedores programaticamente.

Controla el estado y declara políticas con base en eventos.

require 'docker'

redis = Docker::Container.create("Name" => "redis2", "Image" => "redis")
redis.start
redis.logs(stdout: true)


Docker::Image.all

Docker::Image.exist? 'alpine'

redis2 = Docker::Container.get 'redis2'
gem install docker-api

Questions and feedback

Slides

 http://speakerdeck.com/zoek1/docker-201

 

Evaluación

https://joind.in/15397

 

Contacto

@ilcapitanozoek

Docker 201

By Miguel Angel Gordian