Docker Exercicis

1. Hello Docker

En aquest exercici s'han de generar dos imatges Docker per a executar un programa Java. A continuació es donen les instruccions per a compilar el codi, generar un JAR a partir del codi compilat, i executar el JAR.

Arxiu de codi font:

hellodocker/src/Main.java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter your name: "); String name = scanner.nextLine(); System.out.println("Hello " + name); } }

Compilar el codi font:

hellodocker/ javac -d ./build src/Main.java

Generar l'arxiu jar:

hellodocker/build/ jar cfe hellodocker.jar Main Main.class

Executar l'arxiu jar:

hellodocker/build/ java -jar hellodocker.jar

a) Crea una imatge docker amb el codi font, que el compile, l'empaquete i l'execute.

Completa el següent Dockerfile:

hellodocker/Dockerfile FROM eclipse-temurin:11 COPY # copiar el codi font WORKDIR # canviar al directori de compilacio RUN # compilar el codi WORKDIR # canviar el directori de build RUN # generar el jar CMD # indicar la comanda a executar per els contenidors

Crea una imatge a partir del Dockerfile.

El contenidor s'ha de llançar amb l'opció -it (interactive):

docker run -it hellodocker-image

b) Crea una imatge docker multi-stage build.

En el primer stage s'ha de copiar el codi, compilar-lo i generar el JAR.

El segon stage copiarà el JAR del primer stage, i definirà el CMD.

hellodocker/Dockerfile FROM eclipse-temurin:11 as builder COPY # copiar el codi WORKDIR # canviar el directori de compilacio RUN # compilar el codi WORKDIR # canviar al directori build RUN # generar el jar FROM eclipse-temurin:11 WORKDIR # establir el directori d'execució COPY # copiar l'arxiu jar des de l'stage anterior CMD # indicar la comanda a executar per els contendiors

c) Crea un arxiu Docker Compose per a llançar un contenidor amb la imatge.

Si la imatge no existeix, compose l'ha de generar automàticament utilitzant l'arxiu Dockerfile anterior.

hellodocker/docker-compose.yml version: "3.8" services: hellodocker: # especifica el directori (context) on es troba el Dockerfile # especifica la imatge a utilitzar stdin_open: true # docker run -i tty: true # docker run -t

El contenidor s'ha de llançar amb aquesta ordre:

docker compose run hellodocker

2. Laberint Gradle

En aquest exercici el programa Java a depén d'una llibreria externa. Utilitzarem gradle per a descarregar la llibreria, compilar i generar el JAR.

El codi font és aquest:

laberint/app/src/main/java/Main.java import com.github.gerardfp.MazeGenerator; public class Main { public static void main(String[] args) { System.out.println(MazeGenerator.generateMaze(30)); } }

Com pots observar, el programa importa la llibreria externa MazeGenerator (https://github.com/gerardfp/maze-generator).

Podem utlitzar Gradle per a que descarregui automàticament la llibreria:

laberint/app/build.gradle plugins { id 'java' } repositories { maven { url 'https://jitpack.io' } } dependencies { implementation 'com.github.gerardfp:maze-generator:8.0' } jar { manifest { attributes('Main-Class': 'Main') } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } }

Hem afegit ademés a l'arxiu build.gradle les instruccions per a generar el jar. Aquest JAR inclourà tant el programa com la llibreria.

a) Crea una imatge per a executar l'aplicació.

Utilitza la imatge base gradle:jdk11 (https://hub.docker.com/_/gradle)

laberint/Dockerfile FROM # imatge base COPY # copia el codi font WORKDIR /app RUN gradle build CMD # executa l'arxiu que ha generat gradle: /app/build/libs/app.jar

b) Crea una imatge multi-stage per a executar l'aplicació.

3. Nano tasks

El següent programa consisteix en un senzill gestor de taskes. L'aplicació permet afegir tasques i veure-les:

== WELCOME TO NANO TASKS == 1. Add task 2. View tasks Select option: 1 Task description: Comprar el pa Task added. == WELCOME TO NANO TASKS == 1. Add task 2. View tasks Select option: 2 Task List --------- Comprar el pa == WELCOME TO NANO TASKS == 1. Add task 2. View tasks Select option:

Desenvoluparem l'aplicació amb una arquitectura client-servidor.

Per un costat hi ha un programa que fa de servidor, i per l'altre un programa client que connecta al servidor:

Per a desenvolupar el servidor utilitza aquesta llibreria: https://github.com/gerardfp/nano-server

Per a desenvolupar el client utilitza aquesta: https://github.com/gerardfp/nano-client

a) Crea una imatge multi-stage de l'aplicació servidor

Pots utilitzar aquest Dockerfile

FROM gradle:jdk11 AS build COPY . /app WORKDIR /app RUN gradle build --no-daemon FROM eclipse-temurin:11 RUN mkdir /app COPY --from=build /app/build/libs/*.jar /app/my-server.jar ENTRYPOINT ["java", "-jar","/app/my-server.jar"]

Posa en marxa aquesta imatge per a desenvolupar el client.

b) Desenvolupa l'aplicació client i crea una imatge multi-stage de l'aplicació client

c) Crea un Docker Compose per a posar en marxa els dos serveis (client i servidor).

L'arxiu on guarda les tasques el servidor ha de persistir quan s'elimini el seu contenidor.

nano-tasks/docker-compose.yml version: "3.8" services: server: # server options client: # client options

Posa en marxa l'aplicació amb la comanda:

docker compose run client

4. Raw Password

Never do this at home. Els passwords sempre s'han de passar hashed and salted.

Utilitza la llibreria https://github.com/gerardfp/nano-server per a programar un servei web protegit amb un password.

Quan es fa una petició al servei aquest ha de retornar "Welcome" si se li passa el password correcte, i "Access denied" en cas contrari.

Per exemple, si el password és admin123:

a) Crea un docker-compose per a llançar l'aplicació.

El password a utilitzar s'haurà de definir com a variable d'entorn en l'arxiu docker-compose.

Per a agafar la variable d'entorn PASSWORD des de codi Java pots utilitzar:

System.getenv("PASSWORD")

Per a passar el password a l'aplicació com a variable d'entorn des de l'arxiu docker-compose, utilitza la directiva environment

5. Postgres Things

Aquesta aplicació Java de consola utilitza una base de dades Postgres per a emmagatzemar ...coses

Està conformada per dos serveis:

Pots obtenir el codi de l'aplicació clonant aquest repositori: https://github.com/gerardfp/postgres-things

a) Un cop clonat el repositori, crea un arxiu docker-compose.yml amb les opcions per a posar en marxa la app (en mode development).

A l'arxiu docker-compose.yml defineix dos serveis:

Posa en marxa l'aplicació amb la comanda:

docker compose run app_container

b) Modifica l'aplicació Java per a que afagi de les variables d'entorn l'usuari, el password i el nom de la base de dades.

6. LEMP foro

LAMP és el clàssic stack per a aplicacions web: Linux + Apache + MySQL + PHP, tot i que en els darrers anys ha sigut habitual canviar Apache per Nginx, i mod-php per php-fpm. Aquest stack se l'ha anomenat LEMP.

Aquest repositori https://github.com/gerardfp/lemp-foro conté una aplicació LEMP que consisteix en un fòrum de discussions.

a) Clona el repositori i crea un arxiu docker-compose.yml amb les opcions per a posar en marxa la app (en mode development).

A l'arxiu docker-compose.yml defineix tres serveis:

Posa en marxa l'aplicació amb la comanda:

docker compose up

7. Extagram PHP

Aquesta aplicació és una espècie de clon de Instagram, desenvolupada sobre el LEMP stack.

Trobaràs el codi en aquest repositori: https://github.com/gerardfp/extagram_php

Està formada per 6 contenidors:

a) Clona el repositori i crea un arxiu docker-compose.yml amb les opcions per a posar en marxa la app (en mode development, és a dir, amb el codi enllaçat als contenidors, no copiat a les imatges).

Posa en marxa l'aplicació amb la comanda:

docker compose up

b) Crea un docker-compose-production.yml amb les opcions per a posar en marxa la app (en mode production, és a dir, amb el codi copiat a les imatges).

Posa en marxa l'aplicació amb la comanda:

docker compose -f docker-compose-production.yml up

8. Svelte countries

In progress...

9. Python REST API

In progress...

10. Extagram SpringBoot

In progress...