Docker image pro Spring + Tomcat + PostgreSQL

doom

Docker image pro Spring + Tomcat + PostgreSQL
« kdy: 12. 06. 2018, 18:01:38 »
Zdar, potrebuju udelat docker image, ktorej bude obsahovat spring aplikaci (ne boot), ktera pobezi v tomcate s vyuzitim postgre databazy. S dockerem teprv zacinam, tak bych vas chctel poprosit, jestli jste nekdo neco podobneho resil, a neposkytnul dockfile, nebo nejaku radu jak to udelat? Jestli se ptam na blbost tak se omlouvam, je to pro me nove. Dekuji.


uuuuuuuu

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #1 kdy: 12. 06. 2018, 18:29:29 »
Db bych dovnitr dockeru nedaval.
Obzvalste ne velkou db.

doom

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #2 kdy: 12. 06. 2018, 19:06:45 »
Db bych dovnitr dockeru nedaval.
Obzvalste ne velkou db.


jenom testovaci pro vyvoj

pecrom

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #3 kdy: 12. 06. 2018, 19:09:26 »
sel bych asi cestou docker compose - jednu servisu dat jako postgres a druhou dockerfile a v nem tomcat s tou springovou apkou

kimec

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #4 kdy: 12. 06. 2018, 20:00:03 »
Zdar, potrebuju udelat docker image, ktorej bude obsahovat spring aplikaci (ne boot), ktera pobezi v tomcate s vyuzitim postgre databazy. S dockerem teprv zacinam, tak bych vas chctel poprosit, jestli jste nekdo neco podobneho resil, a neposkytnul dockfile, nebo nejaku radu jak to udelat? Jestli se ptam na blbost tak se omlouvam, je to pro me nove. Dekuji.
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....


Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #5 kdy: 12. 06. 2018, 21:42:19 »
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š.


tdvorak

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #6 kdy: 13. 06. 2018, 08:48:40 »
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....

Huh, co to? Jasne, Spring Boot si pribali do jaru nejaky aplikacni kontejner a je tak primo spustitelny nad JVM. Ale tvrdit, ze nahradi Docker, databazi, umelou inteligenci a kdovi co vsechno je hodne nadsazene. Porad je treba resit nejak databazi a pripojeni k ni (nechcete nechat bezet realnou aplikaci nad H2 nebo HSQLDB, ze ne?). Porad je treba resit JVM.

Z meho pohledu naopak Spring Boot aplikace dobre pasuje do Docker ekosystemu - mate jeden spustitelny jar, ten nakopirujete do Docker image, ktery uz obsahuje JVM a jednoduse jej spustite. Porad ale mate nekde externi databazi, ke ktere se aplikace pripoji (alespon pokud nejde jen o test nebo hobby projekt). 

kimec

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #7 kdy: 13. 06. 2018, 12:22:40 »
docker a jeden proces je také anti-pattern :)
Fakt? No toto mi musite vysvetlit. Vo vasom image bezi aj cely init system? Postgres bude spawnovat JVMko ako podproces? Ci ako ste to mysleli?

kimec

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #8 kdy: 13. 06. 2018, 12:48:45 »
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....
Huh, co to? Jasne, Spring Boot si pribali do jaru nejaky aplikacni kontejner a je tak primo spustitelny nad JVM. Ale tvrdit, ze nahradi Docker, databazi, umelou inteligenci a kdovi co vsechno je hodne nadsazene. Porad je treba resit nejak databazi a pripojeni k ni (nechcete nechat bezet realnou aplikaci nad H2 nebo HSQLDB, ze ne?). Porad je treba resit JVM.
Huh, nic to. Apache Ignite vam asi nic nehovori. To ze vy si to neviete predstavit neznamena, ze vsetci budu cakat, kym si to predstavit budete vediet a potom to zacnu robit.

Apropo, to ste si ozaj mysleli, ze vsetko, co Spring Boot robi je, ze pribali aplikacny kontajner? Technicky nemusite mat ziaden aplikacny kontajner. Radsej si precitajte, co ten Spring Boot vlastne robi.

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #9 kdy: 13. 06. 2018, 13:32:51 »
Radsej si precitajte, co ten Spring Boot vlastne robi.
Doporučil bych vám to samé… Spring Boot usnadňuje konfiguraci Spring frameworku a ostatních springovských komponent. To je vše. Tvrdit, že je to Docker pro Javu, je totálně mimo.

Docker pro Javu má úplně stejný význam, jako Docker pro jakoukoli jinou aplikaci. Máte prostě jasně definované prostředí, bez ohledu na systém okolo. Když máte aplikaci otestovanou se standardním Java 9 JRE od Oraclu, vytvoříte si image, kde je tohle prostředí, a nemusí vás zajímat, že se to bude spouštět na počítači, kde není vůbec žádná Java, nebo je tam OpenJDK 7 s knihovnami nainstalovanými v lib/ext, protože to tak potřebuje nějaká jiná aplikace, která tam běží.

kimec

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #10 kdy: 13. 06. 2018, 16:29:04 »
Radsej si precitajte, co ten Spring Boot vlastne robi.
Doporučil bych vám to samé… Spring Boot usnadňuje konfiguraci Spring frameworku a ostatních springovských komponent. To je vše. Tvrdit, že je to Docker pro Javu, je totálně mimo.

Docker pro Javu má úplně stejný význam, jako Docker pro jakoukoli jinou aplikaci. Máte prostě jasně definované prostředí, bez ohledu na systém okolo. Když máte aplikaci otestovanou se standardním Java 9 JRE od Oraclu, vytvoříte si image, kde je tohle prostředí, a nemusí vás zajímat, že se to bude spouštět na počítači, kde není vůbec žádná Java, nebo je tam OpenJDK 7 s knihovnami nainstalovanými v lib/ext, protože to tak potřebuje nějaká jiná aplikace, která tam běží.

Docker pro Javu má úplně stejný význam, jako Docker pro jakoukoli jinou aplikaci.
Problem asi bude v tom, ze JRE nie je aplikacia, ale runtime s virtualizovanou spravou pamate, vlakien, IO atd.

Este ked ten vas linuxovy docker image pofici na windowse tak bude super.

Viete, to Spring Boot monoliticke jarko vam pojde aj na Windowse aj na Linuxe, staci ked ho nezabalite do docker image pre Linux...

Neviem o tom, ze by ste nemohli mat trebars 6 roznych JRE od 3 roznych vendorov vedla seba na jednom OS. Vy ano?

Mozete mat 6 docker verzii vedla seba? A take ze Windowsovy docker na Linuxe? To este pojde bez paravirtualizacie alebo full HW virtualizacie?

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #11 kdy: 13. 06. 2018, 16:48:59 »
Problem asi bude v tom, ze JRE nie je aplikacia, ale runtime s virtualizovanou spravou pamate, vlakien, IO atd.
Což je aplikace. Z pohledu operačního systému se běžící JVM nijak neliší od vimu, LibreOffice nebo Apache.

Este ked ten vas linuxovy docker image pofici na windowse tak bude super.
Pofičí, jmenuje se to Docker for Windows.

Viete, to Spring Boot monoliticke jarko vam pojde aj na Windowse aj na Linuxe, staci ked ho nezabalite do docker image pre Linux...
Pojede na Windows, kde není nainstalované JRE? To bych chtěl vidět. Nebo když budu mít to monolitické JARko přeložené pro Javu 9 a na cílovém systému bude jen Java 8.

Neviem o tom, ze by ste nemohli mat trebars 6 roznych JRE od 3 roznych vendorov vedla seba na jednom OS. Vy ano?
A pak musíte vždy při spuštění uvádět přesnou cestu k JRE, hlídat, aby vám příslušné JRE neodinstalovala aktualizace, a pokud příslušná aplikace sama spouští JRE (třeba Maven), musíte ještě přímo té aplikaci nastavit, které přesně JRE má spustit… Jistě že to jde, ale je to komplikované. Docker slouží právě k tomu, že máte prostředí zafixované (takže nemusíte zkoumat, zda je tam správná verze toho a toho), a že je to prostředí izolované (takže vás nemusí zajímat, co potřebují jiné aplikace, protože to neovlivní vaše prostředí).


Mozete mat 6 docker verzii vedla seba?
Mít 6 verzí Dockeru vedle sebe nedává moc smysl. Ale spustit pod jedním Dockerem 6 verzí jedné aplikace, nebo klidně 6 instancí jedné verze aplikace, to smysl dává, a je to jeden z důvodů, proč se Docker používá.

A take ze Windowsovy docker na Linuxe?
Proč takovou hloupost, když mám na Linuxu linuxový Docker?

To este pojde bez paravirtualizacie alebo full HW virtualizacie?
Nepůjde. Docker s virtualizací nijak nesouvisí, Docker jsou kontejnery. Tak abyste si k tomu Spring Bootu ještě nastudoval, co je Docker…

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #12 kdy: 13. 06. 2018, 18:55:11 »
Radsej si precitajte, co ten Spring Boot vlastne robi.
???
Obrušte si prosím ego do přijatelného tvaru a velkosti.

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #13 kdy: 13. 06. 2018, 22:04:00 »
docker a jeden proces je také anti-pattern :)
Fakt? No toto mi musite vysvetlit. Vo vasom image bezi aj cely init system? Postgres bude spawnovat JVMko ako podproces? Ci ako ste to mysleli?

Co znamená "jeden proces" ve světě linuxu? Existuje minimum aplikací, které běží v jednom procesu a je naprosto běžné, že si aplikace zakládají spousty thready či podprocesů a proces s pid 1 má určitá specifika, které i tak musí aplikace dodržovat, ani blbé JVM se nechová v pořádku.

Rád používám odlehčený supervisord nebo https://github.com/krallin/tini, všechny kontejnery aspoň mají pak jednotné chování, jednotný sběr a formát logů a není v tom taková zoo. Mít tam potom více služeb spolu, které spolu úzce souvisí pro vývoj není vůbec špatné.

Důvod proč tohle pravidlo vzniklo je nasnadě, docker má ulehčit správu produkčních serverů, má to být lego, kde mohu libovolný kontejner spustit na libovolném stroji a měnit to dle potřeb aplikací. Pokud v jednom kontejneru spustím více různých služeb, trochu tím tohle lego porušuji. To je doktrína autorů, kterou z počátku drželi, dnes to prošlo evolucí.

V praxi docker také používáme pro snazší vytváření cgroup a limitaci IO pro různé sady aplikací. Ano, dá se to dělat i ručně, ale takhle máme jednotné API pro správu všech druhů aplikací, lépe se to celé testuje a šetří to náklady. To je jeden use case z mnoha.

kimec

Re:Docker image pro Spring + Tomcat + PostgreSQL
« Odpověď #14 kdy: 13. 06. 2018, 22:39:26 »
Problem asi bude v tom, ze JRE nie je aplikacia, ale runtime s virtualizovanou spravou pamate, vlakien, IO atd.
Což je aplikace. Z pohledu operačního systému se běžící JVM nijak neliší od vimu, LibreOffice nebo Apache.
Alebo viete co, nechajte tak, nubudem vas trapit unikernelmi.

Pofičí, jmenuje se to Docker for Windows.
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.
Alebo ste mali na mysli, nativne Windows Server Containery, ale tam uz asi linuxovy ELF vobec nespustim, ze.

Nepůjde. Docker s virtualizací nijak nesouvisí, Docker jsou kontejnery. Tak abyste si k tomu Spring Bootu ještě nastudoval, co je Docker…
Dik za tip. Citali ste to vyssie? Co keby ste si vy nastudovali ako to funguje?

A pak musíte vždy při spuštění uvádět přesnou cestu k JRE, hlídat, aby vám příslušné JRE neodinstalovala aktualizace, a pokud příslušná aplikace sama spouští JRE (třeba Maven), musíte ještě přímo té aplikaci nastavit, které přesně JRE má spustit… Jistě že to jde, ale je to komplikované. Docker slouží právě k tomu, že máte prostředí zafixované (takže nemusíte zkoumat, zda je tam správná verze toho a toho), a že je to prostředí izolované (takže vás nemusí zajímat, co potřebují jiné aplikace, protože to neovlivní vaše prostředí).
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?

Mít 6 verzí Dockeru vedle sebe nedává moc smysl. Ale spustit pod jedním Dockerem 6 verzí jedné aplikace, nebo klidně 6 instancí jedné verze aplikace, to smysl dává, a je to jeden z důvodů, proč se Docker používá.
Mat JREcko v Dockri dava zmysel? 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?

Pojede na Windows, kde není nainstalované JRE? To bych chtěl vidět. Nebo když budu mít to monolitické JARko přeložené pro Javu 9 a na cílovém systému bude jen Java 8.
Hej, malo tam byt "s JRE na Windowse aj na Linuxe". Vy pri buildovani JARka prekompilujete aj bytecode tretich stran ci co? To pocujem prvy raz. Alebo neviete, co si balite k vasej aplikaci?