0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンテナを連携する

Posted at

概要

SpringBoot(APPコンテナ)とPostgreSQL(DBコンテナ)を連携する。

APPとDBのコンテナを連携する場合、APPコンテナ起動時にDBコンテナへと接続を依頼する必要がある。
つまり、APPコンテナ起動時にDBコンテナが起動している必要がある。

このことから、以下の手順でコンテナを起動する必要がある。

  1. DBコンテナを起動する
  2. DBコンテナの状態がhealthyとなる
  3. APPコンテナを起動する
  4. 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のオプションでは、サービスの依存関係を設定することができる。

以下の例では、appdbに依存している。
この場合、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コンテナは、コンテナの状態が正常であることを確認してから起動する。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?