Dockerとコンテナ技術 その20:docker compose 実践 WebAPIサーバーとDBサーバーを作成③

以前の記事で複数コンテナを扱うdocker composeについてまとめました。

キョウタコの技術日記

Docker Composeとは、一度に複数のコンテナを作成・実行できるソフトウェアのことです。Docker内に同梱され…

キョウタコの技術日記

Docker Composeで利用するキーや階層構造の主な記述方法についてまとめていきます。Docker Compose…

キョウタコの技術日記

コンテナの仮想環境が作成できるようになったので、次は起動しているコンテナでの操作を実行できるようにしていきます。今回はコ…

今回の記事ではAPIを修正し、DBサーバーから取得したデータを元にレスポンスを作成するようにして、webAPIの完成まで持っていきます。

WebAPIの完成イメージ

今回のWebAPIはAPIサーバーにJavaのSpring Boot、DBサーバーにPostgresSQLを利用して外部からポート8080でAPIサーバーにアクセスし、DBのデータを取得後レスポンスを返すという簡単なものを作成していきます。
イメージとしては以下のようなものを作成していきます。

WebAPIを編集する

WebAPIを編集し、固定値”wang wang”と返していたものを、リクエストの動物に合わせてDBから鳴き声を取得しそれを返却するようにしていきましょう。
こちらの内容はDockerの内容というよりもspring bootの内容となるので詳細は割愛します。

必要なJavaファイルを作成する

では、WebAPIを実際に編集していきましょう。
以下のパスにファイルを作成してください。

webapi/api/src/main/java/com/example/api/AnimalRepository.java

作成後、ファイルを開き以下のように編集してください。

package com.example.api;

import com.example.api.entities.AnimalEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import jakarta.transaction.Transactional;

@Repository
@Transactional
public interface AnimalsRepository extends JpaRepository<AnimalEntity, String> {
  AnimalEntity findFirstByAnimalName(String animalName);
}

次に、先ほどの記述の中に存在するAnimalEntityはまだ作成していないのでそちらを作成していきます。
以下のパスにファイルを作成してください。

webapi/api/src/main/java/com/example/api/entities/AnimalEntity.java

作成後、ファイルを開き以下のように編集してください。

package com.example.api.entities;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "animals")
public class AnimalEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Long id;
  public String animalName;
  public String cry;

}

既存のファイルを編集する

では次に、すでに作成済みのAnimalController.javaを編集していきます。
ファイルの内容を以下のように変更してください。

package com.example.api;

import com.example.api.entities.AnimalEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RestController
@RequestMapping("/api")
public class AnimalController {
    @Autowired
    private AnimalsRepository animalsRepository;

    @RequestMapping("/animal")
    public String cry(
            @RequestParam String animalName
    ) {
        AnimalEntity animalEntity = this.animalsRepository.findFirstByAnimalName(animalName);
        return animalEntity.cry;
    }

}

AnimalController.javaの編集が完了したら次に以下のファイルを編集していきます。

webapi/api/src/main/resources/application.properties

こちらのファイルはspring bootのプロジェクト作成時に自動で作成されていたものです。
こちらのファイルを以下のように編集してください。

spring.application.name=api

spring.datasource.url=jdbc:postgresql://db:5432/appdb
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=none

docker-compose.yamlに設定を追加する

WebAPIの編集の最後にdocker-compose.yamlへの設定の追加を行います。
以下の設定を追加してください。

〜〜〜〜〜〜〜〜
  api:
    build: ./api
    ports:
      - 8080:8080
    depends_on:  # 追加
      - db             # 追加
  db:
    image: postgres:15
〜〜〜〜〜〜〜〜

depends-onという設定ではサービス間の依存関係を定義でき、コンテナの起動順の制御をすることができます。
コード内のdepends-on: dbという記述はapiコンテナがdbコンテナに依存していることを表しており、依存先のdbコンテナから起動するようになります。

docker compose upでWebAPIコンテナとDBコンテナを起動

ここまで編集できたら最後にdocker compose upコマンドで2つのコンテナを起動していきましょう。
docker-compose.yamlがあるフォルダで以下のコマンドを実行してください。

docker compose up --build

--buildオプションはイメージのビルドをし直すところから起動するためのオプションです。
これをつけないと以前のイメージのままビルドするためWebAPIコンテナに今回の編集が適応されていない状態になってしまうので忘れずに付けましょう。
実行後、以下のようにWebAPIコンテナが作成され、Springアプリケーションが起動していれば成功です。

APIを呼び出してみる

では、APIを呼び出してみましょう。
ブラウザを起動して、以下のURLを実行してみてください。

http://localhost:8080/api/animal?animalName=dog

実行して以下のようにレスポンスが返ってくれば成功です。

データベースに登録している他のanimalNameを指定してみましょう。

http://localhost:8080/api/animal?animalName=cat

指定したanimalNameに合わせてデータベースから取得した鳴き声が取得できてるのが確認できます。
これで、docker composeを利用したWebAPIの実装は完了です。

まとめ

ここまで3回の記事に分けてdocker composeの簡単な実例をお見せしながらWebAPIの開発を行ってきました。
複数のコンテナを同時にdocker-compose.yamlファイルで管理できることで開発しやすくなっていることが実感できたのではないかと思います。
複数のコンテナを扱うのは現在の開発ではスタンダードなので、docker composeの知識も必須となっています。
しっかりと覚えておきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。