Docker image pro Spring + Tomcat + PostgreSQL

tdvorak

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #15 kdy: 14. 06. 2018, 06:37:35 »
Ty tvoje rady mi prijdou, jako kdyz zadas problem do Googlu, odcitujes neco z prvni stranky a vyfutrujes to cool klicovejma slovama a technologiema. Uplne ti unika, co se ti tu snazime vysvetlit.

Vy akoze neupdatujete JRE, ci co? Co musite mat pri jave zafixovane? Neviete spustit java8 -jar app.jar alebo java9 -jar app.jar alebo random-java -jar app.jar? Kvoli tomu potrebujete Docker?

Jasne, ze muzes mit vic verzi javy, a muzes tak mit neocekavany chovani v jakykoliv fazi vyvoje. Pokud ale aplikace bezi v dockeru s jasne definovanou verzi, mas jistotu, ze na presne te same verzi to bylo v developmentu, pri testech, na stagingu i v produkci. Mas presne definovane a stabilni prostredi, vsude stejne. Ne podle toho, ktery vyvojar si naposledy updatoval, jak stary debian v produkci a na cem to zrovna spousti QA. 


Alebo viete co, nechajte tak, nubudem vas trapit unikernelmi.

Predpokladam, ze s tim mas bohatou zkusenost. Popis nam prosim trochu, jak a co v tom provozujete. Nebo to byl zas jen dotaz do Googlu, ktery vyplivnul tenhle experimentalni projekt: https://github.com/solo-io/unik/ ?

Spustit na jednom JRE 6 verzii jednej aplikacie nejde? Alebo aj 6 instancii 6 verzii jednej aplikacie na 3 roznych JRE? To je akoze TEN problem?

Jasne ze jde, ale bude to peknej vopruz. Uz jen treba proto, ze pokazdy tu aplikaci budes muset prekonfigurovat, aby poslouchala na jiny sade portu. 

Nebo pokud ta aplikace potrebuje jeste dalsi sluzby, treba elastic, memcached, nejakou MQ, bude to pekny peklo, udrzet vsechno vsude dostupny, spravne nakonfigurovany, ve spravnych verzich. Zatimco s Dockerem to mas jeden Compose file, kde jsou presne definovane sluzby, jejich verze, porty, zavislosti mezi nima. Jeden docker-compose up ti rozjede vsechno driv, nez ty zjistis, jakou verzi JRE vlastne potrebujes a mas nainstalovat.

Huh, nic to. Apache Ignite vam asi nic nehovori.

Tady si nam porad nevysvetlil, jak moc dobrej napad je pustit si jednu instanci embedded databaze v ramci tvy aplikace. Jasne, ze to jde, kdyz neco takovyho potrebujes v testech. Stejne tak, jako ta H2 nebo HSQLDB. Pro produkci to ale asi nebude uplne idealni volba, mit jen jednu embedded instanci, ktera zije a umira zaroven s tvou aplikaci (jedno, jaka DB nebo sluzba). Taky si muzu pribalit jeden Elastic node k aplikaci a pojede to. Ale realne mam cely oddeleny cluster, s nekolika nody, na uplne jinych strojich, nez bezi aplikace. To, ze neco jde, jeste neznamena, ze je to dobry napad.


Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #16 kdy: 14. 06. 2018, 07:51:22 »
Alebo viete co, nechajte tak, nubudem vas trapit unikernelmi.
Nemusíte mít strach – fakt mne netrápí, že pořád melete o věcech, o kterých nic nevíte.

To akoze zoberiem ten linuxovy ELF binar JVMka zabaleny v Docker image, otocim to voci Windows kernelu a pojde to? No neviem, ja som bol v tom, ze aby siel Linuxovy image v Dockeri na Windowse, treba paravirtualizovat Linuxovy kernel cez Hyper-V. To mi teda nepripada ako nenarocna kontajnerova izolacia cez namespace a cgroupy, ale budiz.
Vy jste se ovšem ptal, jestli ten Linuxový image půjde provozovat i pod Windows. A to půjde, jak už jste sám zjistil – a třeba pro vývoj to výkonově bude stačit.

Dik za tip. Citali ste to vyssie? Co keby ste si vy nastudovali ako to funguje?
„Výše“ je předchozí část vašeho komentáře, o způsobu spouštění linuxových Docker kontejnerů na Windows? Tu jsem fakt nečetl dřív, než jste ji napsal. A jak funguje Docker vím a věděl jsem to i před tím, než vy jste začal googlit, abyste zjistil, proč Docker není virtualizace, ale že se jedná o kontejnery.

Vy akoze neupdatujete JRE, ci co?
Já ho updatuju. Ale lidé provozují i Javu i na počítačích, které nespravuju, a provozují tam i jiné aplikace, než ty moje.

Co musite mat pri jave zafixovane?
Třeba verzi JRE (např. kvůli vyhnutí se známým chybám), dodavatele JRE (Oracle/OpenJDK/IBM), ve starších verzí Security Policy, Java extensions, Java agents, národní prostředí, nativní knihovny používané přes JNI…

Neviete spustit java8 -jar app.jar alebo java9 -jar app.jar alebo random-java -jar app.jar?
Viem. A vy si takhle někdy zkuste spustit Maven – java-8 -jar mvn.sh. To se budete divit. Nebo si takhle zkuste spustit Java WebStart aplikaci.

Kvoli tomu potrebujete Docker?
Ne.

Mat JREcko v Dockri dava zmysel?
Ano, perfektní. Porovnejte si třeba instalaci Confluence v porovnání s docker run, porovnejte si instalaci Elasticsearch + LogStash + Kibana s docker-compose up. A pak si to porovnejte, když to budete spouštět na 16 serverech ručně a když to tam spustíte přes Kubernetes.

Spustit na jednom JRE 6 verzii jednej aplikacie nejde? Alebo aj 6 instancii 6 verzii jednej aplikacie na 3 roznych JRE? To je akoze TEN problem?
Docker neřeší nic, co by nešlo jinak. Akorát jsou některé věci podstatně jednodušší.

Navíc Docker podle mého názoru některé věci řeší ne zrovna nejlépe, radši mám třeba rkt. Ale tady šlo o něco úplně jiného –  o to, že jste nechápal, že Spring Boot slouží jenom pro snazší konfiguraci Spring frameworku a přidružených technologií; zatímco Docker slouží pro zabalení celého prostředí aplikace (nejen Javovské) do jednoho balíčku, který je pak možné distribuovat a spouštět na různých prostředích (ať už na bare metal, ve virtuálních strojích nebo v cloudu) a který na rozdíl od jiných způsobů (třeba virtualizace celého OS) řeší oddělení jednotlivých prostředí pouze pomocí linuxových jmenných prostorů, takže je tam minimální overhead (a na druhou stranu to oddělení není úplně dokonalé).

Vy pri buildovani JARka prekompilujete aj bytecode tretich stran ci co?
Ne. A víte vy vůbec, jak vypadá taková Java aplikace? Protože vaše odpověď je poněkud mimoběžná s námitkou, že pod JRE 8 nespustíte aplikaci s bajtkódem zkompilovaným pro Javu 10.

Alebo neviete, co si balite k vasej aplikaci?
Vím. Ale to že to vím nijak nepomáhá tomu, aby někdo spustil pod Javou 8 bajtkód pro Javu 10.

doom

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #17 kdy: 17. 06. 2018, 10:18:08 »
Toto, co chcete, je vyslovene anti-pattern. V image mate mat jeden process, to je presne jeden process, nie dva, nie tri - jeden. Vo vasom pripade je JVMko jeden process a Postgres druhy.

Druhy bod, na ktorom sa vzdy pobavim, je kombinacia Javy a Dockra.... Aky to ma preboha vyznam? Vytvarat virtualizovane prostredie pre uz aj tak vitualny stroj s vlastnou virtualnou instrukcnou sadou, ktory virtualizuje 3/4 OS rozhrani? Dufam, ze aj ten Docker Linux host bezi na VMWare. Videli ste film Inception? Aj v tomto pripade na kazdej urovni bezi cas kusicek pomalsie....

V skratke, Docker pre Javu sa vola Spring Boot, alebo Capsule, pricom ten druhy je polomrtvy projekt, takze plati Docker pre Javu = Spring Boot.
Rozhodne urobite lepsie, ked preportite vas kod na Spring Boot ako ze nabastlite nepodareny shell script, ktory sa v jednom Docker image bude snazit spustit aj JVM aj Postgres.

Istotne viete, ze Spring Boot generuje monolicticky image vsetkych zavislosti, podobne ako Docker, v ktorom vam nastartuje aplikacia, relacna databaza a kompletna AI platforma, MapReduce framework a este aj ten Tomcat....

docker a jeden proces je také anti-pattern :)

Docker není virtualizace, není to další vrstva na překlad, docker je založen na Linux namespaces, což je takové oddělení procesů do vlastních přihrádek. S dockerem je jen problém s iops na disky, to se ale také dá vyřešit přes device.

Použít tohle pro vývoj nemusí být špatné, aspoň má oddělené prostředí od svého a může testovat různé verze sestavení.

Na začátky není vůbec špatné si pohledat na veřejném repositáři, kde máš na proklik i Dockerfile https://hub.docker.com/search/?isAutomated=1&isOfficial=0&page=1&pullCount=0&q=spring&starCount=0, případně zkus vlastní vyhledávací dotaz.

Skoro přesně to co chceš je popsané na blogu dockeru https://blog.docker.com/2017/05/spring-boot-development-docker/ , zkus příště více hledat. Bez angličtiny se moc neobejdeš.

Hladal som, taktiez som pozeral link, lenze ak sa nemylim tam vytvara tych kontainerov viac pomocou docker compose nie? Ja by som to potreboval v jednom, spustil by som nejaky image a nastartovalo by mi vsetko potrebne v jednom kontaineri

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #18 kdy: 17. 06. 2018, 10:55:29 »
Hladal som, taktiez som pozeral link, lenze ak sa nemylim tam vytvara tych kontainerov viac pomocou docker compose nie? Ja by som to potreboval v jednom, spustil by som nejaky image a nastartovalo by mi vsetko potrebne v jednom kontaineri
Tím ale jdete proti základnímu principu Docker kontejnerů, že v každém kontejneru běží jen jedna aplikace. Vzhledem k tomu, na co se ptáte, asi nebudete expert na Docker, takže bych doporučil toho pravidla se držet – má to dobré důvody, a když se tím nebudete řídit, způsobíte si tím jenom komplikace. Pokud je pro vás naopak tak důležité, aby bylo vše v jednom, není asi Docker to správné řešení. Zvážil bych pak třeba virtualizaci, kdy vytvoříte obraz celého operačního systému a spustíte ho třeba pod VMware nebo VirtualBoxem.

doom

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #19 kdy: 17. 06. 2018, 13:15:51 »
Hladal som, taktiez som pozeral link, lenze ak sa nemylim tam vytvara tych kontainerov viac pomocou docker compose nie? Ja by som to potreboval v jednom, spustil by som nejaky image a nastartovalo by mi vsetko potrebne v jednom kontaineri
Tím ale jdete proti základnímu principu Docker kontejnerů, že v každém kontejneru běží jen jedna aplikace. Vzhledem k tomu, na co se ptáte, asi nebudete expert na Docker, takže bych doporučil toho pravidla se držet – má to dobré důvody, a když se tím nebudete řídit, způsobíte si tím jenom komplikace. Pokud je pro vás naopak tak důležité, aby bylo vše v jednom, není asi Docker to správné řešení. Zvážil bych pak třeba virtualizaci, kdy vytvoříte obraz celého operačního systému a spustíte ho třeba pod VMware nebo VirtualBoxem.

Tak jsem to skusil s docker-compose, aplikace nenastartovala, tak som se podival cez command docker logs to container s tomcatom a nasiel som tuto exception:
Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

Nevite co s tym? port mam definovany v compose file takto
Kód: [Vybrat]
  db:
    image: postgres:9.5-alpine
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: mydb
    ports:
      - '5432:5432'

 a url v springovske aplikaci na db takto:
Kód: [Vybrat]
jdbc:postgresql://localhost/db


Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #20 kdy: 17. 06. 2018, 13:49:06 »
Z toho kontejneru Tomcatu se k databázi určitě nebudete připojovat na localhost, ale na název, který Docker vystaví pro ten kontejner s databází. Službu databáze máte pojmenovanou jako db, takže jestli se nepletu, u té java palikace pak musíte v Docker-compose uvést
Kód: [Vybrat]
depends_on:
      - db
a k databázi pak budete přistupovat přes jdbc:postgresql://db/jmeno-databaze.