# Lab 8 - Docker - Creating an image
###### tags: `LAB`
>**Note:** This lab is based on [Docker Tutorials and Labs](https://github.com/docker/labs/blob/master/beginner/chapters/webapps.md#23-create-your-first-image).
:::info
Podeis utilizar Docker en vuestra maquina instalandolo siguendo las indicaciones que están aqui: https://docs.docker.com/get-docker/
O utilizar la maquina virtual que està en [Poliformat/RSE: Recursos/Laboratorio/código practicas laboratorio](https://poliformat.upv.es/x/1J91ll)
O online: https://labs.play-with-docker.com/#
:::
:::info
**All the code necessary for this Lab session is available in [Poliformat/RSE: Recursos/Laboratorio/código practicas laboratorio](https://poliformat.upv.es/x/1J91ll)**, or here: https://bit.ly/codigoRSE2021
:::
## STEP 1: creating a web page using Flask
The goal of this block is to create a Docker image which will run a [Flask](http://flask.pocoo.org) app that displays a random pizza `.gif` every time it is loaded.
We'll do this by first pulling together the components for a _random pizza picture generator_ built with Python Flask, then _dockerizing_ it by writing a _Dockerfile_. Finally, we'll build the image, and then run it.
We need the following three files:
- `app.py`
- `templates/index.html`
- `Dockerfile`
The files can be found in the [repository in POLIFORMAT]( https://bit.ly/codigoRSE2021) as indicated above.
:::danger
1.- Describe linea por linea el contenido del fichero `Dockerfile`
Apunta el resultado en el documento a entregar.
:::
### Build the image
The `docker build` command does the heavy-lifting of creating a docker image from a `Dockerfile`.
When you run the `docker build` command given below, **make sure to replace `<YOUR_USERNAME>` with your Docker username,** the one you used when registering on [Docker Hub](https://cloud.docker.com). **(If you havent registered yet... do it now.)**
The `docker build` command is quite simple - it takes an optional tag name with the `-t` flag, and the location of the directory containing the `Dockerfile` - the `.` indicates the current directory:
```bash
$ docker build -t <YOUR_USERNAME>/myfirstapp .
```
the generated output should be something similar to:
```bash
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 588B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 2.2s
=> [auth] library/alpine:pull token for registry-1.docker.io 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 2.56kB 0.0s
=> [1/6] FROM docker.io/library/alpine@sha256:a75afd8b57e7f34e4dad8d65e2c 0.7s
=> => resolve docker.io/library/alpine@sha256:a75afd8b57e7f34e4dad8d65e2c 0.0s
=> => sha256:4661fb57f7890b9145907a1fe2555091d333ff3d28db86c3 528B / 528B 0.0s
=> => sha256:28f6e27057430ed2a40dbdd50d2736a3f0a295924016 1.47kB / 1.47kB 0.0s
=> => sha256:ba3557a56b150f9b813f9d02274d62914fd8fce120dd 2.81MB / 2.81MB 0.5s
=> => sha256:a75afd8b57e7f34e4dad8d65e2c7ba2e1975c795ce1e 1.64kB / 1.64kB 0.0s
=> => extracting sha256:ba3557a56b150f9b813f9d02274d62914fd8fce120dd374d9 0.2s
=> [2/6] RUN apk add --update py3-pip 4.2s
=> [3/6] RUN pip install --upgrade pip 3.0s
=> [4/6] RUN pip install -U Flask 2.2s
=> [5/6] COPY app.py /usr/src/app/ 0.0s
=> [6/6] COPY templates/index.html /usr/src/app/templates/ 0.0s
=> exporting to image 0.6s
...
Successfully built 2f7357a0805d
```
If everything went well, your image should be ready! Run:
```$ docker image ls```
and see if your image (`<YOUR_USERNAME>/myfirstapp`) shows.
### Run your image
The next step in this section is to run the image and see if it actually works.
```bash
$ docker run -p 8888:5000 --name myfirstapp YOUR_USERNAME/myfirstapp
```
:::danger
2.- Explica cual es el suo del parametro -p 8888:5000
Apunta el resultado en el documento a entregar.
:::
Open a browser with the URL `http://localhost:8888` and your app should be live.
Hit the Refresh button in the web browser to see a few more pizza images.
### Push your image
Now that you've created and tested your image, you can push it to [Docker Hub](https://cloud.docker.com).
First you have to login to your Docker Cloud account, to do that:
```bash
$ docker login
```
Enter `YOUR_USERNAME` and `password` when prompted.
Now all you have to do is:
```bash
$ docker push YOUR_USERNAME/myfirstapp
```
:::danger
3.- Apunta el nombre completo de tu imagen en el documento a entregar.
:::
## STEP 2: creating an image of a generic MQTT consumer
:::danger
4.- Tienes que crear el Dockerfile necesario para implementar un subscriber al broker `broker.hivemq.com` para los mensajes con topic `test/#`.
Como imagen base puedes utilizar `alpine` y como codigo python base para el subscriber puedes reutilizar el `sisub.py` de las sesiones de IoT .
Su ejecución tiene que dar algo asi:
```
$ docker run -it YOUR_USERNAME/thesub
('Connected to ', 'broker.hivemq.com', 'port: ', 1883)
('Flags: ', {'session present': 0}, 'returned code: ', 0)
sisub: msg received with topic: test/point and payload: 0.0
sisub: msg received with topic: test/esp/j4y0m2/Long and payload: 0.0000000
sisub: msg received with topic: test/1 and payload: test-one
sisub: msg received with topic: test/esp/j4y0m2/LAT and payload: 0.0000000
...
```
En el documento a entregar tienes que adjuntar:
1. el fichero `Dockerfile,
2. el fichero python del subscriber, y
3. el nombre de la imagen que has subido al Docker hub
:::