Docker PDF
Docker PDF
Contenedores
Docker
Micael Gallego
micael.gallego@urjc.es
@micael_gallego
Virtualización y
Contenedores Docker
1. Virtualización
2. Docker
3. Docker Compose
2
Virtualización
● Los desarrolladores quieren reducir las diferencias
entre el entorno de desarrollo local (portátil), los
servidores de integración continua y los sistemas de
producción
● Quieren evitar los problemas de tipo “Funciona en
mi máquina”
Virtualización Contenedores
3
Virtualización
● Virtualización
● Máquina virtual con interfaz gráfica (VirtualBox)
● Máquina virtual tipo servidor, diseñada para
servidores (Vagrant)
● Contenedores
● Docker
4
5
VirtualBox
● Desarrollado por Oracle
● Software libre (con módulos gratuitos, pero no libres)
● Versiones para Windows, Linux y Mac
● Virtualización avanzada de escritorio
● Compartir corpetas entre la máquina anfitriona y la VM invitada
● Integración de teclado y ratón
● Aceleración gráfica 3D
● Cámara web
https://www.virtualbox.org/
6
VirtualBox
7
VirtualBox
● Configuración interactiva
● Pasos:
Crear una máquina virtual limpia
●
8
VirtualBox
9
VirtualBox
10
VirtualBox
11
VirtualBox
12
VirtualBox
●
Para parar una VM:
– Simulando el apagado de la máquina física
– Enviado la señal de apagado
– Haciendo que el sistema se pare (o reinicie) a sí mismo
●
sudo poweroff
●
sudo halt
●
sudo shutdown -h now
●
sudo reboot
– Pausando para reanudar después
13
14
Vagrant
https://www.vagrantup.com
15
Vagrant
https://www.vagrantup.com 16
Vagrant
• Instalar Vagrant
– Tener instalador VirtualBox (o cualquiera de los
soportados
– Instalar Vagrant
●
https://www.vagrantup.com/docs/installation/
17
Vagrant
18
Vagrant
19
Vagrant
$ vagrant up
20
Vagrant
21
Vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ exit
22
Vagrant
• Configuración de red en la máquina virtual
Para acceder a la máquina virtual por red se descomenta la
siguiente línea de Vagrantfile
23
Vagrant
24
Vagrant
• Ejecutar una app web dentro de una VM
– Copiar webapp.jar en la carpeta del fichero Vagrantfile
– Iniciar la VM y arrancar la app
$ vagrant up
$ vagrant ssh
ubuntu> sudo add-apt-repository ppa:webupd8team/java
ubuntu> sudo apt-get update
ubuntu> sudo apt-get install oracle-java8-installer
ubuntu> cd /vagrant
ubuntu> java -jar java-webapp-0.0.1.jar
25
Virtualización y
Contenedores Docker
1. Virtualización
2. Docker
3. Docker Compose
26
Docker
27
Docker
https://www.docker.com/
28
Docker
29
Docker
30
Docker
Principales diferencias
31
Docker
32
Docker
33
Docker
34
Docker
•Tipos de aplicaciones:
– Aplicaciones de red:
●
Web, bbdd, colas de mensajes, cachés, etc.
– Aplicaciones de línea de comandos:
●
Compiladores, generadores de sitios web,
conversores de vídeo, generadores de
informes…
36
Docker
• Tipos de aplicaciones:
– Aplicaciones gráficas:
●
Es posible pero no está diseñado para ello
●
Alternativas en linux
https://snapcraft.io/ https://flatpak.org/
37
Docker
38
Conceptos Docker
39
Conceptos Docker
•Imagen docker
– Ficheros a los que tendrá acceso el contenedor
cuando se ejecute.
– Herramientas/librerías de una distribución linux
excepto el kernel (ubuntu, alpine), runtime de
ejecución (Java) y la aplicación en sí (webapp.jar)
– Un contenedor siempre se inicia desde una imagen
– Si se quiere arrancar un contenedor partiendo de
una imagen que no está disponible, se descarga
automáticamente de Internet
40
Conceptos Docker
•Docker Registry
●
Servicio remoto para subir y descargar imágenes
●
Puede guardar varias versiones (tags) de la misma
imagen
●
Las diferentes versiones de una misma imagen se
almacenan en un repositorio (mysql, drupal...)
●
Docker Hub es un registro público y gratuito
gestionado por Docker Inc.
●
Puedes instalar un registro privado
41
Conceptos Docker
•Docker Hub
42
Conceptos Docker
•Docker Hub: Algunos repositorios oficiales
43
Conceptos Docker
• Contenedor Docker
– Representa la aplicación en ejecución
– Un contenedor se crea desde una imagen
– Si la aplicación escribe un fichero, el fichero queda
dentro del contenedor, no se modifica la imagen
– Los contenedores se pueden arrancar, pausar y
parar
– Puede haber varios contenedores ejecutandose a la
vez partiendo desde la misma imagen
44
Conceptos Docker
•Docker Engine
– Proceso encargado de gestionar docker
– Gestiona las imágenes (descarga, creación, subida,
etc...)
– Gestiona los contenedores (arranque, parada, etc..)
– Habitualmente se controla desde el cliente docker por
línea de comandos (aunque también se puede controlar
por API REST)
45
Conceptos Docker
•Docker client
– Herramienta por línea de comandos
(Command line interface, CLI) para controlar
las imágenes y los contenedores
$ docker <params>
46
Instalación de Docker
● Windows:
● Microsoft Windows 10 Professional or Enterprise 64-bit:
https://store.docker.com/editions/community/docker-ce-desktop-windows
● Other Windows versions: https://www.docker.com/products/docker-toolbox
● Linux:
● Ubuntu: https://store.docker.com/editions/community/docker-ce-server-ubuntu
● Fedora: https://store.docker.com/editions/community/docker-ce-server-fedora
● Debian: https://store.docker.com/editions/community/docker-ce-server-debian
● CentOS: https://store.docker.com/editions/community/docker-ce-server-centos
● Mac:
● Apple Mac OS Yosemite 10.10.3 or above:
https://store.docker.com/editions/community/docker-ce-desktop-mac
● Older Mac: https://www.docker.com/products/docker-toolbox
47
Ejecución de contenedores
Ejecutar “hello-world” en un contendor
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete
a3ed95caeb02: Pull complete
Digest:
sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca369
66a7
Status: Downloaded newer image for hello-world:latest
49
Ejecución de contenedores
Inspeccionar los contendores existentes
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6a9d46d0b2f alpine "echo 'hello'" 6 minutes ago Exited (0) 6 minutes ago lonely_kilby
ff0a5c3750b9 alpine "ls -l" 8 minutes ago Exited (0) 8 minutes ago elated_ramanujan
c317d0a9e3d2 hello-world "/hello" 34 seconds ago Exited (0) 34 seconds ago stupefied_mcclintock
50
Imágenes docker
● Para ejecutar un contenedor es necesario tener una
imagen en la máquina
● Las imágenes se descargan de un docker registry
(registro)
● Cada registro tiene un repositorio por cada imagen
con múltiples versiones (tags)
● DockerHub es un registro gratuito en el que
cualquiera puede subir imágenes públicas
51
Imágenes docker
52
Imágenes docker
Inspección de las imágenes descargadas
$ docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
seqvence/static-site latest 92a386b6e686 2 hours ago 190.5 MB
nginx latest af4b3d7d5401 3 hours ago 190.5 MB
python 2.7 1c32174fd534 14 hours ago 676.8 MB
postgres 9.4 88d845ac7a88 14 hours ago 263.6 MB
Containous/traefik latest 27b4e0c6b2fd 4 days ago 20.75 MB
...
53
Imágenes docker
● Tags
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
seqvence/static-site latest 92a386b6e686 2 hours ago 190.5 MB
nginx latest af4b3d7d5401 3 hours ago 190.5 MB
python 2.7 1c32174fd534 14 hours ago 676.8 MB
postgres 9.4 88d845ac7a88 14 hours ago 263.6 MB
Containous/traefik latest 27b4e0c6b2fd 4 days ago 20.75 MB
...
55
Servicios de red
● Servidor web en un contenedor
--name static-site
56
Servicios de red
● Servidor web en un contenedor
-e AUTHOR="Your Name"
-d
Ejecuta el contenedor en segundo plano
(no bloquea la shell durante la ejecución)
58
Servicios de red
● Servidor web en un contenedor
-p 9000:80
Conecta el puerto 9000 del host
al puerto 80 del contenedor
59
Servicios de red
● Usar el servicio
● Abre la URL http://127.0.0.1:9000 en un browser accede al
puerto 80 de la aplicación en el contenedor
60
Servicios de red
● Usar el servicio
● Si tienes Docker Toolbox para Mac o Windows no se puede
usar la IP 127.0.0.1
● Tienes que usar la IP de la máquina virtual en la que se
ejecuta Docker
$ docker-machine ip default
192.168.99.100
Container id es STATUS es UP
a7a0e504ca3e
Este id se usa para
referirte al contenedor
62
Gestión de contenedores
● Logs
● Obtener la salida estándar de un contenedor
63
Gestión de contenedores
64
Gestión de contenedores
$ docker rm -f static-site
65
Servicios de red
● Base de datos MySQL dockerizada
● Arranque contenedor:
https://hub.docker.com/_/mysql/
66
Ejercicio 1
● Ejecuta una web con Drupal en un
contenedor docker
● Revisa la documentación de la página de
DockerHub de Drupal
● Accede al drupal desde un navegador web
67
Volúmenes
● Los contenedores pueden acceder a carpetas y ficheros del
host
● Ejemplos de uso:
● Ficheros de configuración
● Ficheros de entrada y salida (compiladores, servidores web…)
● Carpetas para guardar los datos de una BBDD
● Por cada carpeta del host a la que se quiere acceder, se
configura un volumen, indicando qué carpeta del host es
visible en qué carpeta del contendor
https://docs.docker.com/engine/tutorials/dockervolumes/ 68
Volúmenes
● Configuración de volúmenes al ejecutar un contenedor
https://docs.docker.com/engine/tutorials/dockervolumes/
69
Volúmenes
● Contenedor NGINX
● La imagen oficial del servidor web NGINX puede servir por
http (web) ficheros del host
$ docker run -p 9000:80 -v \
"$PWD":/usr/share/nginx/html:ro -d nginx
71
Configuración de contenedores
● Dependiendo de cómo se haya creado la imagen, un
contenedor puede configurarse de diferentes formas
cuando se ejecuta:
● Sin configuración (ejecución por defecto)
$ docker run <imagen>
72
Configuración de contenedores
● Dependiendo de cómo se haya creado la imagen, un
contenedor puede configurarse de diferentes formas
cuando se ejecuta:
● Parámetros del comando por defecto
$ docker run <imagen> <params>
74
Aplicaciones de consola
● Jekyll
● Descargar contenido de ejemplo
$ git clone https://github.com/henrythemes/jekyll-minimal-theme
$ cd jekyll-minimal-theme
https://hub.docker.com/r/grahamc/jekyll/
76
Ejercicio 2
● Genera el .jar de una aplicación con un
contenedor docker
● Busca una imagen adecuada en Docker Hub (tiene
que tener Maven y un JDK de Java)
● Monta las carpetas adecuadas (para que el
compilador pueda acceder al fuente y para que
pueda generar el binario)
77
Una shell dentro del contenedor
● El uso principal de un contenedor es
empaquetar aplicaciones (de consola o servicio
de red)
● En ocasiones queremos ejecutar comandos de
forma interactiva “dentro del contenedor”
● La mayoría de las imágenes tienen el binario
de una consola (shell): /bin/sh o /bin/bash
(dependiendo de la imagen)
78
Una shell dentro del contenedor
● Shell en un contendor con ubuntu
$ docker run -it ubuntu /bin/sh
# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
# exit
79
Una shell dentro del contenedor
● Shell en un contendor con ubuntu
$ docker exec -it <container_name> /bin/sh
# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
# exit
81
Dockerizar una aplicación
● Para dockerizar una aplicación hay
que crear una imagen docker de la
aplicación
● Crearemos una imagen con una
aplicación web implementada en
Python
● Descarga la web de ejemplo
82
Dockerizar una aplicación
● Python
83
Dockerizar una aplicación
● Dockerfile
● Fichero usado para describir el contenido de una imagen
docker
● Contenido:
84
# Selecciona la imagen base
FROM alpine:latest
# Instala python y pip
RUN apk add --update py-pip
RUN pip install --upgrade pip
85
Dockerizar una aplicación
● Dockerfile
● FROM: Imagen base
● RUN: Ejecuta comandos para instalar y configurar el
software de la imagen
● COPY: Copy ficheros desde la carpeta del Dockerfile
● EXPOSE: Define los puertos públicos
● CMD: Comando por defecto que se ejecuta al arrancar el
contenedor
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
86
Dockerizar una aplicación
● Construir la imagen
● Se puede crear una imagen para que sea usada
únicamente en la máquina que se ha creado
● Lo más habitual es crear una imagen para subirla a
un registro de imágenes (como DockerHub)
● Creamos una cuenta en DockerHub
● Conectamos nuestra máquina a DockerHub
$ docker login
87
Dockerizar una aplicación
● Construir la imagen
● En la carpeta del Dockerfile se ejecuta
$ docker build -t miusuario/webgatos .
imagen
● . es la ruta del Dockerfile
88
Dockerizar una aplicación
● Construir la imagen
● Acciones ejecutadas:
● Se ejecuta un nuevo contenedor partiendo de la
imagen base
● Se ejecutan los comandos (RUN y COPY) del
89
Dockerizar una aplicación
90
Dockerizar una aplicación
● Publicar la imagen
$ docker push miusuario/webgatos
92
Dockerizar una aplicación
van al final
93
# Selecciona la imagen base
FROM alpine:latest
# Instala python y pip
RUN apk add --update py-pip
RUN pip install --upgrade pip
94
# Copia los ficheros de la aplicación
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/
COPY requirements.txt /usr/src/app/
95
Dockerizar una aplicación
● Buenas prácticas del Dockerfile
● Cada comando Dockerfile es una capa:
● Si un comando RUN graba ficheros y el siguiente comando los
borra, los ficheros originales quedan en la imagen (en la capa)
● Se encadenan muchos comandos en un mismo RUN para
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
96
Ejercicio 4
● Crea una imagen docker con una aplicación
web Java
● Basada en una imagen con Maven para poder
compilar la aplicación
97
Ejercicio 5
● Optimiza las capas de la imagen del ejercicio
anterior para no tener que descargar las
dependencias cada vez que se construye la
imagen
● Comandos útiles:
● mvn dependency:go-offline
● mvn -o install
98
Dockerizar una aplicación compilada
99
Dockerizar una aplicación compilada
101
Dockerizar una aplicación compilada
● Dockerizar la aplicación Java
● Hay que crear un nuevo contenedor con Java para poder
ejecutar el .jar (No se necesita maven)
● Hay que copiar el fichero .jar recién creado
102
Dockerizar una aplicación compilada
● Dockerizar la aplicación Java
● Dockerfile
FROM openjdk:8-jre
COPY target/*.jar /usr/app/
WORKDIR /usr/app
CMD [ "java", "-jar", "java-webapp-0.0.1.jar" ]
● Construir el contenedor
$ docker build -t miusuario/java-webapp .
● Ejecutar el contenedor
$ docker run -p 5000:8080 miusuario/java-webapp
103
Dockerizar una aplicación compilada
● Multistage Dockerfile
● Se han realizado dos pasos para dockerizar la aplicación
● Paso 1: Compilar el código fuente y generar el binario usando
un contenedor
● Paso 2: Crear un contenedor con el binario generado
https://docs.docker.com/develop/develop-images/multistage-build/
104
Dockerizar una aplicación compilada
● Multistage Dockerfile
Dockerfile.1
FROM maven as builder
COPY . /code/
WORKDIR /code
RUN mvn package
FROM openjdk:8-jre
COPY --from=builder /code/target/*.jar /usr/app/
WORKDIR /usr/app
CMD [ "java", "-jar", "java-webapp-0.0.1.jar" ]
105
Dockerizar una aplicación compilada
106
Dockerizar una aplicación compilada
107
Ejercicio 6
● Crea un Multistage Docker file optimizando las
capas para no descargar las librerías en cada
construcción
108
Google jib
● Para ciertas aplicaciones de tipos concretos se han
creado herramientas más optimizadas para crear las
imágenes Docker
● jib es un plugin de Maven y Gradle desarrollado por
Google que empaqueta aplicaciones Java
directamente como contenedores Docker (sin pasar
por un .jar)
● Las capas optimizadas para cachear librerías
● Al no generar el .jar envía sólo los .class de la
aplicación
109
Google jib
● jib es un plugin de Maven y Gradle que empaqueta
aplicaciones Java directamente como contenedores Docker
(sin generar el .jar)
● Las capas optimizadas para cachear librerías
● Al no generar el .jar envía sólo los .class de la aplicación
(muy poco tamaño > poco tiempo de transferencia)
● La aplicación arranca
más rápido (exploded jar)
https://github.com/GoogleContainerTools/jib
110
Google jib
● jib no necesita el docker engine para generar las
imágenes Docker, todo lo hace con Java
● Aumenta la seguridad en el entorno de CI porque no
necesita permisos de administración (necesarios
para Docker) para crear una imagen
● La imagen está optimizada para ejecutar
aplicaciones Java (distroless)
https://github.com/GoogleContainerTools/distroless
https://github.com/GoogleContainerTools/jib
111
Google jib
pom.xml
<project>
<groupId>example</groupId>
<artifactId>spring-boot-example</artifactId>
<version>0.1.0</version>
...
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.6.1</version>
</plugin>
</plugins>
</build>
</project>
https://github.com/GoogleContainerTools/jib/blob/master/examples/spring-boot/pom.xml 112
Ejercicio 7
● Crea la imagen de la aplicación Java del
Ejercicio 6 con jib
113
Virtualización y
Contenedores Docker
1. Virtualización
2. Docker
3. Docker Compose
114
Docker Compose
●
Es una herramienta para definir aplicaciones
formadas por varios contenedores
●
Un fichero YAML define los contenedores (imagen,
puertos, volúmenes…) y cómo se relacionan entre sí
●
Los contenedores se comunican:
●
Protocoles de red
●
Volúmenes compartidos
https://docs.docker.com/compose/ 115
Docker Compose
●
La herramienta docker-compose tiene que instalarse por
separado en linux (no viene incluida con docker)
●
El fichero YAML se suele llamar
docker-compose.yml
●
En la carpeta donde está el fichero, la aplicación se ejecuta
con el comando
$ docker-compose up
https://docs.docker.com/compose/install/ 116
Docker Compose
●
Definición de cada contenedor
●
Imagen
●
Puede descargarse de DockerHub
●
Puede estar construida localmente
●
Puede construirse con un Dockerfile en el momento de iniciar
la aplicación
117
Docker Compose
●
Definición de cada contenedor
●
Puertos:
●
Mapeados en el host (para ser usados desde localhost)
●
No mapeados (sólo se pueden conectar otros contenedores)
●
Volúmenes:
●
Carpetas del host accesible desde el contenedor
●
Compartidos entre contenedores (en una carpeta interna de
docker)
118
Docker Compose
●
Ejemplo: App web con BBDD
●
Web con tecnología Python y framework Flask
●
BBDD MongoDB
●
2 Contenedores
http://localhost:5000
Puerto Puerto
5000 27017
Pyhton
MongoDB
Browser Web app
container
container
http://containertutorials.com/docker-compose/flask-mongo-compose.html
119
Docker Compose
●
Ejemplo: App web con BBDD
https://github.com/codeurjc/curso-docker/tree/master/app1-python-mongo
120
Docker Compose app.py
import os
from flask import Flask, redirect, url_for, request, render_template
●
Python from pymongo import MongoClient
app = Flask(__name__)
web app client = MongoClient('db', 27017)
db = client.tododb
@app.route('/')
def todo():
_items = db.tododb.find()
items = [item for item in _items]
return render_template('todo.html', items=items)
@app.route('/new', methods=['POST'])
def new():
item_doc = {
'name': request.form['name'],
'description': request.form['description']
}
db.tododb.insert_one(item_doc)
return redirect(url_for('todo'))
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True)
121
Docker Compose
●
HTML Template
templates/todo.html
<form action="/new" method="POST">
<input type="text" name="name"></input>
<input type="text" name="description"></input>
<input type="submit"></input>
</form>
●
App libraries
requirements.txt
flask
pymongo
122
Docker Compose
●
Dockerfile de la aplicación web
Dockerfile
FROM python:2.7
ADD . /todo
WORKDIR /todo
RUN pip install -r requirements.txt
CMD ["python", "-u", "app.py"]
●
Podemos construir la imagen con este Dockerfile desde línea de
comandos si queremos, pero vamos a usar docker-compose para
que lo haga
123
Docker Compose
●
Fichero docker-compose.yml
Servicios docker-compose.yml
web:
Cada contenedor es build: .
un servicio de la app ports:
- "5000:5000"
La propiedad indica volumes:
el nombre del - .:/todo
servicio links:
- db
Esta app tiene dos db:
servicios: web y db image: mongo:3.0.2
124
Docker Compose
●
Fichero docker-compose.yml
docker-compose.yml
web:
build: .
build
ports:
Se indica la ruta del - "5000:5000"
Dockerfile para construir volumes:
la imagen - .:/todo
links:
- db
db:
image: mongo:3.0.2
125
Docker Compose
●
Fichero docker-compose.yml
docker-compose.yml
web:
build: .
image ports:
- "5000:5000"
Se indica el nombre de la
imagen en Dockerhub o volumes:
en local - .:/todo
links:
- db
db:
image: mongo:3.0.2
126
Docker Compose
●
Fichero docker-compose.yml
docker-compose.yml
web:
build: .
ports ports:
- "5000:5000"
Puertos “bindeados” al
host. Como la opción -p al volumes:
arrancar un contenedor - .:/todo
links:
- db
db:
image: mongo:3.0.2
127
Docker Compose
●
Fichero docker-compose.yml
docker-compose.yml
web:
build: .
volumes ports:
- "5000:5000"
Carpetas del host
accesibles desde el volumes:
contenedor - .:/todo
links:
- db
db:
image: mongo:3.0.2
128
Docker Compose
●
Fichero docker-compose.yml
docker-compose.yml
web:
links build: .
ports:
Permite acceder al
- "5000:5000"
servicio ‘db’ desde el
servicio ‘web’ usando volumes:
como nombre del host - .:/todo
‘db’ links:
- db
db:
image: mongo:3.0.2
129
Docker Compose
●
Arrancar la aplicación
$ docker-compose up
●
Construye la imagen si no está construida ya.
●
Si la imagen está disponible, no se reconstruye aunque cambie el
código o el Dockerfile, es necesario ejecutar docker-compose up --
build
●
Se descarga la imagen de MongoDB si no está en local
●
Inicia los dos contenedores
130
Docker Compose
●
Arrancar la aplicación
●
La app está disponible en http://locahost:5000/
131
Docker Compose
●
¿Cómo funciona?
●
Se muestran los logs de todos los contendores
●
Para parar la app, Ctrl+C en la consola (también docker-
compose stop)
●
Si se para y arranca de nuevo el servicio sin cambiar la
configuración de un contenedor, se vuelve a iniciar el
mismo (no se crea uno nuevo). Los datos de la BBDD no se
pierden porque están dentro del contendor
132
Docker Compose
●
Ideal para desarrollo
●
Podemos definir una app con múltiples contenedores en un
fichero de texto (y subirlo a un repositorio)
●
Cualquier desarrollador puede arrancar la app sin tener nada
instalado en local (sólo docker y docker-compose)
●
Es muy cómodo iniciar y parar todos los servicios a la vez y sólo
cuando realmente se necesitan (no tienen que estar iniciados al
arrancar la app)
●
Todos los logs centralizados
133
Docker Compose
●
Distribución de apps dockerizadas
●
Si todos los contenedores del compose están en
DockerHub, para distribuir una app multicontenedor
dockerizada basta con descargar el docker-compose.yml y
arrancarlo.
●
Con curl disponible y el docker-compose.yml en github:
curl https://raw.githubusercontent.com/phundament/app-tutum/docker-compose.yml \
| docker-compose -f - up -d
134
Ejercicio 7
● Dockeriza la aplicación java-webapp-bbdd
● Enunciado curso-docker/java-webapp-bbdd-enunciado
● Se usará docker-compose
● La aplicación necesita una BBDD MySQL
Password de root: pass
●
135