Week6 - noramehesz/gyak GitHub Wiki
AWS
A feladat végrehajtásának első lépésében regisztráltam AWS-re.
A eheti feladat elvégzéséhez szükség volt egy olyan alkalmazásra, ami porton hallgatózik, ehhez az egyik lehetőség egy Spring Boot app. Ehhez először leszedtem egy STS IDE-t, majd innen pedig generáltattam egy projektet az alábbi beállításokkal :
- maven project
- java
- 2.1.0
- search for dependencies: web, devtools
A többi beállítást változatlanul hagytam. A letöltött projektet beimportáltam az STS-be. A java osztályt kiegészítettem, hogy a localhost-on egy Hello-t írjon ki nekem, ha eindítom.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class DemoApplication {
@RequestMapping("/")
public String home() {
return "Hello";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Az elején volt egy olyan problémám, hogy a 8080-as portot használta valami. Ezt szabaddá akartam tenni, amit úgy oldattam meg, hogy az alábbi paranccal megkerestem , hogy ki használja:
netstat -ano | findstr 8080
A legjobboldali oszlop volt a PID-je annak, ami hasznája, a task manager-ben kikerestem ezt és leállítottam. Ezután ezzel már nem volt probléma , a localhost-on szépen kiírta a várt Hello-t.
Volt erre megoldásként még egy olyan javaslat stackoverflow-n, hogy a skype is várhat ezen a proton bármit, és ezt annak a beállításain belül ki lehetett kapcsolani, amit megtettem, de ez nem segített.
Ezek után a Jenkinst dockeren keresztül futtattam, annak a 8. build-je sikeres is lett
Itt csak a maven miatt voltak problémák, de azokat könnyen ki lehetett küszöbölni.
Ezek után szerettem volna a projektemből egy docker image-t készíteni és azt futtatni. Többféle Dockerfile-t is írtam, a build mindig sikeres volt.
Dockerfile1.0:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Dockefile2.0:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD spring.jar target/app.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","target/app.jar"]
Dockerfile3.0:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD spring.jar target/app.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
Dockerfile4.0:
FROM openjdk:8-jdk-alpine
EXPOSE 8080
ADD spring.jar spring.jar
ENTRYPOINT ["java", "-jar", "spring.jar"]
De a run egyikkel sem jó.
docker run springdemo
Error: Invalid or corrupt jarfile target/app.jar
docker run -p 8080:8080 springdemo
Itt meg foglalt a port.
Innen nem jutottam tovább, az első error az amire megoldást kerestem, de eddig nem találtam. Azt a portot meg semmi nem használja.
Végső megoldásként, amivel siekrrel jártam átírtam a dockerfile-t , és a tomcat-t a default 8080-as portról átírtam a 9000es portra. DOCKERFILE:
FROM java:8
WORKDIR /
ADD target/demo-0.0.1-SNAPSHOT.jar demo.jar
EXPOSE 9000
ENTRYPOINT ["java","-jar","demo.jar"]
A port átírása csak egy sort vett igénybe az application.properties-ben:
server.port=9000
Így már sikerült docker build-re elkészítei az imaget, a maven-es build és sikeres volt. Docker run paranccsal pedig a localhost:9000-en meg is tekinthettem a várt 'Hello'-t. Ezutá kellett dockerhub-ra felpush-olni, amihez az alábbi 2 parancsot használtam:
tag my_image $DOCKER_ID_USER/my_image
push $DOCKER_ID_USER/my_image
Így a DockerHub felhasználómnál webes felületről sem volt szükség arra, hogy külön létrehozzak egy repo-t , mert ez megtette helyettem.
Ezek után kellett az AWS-en egy Elasti Beanstalk app-ot létrehozni. Az alábbi videót használtam fel hozzá. Ez alapján elkészítettem a megfelelő json file-t , melynek tartalma az alábbi:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "noramehesz/stsmavendemo"
},
"Ports": [
{"ContanierPort": "9000"}
]
}
Viszont ennél tovább nem jutottam. A file felltöltésekor hibát kaptam, konkrétan ezt:
Fogalmam sincs mi lehett a probléma, először annyit csináltam, hogy minden előről kezdtem, minden kiszedtem a image-k közül és az összes konténert leállítottam, újra build-elem, újra feltettem dockerhub-ra, onnan újra EB-re, de mindig, minden alkalommal ugyenzt kaptam.
További linkek:
https://www.infoq.com/articles/microframeworks1-spring-boot