Una imagen vale más que mil palabras – La matriz del infierno



Una imagen vale más que mil palabras – La matriz del infierno

0 0


dcamp2016-docker

Slides de la charla sobre Docker en la DrupalCamp Spain 2016

On Github introbay / dcamp2016-docker

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
&

Una imagen vale más que mil palabras

Sobre nosotros

Ignacio López Flores

Founder & CEO @ Introbay

@ignaciolflores

IRC: ignaciolflores

Sobre nosotros

Javier Gómez Gómez

Drupal Developer @ Introbay

@fjgomez2

IRC: codigoweb

La matriz del infierno

Conceptos básicos

  • Virtualización: Creación por software de la versión virtual de un recurso tecnológico, habitualmente servidores.
  • Maquina virtual (VM): Emulación de una ordenador físico por medio de software en un sistema anfitrión.
  • Hipervisor: Sistema anfitrión sobre el que funcionan las VM, puede ser por software ó hardware (poco habituales).
    • Escritorio: virtualbox, vmware, etc.
    • Servidor: xenserver, proxmox, etc.

Linux Containers (LCX)

  • Permite que un servidor físico ejecute múltiples instancias de sistemas operativos aislados compartiendo el core.
  • Pueden tener diferentes Sistemas Operativos (debian, centos, redhat, ubuntu, etc.) siempre que tengan la misma versión del core que el sistema anfitrión.
  • Consumen menos recursos hardware y software que las VM.
  • Implementación basada en imágenes.
  • Aislamiento de aplicaciones que se pueden combinar.

Y llegó Docker

  • LCX independiza sistemas operativos ligeros sobre los que lanzar aplicaciones.
  • Docker define un formato para empaquetar una aplicación y todas sus dependencias en un solo objeto que pueden ser transferidas a cualquier otro sistema Docker, y ser ejecutados allí con la garantía de que el entorno de ejecución será siempre el mismo.
  • Contenedores: contienen todo lo necesario para que una aplicación pueda funcionar.
  • Imágenes: sistema operativo con aplicaciones instaladas y configuradas.

Estructura de Docker

La solución de Docker

Docker Registry

  • Registry: Servidor que contiene repositorios e imágenes.
  • Repositorios: Contiene imagenes creadas y listas para ser descargadas.
  • Repositorio oficial https://hub.docker.com
  • En Dockerhub podemos crear repositorios privados ó públicos.
  • Dockerhub se integra con repositorios de código como GitHub y construye las imagenes al actualizarlos.
  • También podemos tener nuestro propio Registry que se crea a partir de una imagen Docker.

Requisitos de Docker

  • Docker necesita que el host sea linux 64bits y que el core sea como mínimo v3.10, se recomienda ubuntu o debian aunque puede ser cualquier distro.
  • uname -r nos devuelve la versión del core.
  • hay varios métodos para instalarlo, vamos a explicarlo sobre debian 8.

Instalación en Linux

  • Actualizamos Apt sources editamos /etc/apt/sources.list.d/docker.list y le añadimosapt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
  • Añadimos el repo editamos /etc/apt/sources.list.d/docker.list y le añadimosdeb https://apt.dockerproject.org/repo debian-jessie main
  • Actualizamos paquetesapt-get update
  • Instalamos docker y levantamos el servicioapt-get install docker-engineservice docker start

Windows y Mac OSX

Tres metodos

Docker machine

Parte de Docker Toolbox, imprescindible en osx y windows.
  • Creamos la máquina docker-machine create -d virtualbox drupalcamp
  • Para que nuestro la reconozcaeval $(docker-machine env drupalcamp)
  • Levantamos la máquinadocker-machine start drupalcamp
  • Paramos la máquinadocker-machine stop drupalcamp
docs.docker.com/machine/reference

Instalación en servicios cloud

docs.docker.com/engine/installation/cloud docs.docker.com/machine/drivers

Linea de comandos

Sintaxis:docker [OPTIONS] COMMAND [argumentos]docker [OPTIONS] COMMAND [argumentos] IMAGEEjemplos:docker exec -it 4ac7ebc37986 bashdocker run -d --link db:mysql -p 80:80 drupal:7docker COMMAND --help

Cómo funciona?

  • Descargamos una imagen base de un repositorio. docker pull
  • A partir de la imagen base creamos nuestro contenedor. docker run
  • Realizamos los cambios que deseamos sobre el contenedor.
  • Creamos nuestra imagen personalizadadocker commit
  • Subimos la imagen a un repositorio (público ó privado). docker push
  • Reutilizamos nuestra imagen docker como base para nuevos contenedores.

Demo 1

$ docker pull drupal:7
$ docker run -d --name test drupal:7

Entramos en el contenedor

docker exec -it test bash

Una vez dentro, instalamos drush

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

composer global require drush/drush:7.*

export PATH="$HOME/.composer/vendor/bin:$PATH"

echo export PATH=\"$HOME/.composer/vendor/bin:$PATH\" >> /root/.bashrc

Demo 1

Paramos el contenedor y lo añadimos a nuestro repositorio local

docker stop test
docker commit test test-drupal:7

Lanzamos MySQL

docker run -d --name db-test \
-e MYSQL_ROOT_PASSWORD="1234" \
-e MYSQL_DATABASE="database" \
-e MYSQL_USER="user" \
-e MYSQL_PASSWORD="1234" mysql

Lanzamos nuestra imagen linkada a la base de datos

docker run -d --name nuevo-test --link db-test:db-server -p 8080:80 test-drupal:7

Video

Ver el video.

Docker-compose

Constructor de aplicaciones multi-contenedorQué necesitamos:
  • Carpeta del proyecto.
  • fichero docker-compose.yml.
  • levantar todo: docker compose up

qué contiene docker-compose.yml?

  • descriptor de los contenedores.
  • formato de serialización yaml.
  • especificamos: contenedores, propiedades, variables de entorno, etc

Demo 2

docker-compose.yml

web:
  image: test-drupal:7
  links:
    - db:db-server
  ports:
    - 8080:80
db:
  image: mysql:5.6
  environment:
    - MYSQL_ROOT_PASSWORD=1234
    - MYSQL_DATABASE=database
    - MYSQL_USER=user
    - MYSQL_PASSWORD=1234

Demo 2

Creamos los contenedores

$ docker-compose up -d

Comprobamos que todo está en ejecución

$ docker-compose ps

$ docker ps -a

Video

Ver el video.

Dockerfile

Docker build Construye un contenedor a partir de un Dockerfile.Dockerfile: Archivo de texto plano que contiene un conjunto de instrucciones para construir un contenedor.dockerfile -> docker build ==== makefile -> drush makeQué necesitamos?
  • Carpeta del proyecto.
  • Archivo Dockerfile.
  • Construir: docker build.
Ejemplos de Dockerfile: github, github y github.docs.docker.com/engine/reference/builder

Demo 3

Dockerfile

FROM drupal:7

# Install drush by using composer
ENV COMPOSER_HOME /root/composer
ENV COMPOSER_VERSION master

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& composer global require drush/drush:7.* \
&& ln -sf $COMPOSER_HOME/vendor/bin/drush.php /usr/local/bin/drush \
&& drush cache-clear drush

Demo 3

docker-compose.yml

web:
build: .
links:
- db:db-server
ports:
- 8080:80
db:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=database
- MYSQL_USER=user
- MYSQL_PASSWORD=1234

Demo 3

Construimos los contenedores

$ docker-compose build

$ docker images

Creamos los contenedores

$ docker-compose up -d

Comprobamos que todo está en ejecución

$ docker-compose ps

$ docker ps -a

Video

Ver el video.

Demo 4

docker-compose.yml

web:
    build: .
    links:
        - db:db-server
    environment:
        - VIRTUAL_HOST=test.introbay.com
    volumes_from:
        - web-stg
    mem_limit: 512m
    restart: always
web-stg:
    build: .
    entrypoint: echo "Data-only container for Drupal"
    volumes:
        - /var/www/html
db:
    image: mysql:5.6
    environment:
        - MYSQL_ROOT_PASSWORD=1234
        - MYSQL_DATABASE=database
        - MYSQL_USER=user
        - MYSQL_PASSWORD=1234
    mem_limit: 1024m
    restart: always
proxy:
    image: jwilder/nginx-proxy
    volumes:
        - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
        - 8080:80
    mem_limit: 256m
    restart: always

Video

Ver el video.

Aplicaciones prácticas

Dependiendo de tu perfil:

  • DevOps
  • Desarrollador (back o front)

DevOps

Es posible tener diferentes configuraciones dependiendo del entorno

  • Prod: Mínima configuración, foco en performance.
  • Pre-prod: Basado en la configuración de Prod. Se usa habitualmente para construir el entorno de integración.
  • Dev: Basado en Pre-prod, puede añadir herramientas útiles en desarrollo: xdebug, vim, sass compiler, etc.

DevOps

Otras cosas que hacen la vida más fácil:

  • Distribución de imágenes cocinadas listas para usar en cada entorno.
  • Sistemas de integración continua.
  • Control de versiones sobre la configuración.
  • Eliminación del efecto “a mi me funciona”.

DevOps

Despliegues

  • Las imágenes de nuestra aplicación son los artifacts que desplegamos
  • Worflow simple: generas una imagen, despliegas, post-scripts
  • Desplegar o actualizar una imagen nueva es simple y rápido: docker-compose up -d
  • Gestionar actualizaciones y cambios de versión pasa por construir la nueva imagen y cambiar un número en el docker-compose.yml

Dev (back & front)

  • Simplificación del workflow de trabajo.
  • Posibilidad de tener múltiples entornos en la misma máquina.
  • Cambiar entre proyectos es fácil.
  • Desarrollo y tests sobre entorno idéntico a producción.
  • No queremos saber nada de sistemas!

Dev (back & front)

¿Cómo modifico mi código?

Hay varias opciones.

  • Entro en el contenedor, uso Vim, git, etc.
  • Mapeo el directorio donde está mi código y lo modifico desde el exterior. (=> permisos :-S).
  • Nuestra solución: contenedor extra con SSH y que usa el volumen de Drupal (sshfs).

A tener en cuenta...

No confies en alguien que te diga que Docker es un camino de rosas.

A tener en cuenta...

Empieza desde abajo, déjate el balconing.

A tener en cuenta...

Hay más dockers en el mar.

Google, CoreOs, RancherOs, ...

A tener en cuenta...

Cuidado con los trendy guys.

¿Preguntas?

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Gracias

Javier Gómez Gómez
Ignacio López Flores
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ & Una imagen vale más que mil palabras