_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
&
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
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.
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
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
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
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
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
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.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Gracias
Javier Gómez Gómez
Ignacio López Flores
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
&
Una imagen vale más que mil palabras