owned this note
owned this note
Published
Linked with GitHub
---
title: Introducción a docker (2019)
author: Marc Bria
slideOptions:
transition: 'slide'
allottedMinutes: 120 # Minutes alloted for a slides.
defaultTiming: 120
# theme: black
# spotlight:
# enabled: true
# transition: convex
# theme: solarized
# transition: 'fade'
# transition: 'zoom'
# parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'
previewLinks: true
---
<style>
section.present { font-size: 2.5rem; }
.footnote { font-size: 1.5rem; }
div.reduced { font-size: 0.9em; }
.pkpContainer { display: flex; }
.pkpCol { flex: 1; width: 48%; }
h1.raw { padding-top:5vh }
.white img { background: rgb(255, 255, 255, 1) !important; }
.reveal .slides section .fragment.highlight-blue.visible {
color: black;
background: #1b91ff;
background: #89c4d5;
}
.reveal .slides section .fragment.highlight-green.visible {
color: black;
background: #87deaa;
}
.reveal .slides section .fragment.highlight-green.visible a {
color: black;
}
.ficha {
background: white;
color: #333;
padding: 4rem 8rem 4rem 8rem;
}
.right { text-align: right; }
.left { text-align: left; }
.justify { text-align: justify; }
mark { background: #89c4d5; }
.logo.fixedTop {
position: fixed;
top: 0vh;
right: -24vh;
text-align: right;
}
.logo.fixedTop img {
width: 50%; border: 0;
background-color: initial;
box-shadow: initial;
-webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */
filter: grayscale(100%);
}
.highlightMe {
background-color: red;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
text-shadow: 2px 2px #191919;
}
.alert-warning {
padding: 0.1rem 2rem;
}
.shadow {
text-shadow: 2px 2px #191919;
color:white; margin: 0;
}
@media print h1, h2, h3, h4, h5 {
text-shadow: 2px 2px #191919;
color:white; margin: 0;
}
/** overlap **/
.image-float {
float: left;
position: relative;
top: 0;
left: 0;
}
.reveal .content-aside {
margin-top: 1em;
}
</style>
<!-- .slide: data-background="https://i.imgur.com/5piZ1ur.png"-->
# ==DOCKER PARA DUMMIES==
#### (una introducción desenfadada al maravilloso universo de los contenedores)
----
# Las típicas preguntas...
### (para romper el hielo)
----
<!-- .slide: data-background="https://i.imgur.com/sEW3t3P.png"-->
## <span><!-- .element: class="fragment fade-down" data-fragment-index="1" --> ¿Alguien sabe lo que es docker? </span>
## <span><!-- .element: class="fragment fade-down" data-fragment-index="2" -->¿Algún técnic@ en la sala?</span>
## <span><!-- .element: class="fragment fade-down" data-fragment-index="3" -->¿Quién ha usado docker alguna vez?</span>
## <span><!-- .element: class="fragment fade-down" data-fragment-index="4" -->¿Alguien lo usa a diario?</span>
----
<!-- .slide: data-background="https://i.imgur.com/qV04Z9n.png"-->
# SIP, ESTE ES UN WORKSHOP TÉCNICO
#### (aunque adaptado para todos los públicos)
<!-- 





-->
----
<!-- .slide: data-background="https://i.imgur.com/s9a1P1x.png"-->
# ERGO...<br /> NO VA A SATISFACER A NADIE
### (PERO AL MENOS SALDRÁN DE AQUÍ<br/>CON UNA IDEA GENERAL)
<!--  -->
----
<!-- .slide: data-background="https://i.imgur.com/BpbIwMU.png"-->
# CONTENIDO
<div class="ficha">
| 1 | ¿Pq. necesitamos docker? | :star: |
|-------|----------------------------|-----------------------------|
| **2** | **¿Qué es y que aporta?** | :star: :star: |
| **3** | **Terminología docker** | :star: :star: |
| **4** | **Herramientas básicas** | :star: :star: :star: |
| **5** | **Vamos a jugar...** | :star: :star: :star: :star: |
</div>
<br />
### 80 minutos teoría
### 30 minutos práctica
(Aviso para navegantes... voy a tener que ir rápido. Pero si me paso, me paran.)
<!--  -->
<!----












-->
----
<div class="ficha">
Soy **Marc Bria**. En los últimos 20 años he participado en varias comunidades de **software libre** (moodle, drupal, PKP...) y en varios grupos de investigación sobre tecnologías y educación (DEHISI, FIC, MoodleUAB...).
Desde 2014 trabajo en el **Servicio de Publicaciones de la UAB** como tecnólogo, analista, desarrollador, administrador de sistemas, "pelacables"... "[cangura para todo](https://i.imgur.com/FwSx8in.png)".
Desde 2013 soy miembro del comité técnico del **Public Knowledge Project** (PKP, aka. "[los del OJS](https://pkp.sfu.ca/)").
</div>
---
# EL PROBLEMA

<span class="footnote">Fuente: https://www.cio.com/article/2924995/what-are-containers-and-why-do-you-need-them.html</span>
<span class="footnote">Vídeo: https://www.youtube.com/watch?v=Q5POuMHxW-0</span>
<div class="logo fixedTop">

</div>
----
# ¿LOS MOTIVOS?
<div class="ficha">
| **Múltiples pilas (stacks)** | **Múltiples destinos (targets)** |
| ------------------------------- | ---------------------------------- |
| Lenguajes | Entornos de desarrollo locales |
| Versiones | Preproducción |
| Frameworks | Control de calidad (QA) |
| Librerías | Puesta en escena (staging) |
| Bases de datos | Producción: hierro, nube, híbrido...|
| ... | ... |
</div>
----
## LA MATRIZ DEL INFIERNO

----
<!-- .slide: data-background="https://i.imgur.com/VGRxS7D.png"-->
# SÍNDROME DE SÍSIFO
### (según la OMS es la principal causa del "[BOFH](https://es.wikipedia.org/wiki/Bastard_Operator_from_Hell)")
<!--  -->
----
### ¿ES UN PROBLEMA NUEVO?

----
<!-- .slide: data-background="https://i.imgur.com/46Up4fk.png"-->
# ¡CONTENEDORES!
<!--  -->
----
## EN REALIDAD: LA TECNOLOGÍA YA EXISTÍA...
<div style="width:100%; height:500px; overflow-y:scroll;">
<img src="https://i.imgur.com/pzeDxA4.png" style="max-height: initial;width:100%;" />
</div>
<span class="footnote">Fuente: https://www.plesk.com/blog/business-industry/infographic-brief-history-linux-containerization</span>
**1978 chroot** > 2000 jails > 2007 cgroups > **2008 linuxContainers** > 2013 docker
<div class="logo fixedTop">

</div>
<!--
{%slideshare Pivotal/the-history-44807468 %}

<span class="footnote">Fuente: [Roy, Gareth & Washbrook, Andrew & Crooks, David & Qin, Gang & Skipsey, Samuel & Stewart, Gordon & Britton, David. (2015). Evaluation of containers as a virtualisation alternative for HEP workloads. Journal of Physics: Conference Series. 664. 022034. 10.1088/1742-6596/664/2/022034. ](https://www.researchgate.net/publication/288039950_Evaluation_of_containers_as_a_virtualisation_alternative_for_HEP_workloads/figures?lo=1)</span>
-->
----
<!--  -->
<!-- .slide: data-background="https://i.imgur.com/ZgbuUpN.png"-->
# Docker tiene éxito<br/>pq. lo pone muy fácil
----
## ==Y pq es, usa y distribuye FLOSS...==
<!-- .slide: data-background="https://i.imgur.com/gZ3nZJt.jpg"-->

<!--  -->
<div class="logo fixedTop">

</div>
---
<!-- .slide: data-background="https://i.imgur.com/fzu9wWo.png"-->
<br />
<br />
<br />
<br />
<br />
# ¿UNA DEFINICIÓN POR FAVOR?
<!--  -->
----
<!-- .slide: data-background="https://i.imgur.com/ZzJ6o4A.jpg"-->
<div class="ficha">
**Docker es una herramienta para <span><!-- .element: class="fragment highlight-blue" data-fragment-index="1" -->empaquetar una aplicación junto con sus dependencias</span> (librerías, configuración, datos...).**
Así garantiza la portabilidad y a su vez, tiene efectos secundarios muy positivos como: el aislamiento, réplica, adaptabilidad, integración, reciclado, agilidad, resiliencia, backup...
</div>
<!--
Docker Benefits
Fast (deployment, migration, restarts)
Secure
Lightweight (save disk & CPU)
Portable software
Microservices and integrations (APIs)
Simplify DevOps
Open Source
Version control capabilities
-->
<div class="logo fixedTop">

</div>
----
## PORTABILIDAD Y CONSISTENCIA
<div class="image-float">
<p style="position: relative; left: 0; top: 0;">
<img src="https://i.imgur.com/vSSWTzx.png" width="50%"/>
</p>
<p class="fragment" data-fragment-index="1" style="position:absolute; left: 0; top: 0;">
<img src="https://i.imgur.com/C2V6NR2.png" width="50%"/>
</p>
</div>
De desarrollo a producción (y viceversa)
**Staging > Continuous Integration**
<!--  -->
<!--  -->
<div class="logo fixedTop">

</div>
----
## MASCOTAS VS GANADO
Réplica, escalabilidad, testing, alta disponibilidad...

[The History of Pets vs Cattle and How to Use the Analogy Properly](http://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle)<br/> ~ Posted on Sep 29, 2016 by Randy Bias
<div class="logo fixedTop">

</div>
----
## AISLAMIENTO
Por si solo, no garantiza la seguridad, pero mejora respecto al modelo clásico.

<div class="logo fixedTop">

</div>
----
## ADAPTABILIDAD
Como los contenedores se pueden crear y destruir fácilmente, el sistema puede responder según la demanda.
{%youtube CZ3wIuvmHeM %}
----
## "DESARROLLO LEGO"
La modularidad que ofrecen los micro-servicios permite pensar desarrollos a muy alto nivel, mediante cajas negras intercomunicadas con distintas funciones.

<span class="footnote">Más info: https://mobyproject.org</span>
<!--

-->
----
## CONTROL DE VERSIONES

Docker usa git para gestionar las distintas versiones de las imágenes.
----
## EFICIENCIA
<div class="reduced">
Una máquina virtual (VM) necesita contener todo el sistema operativo. <span><!-- .element: class="fragment highlight-blue" data-fragment-index="1" -->Los contenedores aprovechan el SO del anfitrión</span> en el que se ejecutan (comparten kernel e incluso librerías).
Los contenedores son más ligeros, rápidos y consumen menos recursos (disco, memoria y CPU), pero no pueden ejecutar sistemas operativos distintos al del anfitrión.</div>

<span class="footnote">Fuente: https://subscription.packtpub.com/book/virtualization_and_cloud/9781783981786/1/ch01lvl1sec9/virtualization-with-proxmox-ve</span>
<!--  -->
<div class="logo fixedTop">

</div>
----
### ¿CONTENEDORES vs MÁQUINAS VIRTUALES?
{%youtube FWpnbGnzk08 %}
----
### AMBAS TECNOLOGÍAS ESTÁN BIEN<br/>PERO LOS CONTENEDORES VAN GANANDO... ;-)

Fuente: https://trends.google.es/trends/explore?date=today%205-y&q=docker,vmware
----
### ¿QUIÉN USA DOCKER?
**Google:** https://www.youtube.com/watch?v=tsk0pWf4ipw
**Netflix:** https://www.youtube.com/watch?v=CZ3wIuvmHe*M

<span class="footnote">Fuente: https://stackshare.io/docker
Mas información: https://www.featuredcustomers.com/vendor/docker/customers</span>
----
### ¿QUIÉN USA DOCKER?
<div style="width: 90%; margin: auto;">
| <a href="https://i.imgur.com/4OaaAha.png"></a> | <a href="https://i.imgur.com/24K2iSa.png"></a> |
|---|---|
| <a href="https://i.imgur.com/OhffrSi.png"></a> | <a href="https://i.imgur.com/xnXPj7i.png">
</a> |
</div>
<span class="footnote">From: <a href="https://www.datadoghq.com/docker-adoption">https://www.datadoghq.com/docker-adoption</a></span>
---
# ANTES DE SEGUIR... <br/>UN ÚLTIMO CONCEPTO
<!--  -->
----
<!-- .slide: data-background="https://i.imgur.com/QsGCYKA.png"-->
<!--  -->
## MONOLITO vs MULTISERVICIOS
<div class="image-float">
<p style="position: relative; left: 0; top: 0;">
<img src="https://i.imgur.com/wHolORp.png" width="75%"/>
</p>
<p class="fragment" data-fragment-index="1" style="position:absolute; left: 0; top: 0;">
<img src="https://i.imgur.com/iuZlAB3.png" width="75%"/>
</p>
<p class="fragment" data-fragment-index="2" style="position:absolute; left:0; top: 0;">
<img src="https://i.imgur.com/2A3OKwl.png" width="75%"/>
</p>
<p class="fragment" data-fragment-index="3" style="position:absolute; left:0; top: 0;">
<img src="https://i.imgur.com/X6fKmOR.png" width="75%"/>
</p>
</div>
<!--




-->
<div class="logo fixedTop">

</div>
---
<!-- .slide: data-background="https://i.imgur.com/90KffET.png"-->
# CAMBIA EL PARADIGMA
<div class="ficha">
| ANTES | > AHORA... |
|-----------------------------|---------------------------------|
| Aplicaciones monolito | > Servicios desacoplados |
| Largos ciclos de desarrollo | > Mejoras rápidas e iterativas |
| Escalado planificado | > Escalado dinámico |
| Único entorno/servidor | > Múltiples entornos/servidores |
</div>
<!--  -->
---
<!-- .slide: data-background="https://i.imgur.com/G38K1rh.jpg" -->
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
# TAL VEZ... <br />¿DEBERÍAMOS USAR DOCKER?
<!--  -->
---
## ¿QUÉ VERSIONES HAY?

<span class="footnote">Fuente: https://collabnix.com/demystifying-the-relationship-between-moby-docker</span>
Para empezar: [Docker Comunity Edition](https://docs.docker.com/install)
Diseñado primero para GNU/Linux, también funciona sobre MacOS y Windows.
----
## ¿CÓMO SE INSTALA?
```bash=
### Fuente: https://docs.docker.com/install/linux/docker-ce/debian/
### AVISO: Este script es para Debian. No usar para ubuntu.
### Garantizar que no hay instalaciones previas:
$ sudo apt-get remove docker docker-engine docker.io containerd runc
### Añadir dependencias
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
### Añadir el repositorio de docker-ce
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable"
### Instalar docker-ce
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
### Confirmar que el servicio está corriendo:
$ sudo systemctl status docker
### Provar creando contenedor "hola mundo"
$ sudo docker run hello-world
### Opcional: Ahorrarse el sudo
$ sudo usermod -aG docker ${USER}
### Y reiniciar la sesión o hacer "su - ${USER}".
### Para añadir nuevos usuarios al grupo docker:
$ sudo usermod -aG docker <username>
```
Para el resto de sistemas operativos: https://docs.docker.com/install
(También para Windows)
<div class="logo fixedTop">

</div>
----
<iframe width="100%" height="500px" src="https://labs.play-with-docker.com/" frameborder="0" style="background-color:white;"></iframe>
URL: https://labs.play-with-docker.com
<span class="footnote">(Nota: La web embedida puede fallar. Si sucede, usa el enlace.)</span>
<div class="logo fixedTop">

</div>
---
<!-- .slide: data-background="https://i.imgur.com/6udxtDa.png"-->
# CONCEPTOS BÁSICOS
### (muy, muy básicos)
<!--  -->
<!--  -->
----
### TERMINOLOGÍA ESENCIAL
<!-- .slide: data-background="https://i.imgur.com/iyYvuoK.jpg"-->
<div class="pkpContainer">
<div class="pkpCol">

</div>
<div class="pkpCol" style="padding-top: 2rem; margin-left: -4rem; text-align: left;">
<span><!-- .element: class="fragment highlight-blue" data-fragment-index="1" -->**Dockerfile:** Las instrucciones para construir la imagen. ["La receta"]</span>
<span><!-- .element: class="fragment highlight-blue" data-fragment-index="2" -->**Imagen:** El modelo abstracto de contenedor. ["El molde"]</span>
<span><!-- .element: class="fragment highlight-green" data-fragment-index="3" -->**Contenedor:** La concreción de una imagen abstracta. ["La galleta"]</span>
<span><!-- .element: class="fragment highlight-green" data-fragment-index="4" -->**Volumen:** Los datos, que pueden ser persistentes o volátiles. ["¿El plato?"]</span>
<br />
:::warning
:warning: ***Los contenedores son volátiles***
Mascota vs ganado: Si falla, se sacrifica y se vuelven a generar.
:::
</div>
</div>
<div style="clear:both;" />
<!--  -->
<div class="logo fixedTop">

</div>
----
### RADIOGRAFÍA DE UN DOCKERFILE
#### (las "recetas")
```dockerfile=
FROM php:apache
# Omeka-S web publishing platform for digital heritage collections (https://omeka.org/s/)
# Initial maintainer: Oldrich Vykydal (o1da) - Klokan Technologies GmbH
MAINTAINER Eric Dodemont <eric.dodemont@skynet.be>
RUN a2enmod rewrite
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -qq update && apt-get -qq -y upgrade
RUN apt-get -qq update && apt-get -qq -y --no-install-recommends install \
unzip \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libjpeg-dev \
libmemcached-dev \
zlib1g-dev \
imagemagick \
libmagickwand-dev
# Install the PHP extensions we need
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) iconv pdo pdo_mysql mysqli gd
RUN pecl install mcrypt-1.0.2 && docker-php-ext-enable mcrypt && pecl install imagick && docker-php-ext-enable imagick
# Add the Omeka-S PHP code
COPY ./omeka-s-1.4.0.zip /var/www/
RUN unzip -q /var/www/omeka-s-1.4.0.zip -d /var/www/ \
&& rm /var/www/omeka-s-1.4.0.zip \
&& rm -rf /var/www/html/ \
&& mv /var/www/omeka-s/ /var/www/html/
COPY ./imagemagick-policy.xml /etc/ImageMagick/policy.xml
COPY ./.htaccess /var/www/html/.htaccess
# Add some Omeka modules
COPY ./omeka-s-modules-v4.tar.gz /var/www/html/
RUN rm -rf /var/www/html/modules/ \
&& tar -xzf /var/www/html/omeka-s-modules-v4.tar.gz -C /var/www/html/ \
&& rm /var/www/html/omeka-s-modules-v4.tar.gz
# Add some themes
COPY ./centerrow-v1.4.0.zip ./cozy-v1.3.1.zip ./thedaily-v1.4.0.zip /var/www/html/themes/
RUN unzip -q /var/www/html/themes/centerrow-v1.4.0.zip -d /var/www/html/themes/ \
&& unzip -q /var/www/html/themes/cozy-v1.3.1.zip -d /var/www/html/themes/ \
&& unzip -q /var/www/html/themes/thedaily-v1.4.0.zip -d /var/www/html/themes/ \
&& rm /var/www/html/themes/centerrow-v1.4.0.zip /var/www/html/themes/cozy-v1.3.1.zip /var/www/html/themes/thedaily-v1.4.0.zip
# Create one volume for files and config
RUN mkdir -p /var/www/html/volume/config/ && mkdir -p /var/www/html/volume/files/
COPY ./database.ini /var/www/html/volume/config/
RUN rm /var/www/html/config/database.ini \
&& ln -s /var/www/html/volume/config/database.ini /var/www/html/config/database.ini \
&& rm -Rf /var/www/html/files/ \
&& ln -s /var/www/html/volume/files/ /var/www/html/files \
&& chown -R www-data:www-data /var/www/html/ \
&& chmod 600 /var/www/html/volume/config/database.ini \
&& chmod 600 /var/www/html/.htaccess
VOLUME /var/www/html/volume/
CMD ["apache2-foreground"]
```
<span class="footnote">Fuente: https://github.com/dodeeric/omeka-s-docker/blob/master/Dockerfile
Recuerda: [Monolítico vs Micro-servicios](https://hackmd.io/@marcbria/docker4ojs#/5/1)</span>
----
<!-- .slide: data-background="https://i.imgur.com/V2XlWJO.jpg"-->
<!--  -->
# UTENSILIOS E INGREDIENTES
<br />
<div class="pkpContainer reduced" style="background-color: white; color: black; padding: 4rem; 2rem 4rem 0rem;">
<div class="pkpCol" style="">
## ==DEFINICIÓN==
- **FROM:** define la IMAGEN BASE
(nuestro punto de partida).
- **ENV:** define variables de entorno.
- **EXPOSE:** abre puertos del contenedor.
- **WORKDIR:** directorio de trabajo.
- **USER:** usuario y grupo.
</div>
<div class="pkpCol">
## ==ACCIÓN==
- **COPY:** copia dentro del contenedor
(ver ADD).
- **RUN:** ejecuta un comando.
- **VOLUME:** crea un volumen.
- **CMD:** define el programa que ejecutará el contenedor.
(ver ENTRYPOINT).
</div>
</div>
[¿Quieres saber más?](https://docs.docker.com/engine/reference/builder)
----
<!-- .slide: data-background="https://i.imgur.com/G5N3D3v.jpg"-->
<!--  -->
### EL CIRCUITO DOCKER
<div class="pkpContainer reduced">
<div class="pkpCol">

</div>
<div class="pkpCol" style="padding-top: 10rem; margin-left: -4rem; text-align: left;">
<span><!-- .element: class="fragment highlight-blue" data-fragment-index="1" -->1) **Dockerfile:** El Dockerfile se construye ("build") para crear una "imagen":</span>
```bash=
$ docker build [options]
```
<span><!-- .element: class="fragment highlight-green" data-fragment-index="2" -->2) **Imagen:** La "imagen" se ejecuta ("run") para crear un "contendor":</span>
```bash=
$ docker run [options] image-name
```
<span><!-- .element: class="fragment highlight-blue" data-fragment-index="3" -->1-2) **Contenedor:** En la definición (Dockerfile) o al iniciarlos, los "contendores" incluyen o se asocian a "volúmenes".</span>
```bash=
$ docker run [options] -v ./web:/var/www/html img-name
```
</div>
</div>
<div style="clear:both;" />
<div class="logo fixedTop">

</div>
----
# COMANDOS BÁSICOS
<div class="pkpContainer reduced">
<div class="pkpCol" style=" text-align: left;">
- **build:** CONSTRUIR una imagen a partir del Dockerfile del directorio actual:
```bash=
$ docker build
```
- **run:** CREAR un contenedor:
```bash=
$ docker run [options] [containerIDoName]
```
- **ps:** VER los contenedores en funcionamiento (con "-a" para verlos todos, incluso los detenidos):
```bash=
$ docker ps
$ docker ps -a
```
</div>
<div class="pkpCol" style="text-align: left;">
- **stop:** DETENER un contenedor:
```bash=
$ docker stop [containerIDoName]
```
- **start:** LEVANTAR un contenedor:
```bash=
$ docker start [containerIDoName]
```
- **logs:** Ver los últimos REGISTROS:
```bash=
$ docker logs [containerIDoName]
```
- **rm:** BORRA un contenedor detenido:
```bash=
$ docker rm [containerIDoName]
```
</div>
</div>
<div style="clear:both;" />
----
# ¿OS ACORDÁIS DE LOS MICROSERVICIOS?
<div class="pkpContainer reduced">
<div class="pkpCol" style=" text-align: left;">

</div>
<div class="pkpCol" style="text-align: left;">

</div>
</div>
<div style="clear:both;" />
----
<!-- .slide: data-background="https://i.imgur.com/KHunBKP.png"-->
<!-- -->
### Con un solo Dockerfile encapsulamos<br />pero volvemos a tener un MONOLITO
## ¿PODEMOS CONSTRUIR<br />UN PUZZLE DE DOCKERS?

----
<!-- .slide: data-background="https://i.imgur.com/Ab1vI70.png"-->
<!--  -->
----

<span class="footnote">Fuente: https://docs.docker.com/compose/compose-file
</span>
----
# DOCKER-COMPOSE.YML
```yaml=
version: "2"
services:
mariadb:
image: mariadb:latest
restart: always
networks:
- network1
volumes:
- mariadb:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: blabla
MYSQL_DATABASE: omeka
MYSQL_USER: omeka
MYSQL_PASSWORD: omeka
pma:
depends_on:
- mariadb
image: phpmyadmin/phpmyadmin:latest
restart: always
networks:
- network1
ports:
- "8080:80"
links:
- mariadb:db
omeka:
depends_on:
- mariadb
image: dodeeric/omeka-s:latest
restart: always
networks:
- network1
ports:
- "80:80"
links:
- mariadb:db
volumes:
- omeka:/var/www/html/volume
volumes:
mariadb:
omeka:
networks:
network1:
```
<span class="footnote">Fuente: https://github.com/dodeeric/omeka-s-docker/blob/master/docker-compose.yml
</span>
---
<!-- .slide: data-background="https://i.imgur.com/dwL3KdC.jpg"-->
# ¿VAMOS A JUGAR?
----
<!-- .slide: data-background="https://i.imgur.com/lzT2qDL.jpg"-->
<!--  -->
## REGLAS
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="1" -->"La 1ª regla del Club de la lucha es: nadie habla sobre el Club de la lucha".</span>
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="2" --> La práctica se realiza sobre una plataforma llamada katakoda.
DISCLAIMER: Y nunca lo he probado con tanta gente. </span>
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="3" -->Iremos todos juntos (avanzando a la velocidad del búfalo más lento).</span>
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="4" -->¿Te sientes inseguro/a? Busca un/a compañero/a con cara de experto/a.</span>
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="5" -->Si surgen dudas, levantad la mano y nos paramos.</span> No dejaremos nadie a atrás.
- <span><!-- .element: class="fragment highlight-blue" data-fragment-index="6" -->Hay más ejercicios que tiempo. Podéis continuar en casa</span>.
#### Yo ya se y me aburro. ¿Puedo ir por libre adelantando ejercicios?
- Claro, pero lee el anunciado varias veces.
- Si te pierdes... estás solo/a.
- Si tienes dudas, hablamos al terminar.
----
## PRÁCTICA 1
<div class="pkpContainer reduced">
<div class="pkpCol" style=" text-align: left;">

</div>
<div class="pkpCol" style="text-align: left; padding-top: 6rem;">
En este ejercicio aprenderás a crear una imagen Docker que contenga un sitio web estático sobre un servidor web Nginx. Algunos comandos intimidan un poco, pero la idea es simple. Vamos a construir la siguiente "pila" (en inglés le llaman "stack"):
- Web estática: index.html
- Servidor web: Nginx
- Sistema operativo: alpine
[Ir al ejercicio](https://www.katacoda.com/courses/docker/create-nginx-static-web-server)
</div>
</div>
<div style="clear:both;" />
----
## PRÁCTICA 2
<div class="pkpContainer reduced">
<div class="pkpCol" style=" text-align: left;">

</div>
<div class="pkpCol" style="text-align: left; padding-top: 4rem;">
Si queremos desacoplar los servicios, debemos construir múltiples contenedores y comunicarlos entre si. Esto se puede hacer "a mano" pero es tedioso. Para coordinar distintos contenedores que funcionan conjuntamente, se ha creado Docker Compose (hay quien lo llama orquestrador).
En el siguiente ejercicio vamos a ver como crear un docker-compose.yml para iniciar y comunicar distintos distintos servicios.
[Ir al ejercicio](https://www.katacoda.com/courses/docker/11)
</div>
</div>
<div style="clear:both;" />
----
## ME ABUUUURROOO...

[Ir al curso](https://www.katacoda.com/courses/docker)
----
<!-- .slide: data-background="https://i.imgur.com/xu9lfxU.png"-->
<!--  -->
# ¿Quiere saber más?
- https://www.freecodecamp.org/news/comprehensive-introductory-guide-to-docker-vms-and-containers-4e42a13ee103/
- https://devhints.io/docker
- https://github.com/wsargent/docker-cheat-sheet
---
# GRACIAS
#### Marc Bria Ramírez
Servei de publicacions de la UAB
PKP's technical committee (at large member)
##### marc.bria@uab.es
<br />
<br />
<span class="footnote">
**AVISO:** Ningún animal ha sido dañado durante esta presentación.
</span>