¿Quién soy?
Ignacio López Flores
Founder & CEO @ Introbay
@ignaciolflores
IRC: ignaciolflores
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 y su Dockerfile
- 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.
Instalación de Docker
-
https://docs.docker.com/engine/installation
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 personalizada
docker commit
- Subimos la imagen a un repositorio (público ó privado).
docker push
- Reutilizamos nuestra imagen docker como base para nuevos contenedores.
##Linea de comandos
Sintaxis:
docker [OPTIONS] COMMAND [argumentos]
### Ejemplos:
```
docker pull drupal:8
docker run -it drupal:8 bash
docker ps -a
docker start *musing_turing*
docker exec -it *musing_turing* bash
docker ps -a
docker stop *musing_turing*
docker rm *musing_turing*
```
Vamos a crear nuestra propia imagen
Ventajas
- Evitamos tener que ejecutar el mismo código cada vez
- Podemos distribuir nuestra configuración
- Podemos abstraer a los desarrolladores de aspectos de DevOps
- Otras que se me irán ocurriendo durante este taller...
## Vamos a crear nuestra propia imagen
Dockerfile
```
FROM drupal:8
# 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:8.* \
&& ln -sf $COMPOSER_HOME/vendor/bin/drush.php /usr/local/bin/drush \
&& drush cache-clear drush
```
## Vamos a crear nuestra propia imagen
```
docker build -t midrupal .
```
## Vamos a usar nuestra propia imagen
```
$ docker run -it --rm midrupal bash
$ drush --version
$ drush dl pathauto
```
Ahora podemos usar drush al lanzar un contenedor sin tener que instalarlo cada vez
Docker-compose
Constructor de aplicaciones multi-contenedor
Qué 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
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
Ignacio López Flores