Pokretanje Spring Boota s PostgreSQL-om u Docker Composeu

1. Uvod

U ovom uputstvu želimo pokrenuti Spring Boot aplikaciju s popularnom bazom podataka otvorenog koda PostgreSQL. U prethodnom članku, pogledali smo Docker Compose za obradu više spremnika odjednom. Dakle, umjesto da instalirate PostgreSQL kao zasebnu aplikaciju, koristit ćemo Docker Compose za pokretanje Spring Boota i PostgreSQL-a.

2. Izrada projekta Spring Boot

Idemo na Spring Initializer i stvorimo naš projekt Spring Boot. Mi ćemo dodati PostgreSQL upravljački program i Proljetni podaci JPA modula. Nakon što preuzmemo rezultirajuću ZIP datoteku i izdvojimo je u mapu, možemo pokrenuti našu novu aplikaciju:

./mvnw spring-boot: trčanje

Aplikacija ne uspije jer se ne može povezati s bazom podataka:

*************************** PRIJAVA NIJE USPELA ******************* ******** Opis: Nije uspjelo konfiguriranje izvora podataka: atribut 'url' nije naveden i nije moguće konfigurirati ugrađeni izvor podataka. Razlog: Nije uspjelo utvrditi prikladnu klasu vozača 

3. Dockerfile

Prije nego što započnemo PostgreSQL s Docker Compose, moramo našu aplikaciju Spring Boot pretvoriti u Docker sliku. Prvi korak je pakiranje aplikacije u JAR datoteku:

./mvnw čist paket -DskipTests

Ovdje prvo čistimo prethodne verzije prije pakiranja aplikacije. Osim toga, preskačemo testove jer oni ne uspiju bez PostgreSQL-a.

Sada imamo datoteku JAR aplikacije u cilj imenik. Ta datoteka u nazivu ima naziv projekta i broj verzije i završava s -SNAPSHOT.jar. Tako bi moglo biti i njegovo ime docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar.

Napravimo novo src / glavni / docker imenik. Nakon toga tamo kopiramo datoteku JAR aplikacije:

cp target / docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src / main / docker

Napokon, mi kreiramo ovo Dockerfile u istom direktoriju:

FROM Adotopenjdk: 11-jre-hotspot ARG JAR_FILE = *. Jar COPY $ {JAR_FILE} application.jar ENTRYPOINT ["java", "-jar", "application.jar"]

Ova datoteka opisuje kako Docker treba pokrenuti našu aplikaciju Spring Boot. Koristi Java 11 iz AdoptOpenJDK i kopira aplikacijsku JAR datoteku u prijava.jar. Zatim pokreće tu JAR datoteku za pokretanje naše aplikacije Spring Boot.

4. Docker Sastavi datoteku

Sada napišite našu Docker Compose datoteku, docker-compose.ymli spremite ga u src / glavni / docker:

verzija: '2' usluge: app: image: 'docker-spring-boot-postgres: najnovije' build: context:. container_name: app depends_on: - dB okruženje: - SPRING_DATASOURCE_URL = JDBC: PostgreSQL: // db: 5432 / Sastaviti-Postgres - SPRING_DATASOURCE_USERNAME = Sastaviti-Postgres - SPRING_DATASOURCE_PASSWORD = Sastaviti-Postgres - SPRING_JPA_HIBERNATE_DDL_AUTO = Ažuriranje DB: slika: „Postgres: 13.1- alpski 'naziv_kontejnera: db okruženje: - POSTGRES_USER = compose-postgres - POSTGRES_PASSWORD = compose-postgres

Ime naše aplikacije je app. To je prva od dvije usluge (redovi 4-15):

  • Slika Spring Boot Dockera ima naziv docker-spring-boot-postgres: najnovije (redak 5). Docker gradi tu sliku iz Dockerfile u trenutnom direktoriju (retci 6-7)
  • Naziv spremnika je app (redak 8). Ovisi o db usluga (linija 10). Zato počinje nakon db kontejner
  • Naša aplikacija koristi db PostgreSQL spremnik kao izvor podataka (redak 12). Ime baze podataka, korisničko ime i lozinka su svi compose-postgres (redovi 12-14)
  • Hibernate će automatski stvoriti ili ažurirati sve potrebne tablice baze podataka (redak 15)

Baza podataka PostgreSQL ima naziv db i druga je usluga (redovi 17-22):

  • Koristimo PostgreSQL 13.1 (redak 18)
  • Naziv spremnika je db (redak 19)
  • Korisničko ime i lozinka su oboje compose-postgres (redovi 21-22)

5. Trčanje s Docker Composeom

Pokrenimo našu aplikaciju Spring Boot i PostgreSQL s Docker Compose:

docker-sastaviti

Prvo, ovo će izgraditi Docker Image za našu aplikaciju Spring Boot. Zatim će pokrenuti spremnik PostgreSQL. Konačno, pokrenut će našu aplikaciju Docker image. Ovaj put naša aplikacija dobro funkcionira:

Pokretanje DemoApplication v0.0.1-SNAPSHOT koristeći Javu 11.0.9 na f94e79a2c9fc s PID 1 (/application.jar pokrenut od root u /) [...] Završeno skeniranje spremišta podataka Spring za 28 ms. Pronađeno je 0 sučeljima JPA spremišta. [...] Započela DemoApplication za 4,751 sekundu (JVM radi za 6,512)

Kao što vidimo, Spring Data nije pronašao sučelje spremišta. To je točno - još ga nismo stvorili!

Ako želimo zaustaviti sve spremnike, prvo moramo pritisnuti [Ctrl-C]. Tada možemo zaustaviti Docker Compose:

docker-komponirati dolje

6. Stvaranje entiteta i spremišta kupaca

Da bismo koristili bazu podataka PostgreSQL u našoj aplikaciji, stvorit ćemo jednostavan entitet kupca:

@Entity @Table (name = "customer") javna klasa Customer {@Id @GeneratedValue private long id; @Column (name = "first_name", nullable = false) private String firstName; @Column (name = "last_name", nullable = false) private String lastName;

The Kupac ima generirani iskaznica atribut i dva obavezna atributa: ime i prezime.

Sada, možemo napisati sučelje spremišta za ovaj entitet:

javno sučelje CustomerRepository proširuje JpaRepository {}

Jednostavnim produženjem JpaRepository, nasljeđujemo metode za stvaranje i postavljanje upita Kupac entitet.

Napokon, u našoj ćemo se aplikaciji koristiti sljedećim metodama:

@SpringBootApplication javna klasa DemoApplication {@Autowired privatno spremište CustomerRepository; @EventListener (ApplicationReadyEvent.class) javna void runAfterStartup () {Popis svihCustomers = this.repository.findAll (); logger.info ("Broj kupaca:" + allCustomers.size ()); Kupac newCustomer = novi kupac (); newCustomer.setFirstName ("Ivan"); newCustomer.setLastName ("Doe"); logger.info ("Spremanje novog kupca ..."); this.repository.save (newCustomer); allCustomers = this.repository.findAll (); logger.info ("Broj kupaca:" + allCustomers.size ()); }}
  • Pristupamo našem Kupac spremište putem injekcije ovisnosti
  • Pomoću spremišta ispitujemo broj postojećih kupaca - to će biti nula
  • Tada stvaramo i spašavamo kupca
  • Kada zatim ponovo upitamo postojeće kupce, očekujemo da ćemo pronaći onoga koga smo upravo stvorili

7. Ponovno trčanje s Docker Compose

Da bismo pokrenuli ažurirani program Spring Boot, moramo ga obnoviti prvi. Stoga ove naredbe izvršavamo još jednom u korijenskom direktoriju projekta:

./mvnw čist paket -DskipTests cp target / docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src / main / docker

Kako obnoviti našu Docker sliku s ovom ažuriranom JAR datotekom aplikacije? Najbolji način je ukloniti postojeću Dockerovu sliku čije smo ime naveli u docker-compose.yml. To prisiljava Dockera da ponovo izgradi sliku sljedeći put kada pokrenemo našu Docker Compose datoteku:

cd src / main / docker docker-compose down docker rmi docker-spring-boot-postgres: najnoviji docker-compose up

Dakle, nakon zaustavljanja naših spremnika, brišemo sliku aplikacije Docker. Zatim ponovno pokrećemo našu Docker Compose datoteku koja ponovno gradi sliku aplikacije.

Evo rezultata aplikacije:

Završeno skeniranje spremišta podataka Spring za 180 ms. Pronađeno je 1 sučelja JPA spremišta. [...] Broj kupaca: 0 Spremanje novog kupca ... Broj kupaca: 1

Spring Boot pronalazi naše prazno spremište kupaca. Stoga započinjemo bez kupca, ali ga zatim uspješno stvaramo.

8. Zaključak

U ovom kratkom vodiču započeli smo sa izradom Spring Boot aplikacije za PostgreSQL. Dalje, napisali smo datoteku Docker Compose da bismo pokrenuli naš spremnik aplikacije s PostgreSQL spremnikom.

Konačno, stvorili smo korisnički entitet i spremište, koji su nam omogućili spremanje kupca u PostgreSQL.

Kao i obično, izvorni kod za ovu lekciju možete pronaći na GitHubu.