"Build, Ship and Run. Any application, Anywhere"
Alberto Molina Coballes, José Luis Rodríguez Rodríguez and José Domingo Muñoz Rodríguez
Cloud Computing in European schools. Project: 2017-1-ES01-KA202-038471
Theme by: reveal.js
En este ejemplo vamos a desarrollar una página web que va a ser servida por un servidor web que se ejecutará en un contenedor Docker.
Por lo tanto lo primero que debemos hacer es crear nuestra página web:
$ cd public_html
echo "<h1>Prueba</h1>" > index.html
Utilizando un fichero Dockerfile
definimos como vamos a crear nuestra imagen:
Dockerfile
FROM debian
RUN apt-get update -y && apt-get install -y \
apache2 \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY ./public_html /var/www/html/
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Podríamos usar una imagen base con apache2 ya instalado:
FROM httpd:2.4
COPY ./public_html /usr/local/apache2/htdocs/
Creamos nuestra imagen, desde el directorio donde tenemos el Dockerfile
, ejecutamos:
$ docker build -t josedom24/aplicacionweb:v1 .
Sending build context to Docker daemon 3.584kB
Step 1/4 : FROM debian
---> be2868bebaba
Step 2/4 : RUN apt-get update -y && apt-get install -y apache2 & apt-get clean && rm -rf /var/lib/apt/lists/*
...
Successfully built 518871c9fc0c
Successfully tagged josedom24/aplicacionweb:v1
Podemos comprobar que en nuestro entorno local tenemos la imagen que acabamos de crear:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
josedom24/aplicacionweb v1 b2e0df215145 7 seconds ago 204MB
debian latest be2868bebaba 10 days ago 101MB
Creamos un contenedor en nuestro entorno de desarrollo:
$ docker run --name aplweb -d -p 80:80 josedom24/aplicacionweb:v1
fbdd73529e2bb2d9ee9c6415031513741688e6d38509572251f5b624ed7dc23f
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbdd73529e2b josedom24/aplicacionweb:v1 "/usr/sbin/apache2ct…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp aplweb
Probamos nuestra aplicación:
Vamos a subir nuestra imagen al registro Docker Hub:
$ docker login
...
$ docker push josedom24/aplicacionweb:v1
The push refers to repository [docker.io/josedom24/aplicacionweb]
ac126159496f: Pushed
cc15ec5f0c43: Pushed
...
Comprobamos que está subida al repositorio:
$ docker search josedom24/aplicacionweb
NAME DESCRIPTION...
josedom24/aplicacionweb:v1
En el el entorno de producción, bajamos la imagen de Docker Hub y creamos el contenedor:
$ docker pull josedom24/aplicacionweb:v1
v1: Pulling from josedom24/aplicacionweb
9a029d5ca5bb: Pull complete
...
$ docker run --name aplweb_prod -d -p 80:80 josedom24/aplicacionweb:v1
Al modificar el código de la aplicación tenemos que generar una nueva imagen.
$ cd public_html
echo "<h1>Prueba 2</h1>" > index.html
$ docker build -t josedom24/aplicacionweb:v2 .
Podemos probarla en el entorno de desarrollo, eliminando el contenedor anterior:
$ doker container rm -f aplweb
$ docker run --name aplweb2 -d -p 80:80 josedom24/aplicacionweb:v2
Subimos la nueva versión de la aplicación. En el entorno de producción: bajamos la nueva versión, eliminamos el contenedor de la versión antigua y creamos un nuevo contenedor con la nueva imagen:
$ docker push josedom24/aplicacionweb:v1
...
En producción:
$ docker pull josedom24/aplicacionweb:v2
...
$ doker container rm -f aplweb_prod
$ docker run --name aplweb2_prod -d -p 80:80 josedom24/aplicacionweb:v2
Contenedor con mysql. guardamos la información de la base de datos en un volumen persistente:
$ docker run --name some-mysql \
-v /opt/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=asdasd \
-d mysql
Comprobamos que se ha guardado la BD en el host:
/opt/mysql$ ls
ibdata1 ib_logfile0 ib_logfile1 ibtmp1 #innodb_temp mysql mysql.ibd undo_001 undo_002
$ docker exec -it some-mysql bash
root@75544a024f9b:/# mysql -u root -p -h localhost
...
create database dbtest;
Query OK, 1 row affected (0.07 sec)
Nuestro contenedor falla!!!
$ docker container rm -f some-mysql
$ docker run --name some-mysql2 \
-v /opt/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=asdasd \
-d mysql
$ docker exec -it some-mysql2 bash
root@878f77d80fcf:/# mysql -u root -p -h localhost
...
show databases;
...
| dbtest |
...