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

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

キョウタコの技術日記

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

キョウタコの技術日記

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

キョウタコの技術日記

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

今回の記事から2回に分けてdocker composeの実践として、WebAPIサーバーとDBサーバーを作成し、ネットワークやボリュームの設定をして、WebAPIの作成を一括で行います。

WebAPIの完成イメージ

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

APIサーバーを作成する

spring initializrでspringプロジェクトを作成

最初にspring initializrというサイトで空のSpringプロジェクトを作成していきます。
こちらはDockerと直接関係ないので詳細は割愛しますが、画像のような設定値で作成してください。

GENERATEをクリックするとapi.zipファイルがダウンロードされます。
次に任意の場所にフォルダwebapiを作成し、その中でapi.zipを解凍してください。
解凍後、api.zipは消して構いません。
解凍すると以下のようなディレクトリ構成になると思います。

webapi
└── api
    ├── HELP.md
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── example
        │   │           └── api
        │   │               └── ApiApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── com
                    └── example
                        └── api
                            └── ApiApplicationTests.java

Spring プロジェクトを編集

Springプロジェクトを作成したら少し編集していきます。
以下のパスでファイルを作成してください。
webapi/api/src/main/java/com/example/api/AnimalController.java
ファイル作成後、以下の内容を記述してください。

package com.example.api;

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 {

    @RequestMapping("/animal")
    public String cry(
            @RequestParam String animal
    ) {
        return "wang wang";
    }

}

こちらの内容はspring bootの内容になるので割愛しますが、/api/animal?animal=〇〇というURLで’wang wang’という文字列を返却するAPIを作成しています。

イメージを作成しコンテナを起動

では、このspring bootを起動するためのコンテナをカスタムイメージから作成し動作を見てみましょう。
以下のパスにDockerfileを作成してください。
/webapi/api/Dockerfile
作成後、次のように記述します。

FROM gradle:7

WORKDIR /api
COPY . .

CMD [ "./gradlew", "bootRun" ]

gradleは、平たくいうと簡単にJavaアプリの依存関係を解決しアプリをビルドできるツールです。
Dockerfileの内容をとても簡単にいうと、ディレクトリをコピーした後コマンドを実行でgradleを使ってspring bootを起動させています。
Dockerfileができたらイメージの作成とコンテナ起動を実施しましょう。

docker image build -t api-image .
docker container run -p 8080:8080 --rm api-image

最終的に画像のようにSpringと表示されて待機状態になれば成功です。

APIの動作確認

では、作成したAPIの動作を確認してみましょう。
Google Chromeなどのブラウザを開き、以下のURLにアクセスしてみてください。

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

アクセスすると以下のように表示されます。

“wang wang”と返ってきており、正常に動作していることがわかります。
ここまで確認できたら、一旦コンテナは停止して削除しましょう。
コンテナを起動しているターミナルでCommand + CCtrl + Cを押下すれば止まります。

まとめ

今回はspring bootを使ったwebapiの作成まで行いました。
次回の記事でDBコンテナの作成を行い、2つのコンテナをdocker composeで扱います。
ここまで読んでいただき、ありがとうございました。
それでは、また。