1. 序章

このチュートリアルでは、人気のあるオープンソースデータベースPostgreSQLを使用してSpringBootアプリケーションを実行します。 以前のの記事で、複数のコンテナを一度に処理するDockerComposeを調べました。 したがって、PostgreSQLを個別のアプリケーションとしてインストールする代わりに、DockerComposeを使用してSpring BootとPostgreSQLを実行します。

2. SpringBootプロジェクトの作成

Spring Initializerに移動して、SpringBootプロジェクトを作成しましょう。 PostgreSQLドライバーおよびSpringDataJPAモジュールを追加します。 結果のZIPファイルをダウンロードしてフォルダーに解凍したら、新しいアプリケーションを実行できます。

./mvnw spring-boot:run

データベースに接続できないため、アプリケーションは失敗します。

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

3. Dockerfile

Docker ComposeでPostgreSQLを起動する前に、SpringBootアプリケーションをDockerイメージに変換する必要があります。 最初のステップは、アプリケーションをJARファイルとしてパッケージ化することです。

./mvnw clean package -DskipTests

ここでは、アプリケーションをパッケージ化する前に、まず以前のビルドをクリーンアップします。 さらに、PostgreSQLなしでは失敗するため、テストをスキップします。

これで、targetディレクトリにアプリケーションJARファイルができました。 そのファイルの名前にはプロジェクト名とバージョン番号が含まれ、-SNAPSHOT.jarで終わります。 したがって、その名前はdocker-spring-boot-postgres-0.0.1-SNAPSHOT.jarになります。

new src / main /dockerディレクトリを作成しましょう。 その後、アプリケーションJARファイルをそこにコピーします。

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

最後に、このDockerfileを同じディレクトリに作成します。

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

このファイルは、DockerがSpringBootアプリケーションを実行する方法を説明しています。 AdaptOpenJDKのJava11を使用し、アプリケーションJARファイルをapplication.jarにコピーします。 次に、そのJARファイルを実行してSpringBootアプリケーションを起動します。

4. Docker作成ファイル

次に、DockerComposeファイルdocker-compose.yml を作成し、 src / main /dockerに保存します。

version: '2'

services:
  app:
    image: 'docker-spring-boot-postgres:latest'
    build:
      context: .
    container_name: app
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/compose-postgres
      - SPRING_DATASOURCE_USERNAME=compose-postgres
      - SPRING_DATASOURCE_PASSWORD=compose-postgres
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
          
  db:
    image: 'postgres:13.1-alpine'
    container_name: db
    environment:
      - POSTGRES_USER=compose-postgres
      - POSTGRES_PASSWORD=compose-postgres

私たちのアプリケーションの名前はappです。 これは2つのサービスの最初のものです (4〜15行目):

  • Spring BootDockerイメージの名前はdocker-spring-boot-postgres:latest です(5行目)。 Dockerは、現在のディレクトリの Dockerfile からそのイメージを構築します(6〜7行目)
  • コンテナ名はappです(8行目)。 db サービスに依存します(10行目)。 そのため、dbコンテナの後に開始されます
  • このアプリケーションでは、 db PostgreSQLコンテナをデータソースとして使用します(12行目)。 データベース名、ユーザー名、およびパスワードはすべて compose-postgres です(12〜14行目)。
  • Hibernateは必要なデータベーステーブルを自動的に作成または更新します(15行目)

PostgreSQLデータベースの名前はdbで、2番目のサービスです(17〜22行目):

  • PostgreSQL 13.1を使用しています(18行目)
  • コンテナ名はdb(19行目)です。
  • ユーザー名とパスワードはどちらもcompose-postgresです(21〜22行目)

5. DockerComposeで実行する

DockerComposeを使用してSpring BootアプリケーションとPostgreSQLを実行してみましょう。

docker-compose up

まず、これにより、SpringBootアプリケーション用のDockerイメージがビルドされます。 次に、PostgreSQLコンテナを起動します。 最後に、アプリケーションのDockerイメージを起動します。 今回は、アプリケーションは正常に実行されます。

Starting DemoApplication v0.0.1-SNAPSHOT using Java 11.0.9 on f94e79a2c9fc with PID 1 (/application.jar started by root in /)
[...]
Finished Spring Data repository scanning in 28 ms. Found 0 JPA repository interfaces.
[...]
Started DemoApplication in 4.751 seconds (JVM running for 6.512)

ご覧のとおり、SpringDataはリポジトリインターフェイスを検出しませんでした。 正解です。まだ作成していません。

すべてのコンテナを停止する場合は、最初に[Ctrl-C]を押す必要があります。 次に、DockerComposeを停止できます。

docker-compose down

6. 顧客エンティティとリポジトリの作成

アプリケーションでPostgreSQLデータベースを使用するには、単純な顧客エンティティを作成します。

@Entity
@Table(name = "customer")
public class Customer {

    @Id
    @GeneratedValue
    private long id;
    
    @Column(name = "first_name", nullable = false)
    private String firstName;
    
    @Column(name = "last_name", nullable = false)
    private String lastName;

Customer には、生成された id 属性と、firstNameおよびlastNameの2つの必須属性があります。

これで、このエンティティのリポジトリインターフェイスを記述できます

public interface CustomerRepository extends JpaRepository<Customer, Long> { }

JpaRepository を拡張するだけで、Customerエンティティを作成およびクエリするためのメソッドを継承します。

最後に、アプリケーションで次のメソッドを使用します。

@SpringBootApplication
public class DemoApplication {
    @Autowired 
    private CustomerRepository repository; 
  
    @EventListener(ApplicationReadyEvent.class)
    public void runAfterStartup() {
        List allCustomers = this.repository.findAll(); 
        logger.info("Number of customers: " + allCustomers.size());
 
        Customer newCustomer = new Customer(); 
        newCustomer.setFirstName("John"); 
        newCustomer.setLastName("Doe"); 
        logger.info("Saving new customer..."); 
        this.repository.save(newCustomer); 
 
        allCustomers = this.repository.findAll(); 
        logger.info("Number of customers: " + allCustomers.size());
    }
}
  • 依存性注入を通じてCustomerリポジトリにアクセスします
  • リポジトリを使用して既存の顧客の数を照会します—これはゼロになります
  • 次に、顧客を作成して保存します
  • 次に、既存の顧客に再度クエリを実行すると、作成したばかりの顧客が見つかると予想されます。

7. DockerComposeで実行する

更新されたSpringBootアプリケーションを実行するには、最初にそれを再構築する必要があります。 したがって、プロジェクトのルートディレクトリで次のコマンドをもう一度実行します。

./mvnw clean package -DskipTests
cp target/docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/docker

この更新されたアプリケーションJARファイルを使用してDockerイメージを再構築するにはどうすればよいですか? 最善の方法は、docker-compose.ymlで指定した名前の既存のDockerイメージを削除することです。 これにより、次回Docker Composeファイルを起動したときに、Dockerはイメージを再度ビルドします。

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

したがって、コンテナーを停止した後、アプリケーションのDockerイメージを削除します。 次に、Docker Composeファイルを再度起動します。これにより、アプリケーションイメージが再構築されます。

アプリケーションの出力は次のとおりです。

Finished Spring Data repository scanning in 180 ms. Found 1 JPA repository interfaces.
[...]
Number of customers: 0
Saving new customer...
Number of customers: 1

Spring Bootは、空の顧客リポジトリを見つけます。 したがって、私たちは顧客なしで始めますが、それから成功裏に顧客を作成します。

8. 結論

この短いチュートリアルでは、PostgreSQL用のSpringBootアプリケーションを作成することから始めました。 次に、PostgreSQLコンテナでアプリケーションコンテナを実行するためのDockerComposeファイルを作成しました。

最後に、顧客エンティティとリポジトリを作成しました。これにより、顧客をPostgreSQLに保存できます。

いつものように、このチュートリアルのソースコードはGitHubにあります。