概要
SpringBoot(APPコンテナ)とPostgreSQL(DBコンテナ)を連携する。
APPとDBのコンテナを連携する場合、APPコンテナ起動時にDBコンテナへと接続を依頼する必要がある。
つまり、APPコンテナ起動時にDBコンテナが起動している必要がある。
このことから、以下の手順でコンテナを起動する必要がある。
- DBコンテナを起動する
- DBコンテナの状態が
healthy
となる - APPコンテナを起動する
- APPコンテナからDBコンテナへと接続を依頼する
CLIからコンテナの連携を実現する
ここでは、Docker Composeを使用せずにCLIからコンテナを立ち上げて、連携を行う。
Docker Composeを使用する手順は後述する。
まずは、コンテナ間の通信を可能にするためのネットワークを作成する。
# ネットワークを作成する
$ docker network create sample_network
続いて、それぞれのコンテナを作成する。
コンテナの作成は、DB→APPの順で行う必要があるため、まずはDBコンテナを起動する。
$ docker run \
-dp 127.0.0.1:5432:5432 \
--network=sample_network --network-alias=postgres \
-e POSTGRES_PASSWORD=secret \
arm64v8/postgres:16.1-alpine
APPコンテナを起動する前に、DBコンテナへの連携を行うための設定をする必要がある。
application.properties
で設定する。
Spring DataSource
の仕組みからデータベースへの接続を確立する。
# 指定方法(jdbc:postgresql://{コンテナ名}:{ポート番号}/{DB名}
spring.datasource.url= jdbc:postgresql://db_container:5432/template
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=postgres
spring.datasource.password=secret
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
build.gradle
に依存関係を設定する。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.postgresql:postgresql'
}
これらの設定から、アプリケーションの起動時にDBコンテナへ接続される。
APPコンテナを起動する。
$ docker run \
--network=sample_network \
app-hello-spring-boot
Docker Composeからコンテナを連携する
docker-compose.yml
でも、コンテナの連携が可能。
Docker Composeを使用する場合には、ネットワークを設定する必要はない。
今回意識するべきことは、コンテナの起動順を制御することになる。
depends_on
のオプションでは、サービスの依存関係を設定することができる。
以下の例では、app
はdb
に依存している。
この場合、db
, app
の順でコンテナが起動する。
version: "3.9"
services:
app:
build: .
depends_on:
- db
db:
image: arm64v8/postgres:16.1-alpine
しかし、depends_on
は、起動順のみしか制御することはできない。
例えば、db
コンテナ起動後、準備が整っていない状態でapp
コンテナが起動してしまい、データベースの接続依頼をしてしまう可能性もある。
そのため、DBコンテナのサービスが実行されていることを確認してから、APPコンテナを起動するのが最良となる。
services:
app:
build: .
depends_on:
db:
condition: service_healthy
db:
image: arm64v8/postgres:16.1-alpine
healthcheck:
test: ['CMD-SHELL', 'pg_isready --username=postgres']
interval: 10s # ヘルスチェックの間隔
timeout: 5s # タイムアウトの長さ
retries: 5 # リトライ回数
healthcheck
オプションでは、test
に記載のコマンドをコンテナ内で実行し、コンテナの正常性を確認している。
APPコンテナは、コンテナの状態が正常であることを確認してから起動する。