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.
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.
{
"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"
}]
}
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
Sistema para monitoreo creado en SoundCloud.
docker run \
-p 9090:9090 \
-v /prometheus.yml:/prometheus.yml \
prom/prometheus \
-config.file=/prometheus.yml
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
Docker soporta múltiples loggins drivers, solo necesitas pasar una flag:
--loggin-driver=<driver>
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
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
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
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
Es una herramienta que permite crear instancia docker ya sea en local o en la nube.
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.
Provee acceso a la administración de imágenes y contenedores.
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