1-4.SpringBoot3を起動するdocker-compose.ymlを作成する

SpringBoot3(REST API)✖️Next.jsで作るSNSWebアプリケーション

今パートの目標

前回はSpring Initializrを使用してSpringBootの雛形を作成しました。
今回はDockerComposeを使用して実際にSpringBootを起動していきたいと思います。

環境について

  • SpringBoot 3.2.0
  • java 17
  • postgresql 15.4
  • pgadmin4
  • macOS Sonoma 14.1.1
  • Docker Desktop 4.18.0
  • IntelliJ IDEA 2023.2.3 (Community Edition)

docker-compose.ymlを作成する

DockerComposeとは

DockerComposeとは、複数のコンテナを一度に作ったり、まとめて管理したりできるツールです。
以下の記事がとても分かりやすいです。

分かるDocker解説。DockerComposeとは何か? - 独学プログラマ
この記事でお話しすること今回は、DockerComposeについて学んでいきます。この記事でお話ししすることは、以下の2つです。1.Webアプリケーションが動く仕組み2.DockerComposeとは何か?Railsアプリケーションを構築す...

docker-compose.ymlを作成する

share-favplace-api % touch docker-compose.yml

中身を編集します。

version: "3.9"
services:
  db:
    image: postgres:15.4-alpine3.18
    container_name: share-favplace-db
    env_file:
      - ./environment/db-variables.env
    volumes:
      - ./dbdata:/var/lib/postgresql/data
    ports:
      - "${DB_PORT}:${DB_PORT}"

  pgadmin4:
    image: dpage/pgadmin4
    container_name: share-favplace-pgadmin4
    ports:
      - "${PGADMIN_PORT}:80"
    volumes:
      - ./pgadmin4:/var/lib/pgadmin
    env_file:
      - ./environment/pgadmin4-variables.env
    depends_on:
      - db

  api:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        WORKDIR: ${WORKDIR}
    container_name: share-favplace-api
    env_file:
      - ./environment/api-variables.env
    tty: true
    command: ./gradlew clean bootRun
    volumes:
      - .:/${WORKDIR}
    ports:
      - "${API_PORT}:${API_PORT}"
      - "${DEBUG_PORT}:${DEBUG_PORT}"
    depends_on:
      - db

今回は3つのコンテナを作成し、docker-compose.ymlで管理していきます。

db

データベース用のコンテナです。

pgadmin4

pgadmin4を使用し、データベース操作を行うためのコンテナです。
※pgadmin4とはPostgreSQL 用の GUI 管理ツールです。

api

SpringBootを動かすAPI用のコンテナです。

項目説明

services:

サービスを定義します。今回はdb、pgadmin4、apiの3つです。

images: <ベースイメージ>

ベースイメージを指定します。

env_file: <ファイルパス>

envファイルのパスを指定します。envファイルで定義した環境変数はコンテナに渡され、コンテナ内で使用することができます。
envファイルは後ほど作成していきます。

volumes: <ローカルのパス : コンテナのパス>

ファイル等のデータを永続化します。
そもそもローカルマシン(PCを指す)とDockerコンテナは別空間にあります。
ですので、DBコンテナにデータを保存しても、コンテナを削除してしまえば保存したデータは全て消えてしまいます。
そこでデータベースの値やファイルなどのデータを永続化する仕組みがこのvolumes(ボリューム)となります。
ボリュームで指定したデータはコンテナを削除しても消されることはなく、次コンテナが立ち上がったときに既存のデータをコピーします。

ports: – “ホストマシンのポート番号:コンテナのポート番号”

公開ポート番号を指定します。
下記の場合は「コンテナの3000ポートを、ブラウザ上で8080で参照する」という指定になります。

ports:
  - "8080:3000"
networks: <ネットワーク名>

コンテナが使用するネットワークを指定します。詳細については以下を参照してください。
https://zenn.dev/pandaman/articles/8451d1e8560686

depends_on: <サービス名>

依存関係を指定します。
下記を指定した場合はdbコンテナが起動してから起動するという依存関係になります。

depends_on:
  - db
build:
context: <ファイルパス>

Dockerfileのパスを指定します。

dockerfile: <ファイル名>

Dockerfileのファイル名を指定します。

args: <変数キー: 変数の値>

ここにはDockerfileに渡す変数を指定します。
ここで指定した値をDockerfileで受け取るにはARG命令を使用します。
下記の流れで環境変数を受け渡ししています。

1.

WORKDIR=app

2.

  args:
    WORKDIR: $WORKDIR

3.

ARG WORKDIR

HOME=/${WORKDIR}
=> HOME=/app
command: <コンテナで実行するコマンド>

コンテナに対して実行したいコマンドを記述します。
今回はSpringBootの起動コマンドを記述しています。

envファイルを作成する

docker-compoe.ymlに渡す環境変数を定義する.envファイルを作成する

share-favplace-api % touch .env

.envファイルを編集する。

docker-compoe.ymlで参照している変数(${WORKDIR}等)はプロジェクトフォル配下に.envファイルを作成し、変数を定義することで参照できるようになります。

# db
DB_PORT=5432

#pgadmin4
PGADMIN_PORT=8888

# api
WORKDIR=app
API_PORT=8080
DEBUG_PORT=5005

docker-compoe.ymlのenviromentに渡すenvファイルを作成する

share-favplace-api % mkdir environment
share-favplace-api % cd environment
environment % touch {db-variables.env, pgadmin4-variables.env, api-variables.env}

db-variables.envファイルを編集する

POSTGRES_USER=postgresuser
POSTGRES_PASSWORD=postgrespassword
POSTGRES_DB=share-favplace-db
TZ=UTC
PGTZ=UTC

pgadmin4-variables.envファイルを編集する

PGADMIN_DEFAULT_EMAIL={メールアドレス}※ログイン時に使います
PGADMIN_DEFAULT_PASSWORD={パスワード}※ログイン時に使います

api-variables.envファイルを編集する

# db
DB_USERNAME=postgresuser
DB_PASSWORD=postgrespassword
DB_HOST=share-favplace-db
DB_PORT=5432
DB_NAME=share-favplace-db

# api
FRONT_URL=http://localhost:3000
ENV=development
APP_NAME=ShareFavplace

# gradle
ORG_GRADLE_PROJECT_debug=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005

apiでもデータベース接続情報を使用するため定義しています。

SpringBootを起動する

Dockerfileからイメージを作成します。

docker-compose build

DockerComposeコマンドでコンテナを作成し、サーバーを起動します。

docker-compose up -d
  • -d
    バックグラウンドで起動するオプションです。

3つともコンテナが作成され、サーバーが起動されていることが確認できました。

デバッグ起動する方法(IntelliJIDEA)

こちらを参考にしてみてください。
基本的にはbuild.gradleでbootRun実行時の引数を設定してあげるだけです。
VSCode等他のIDEでも可能ですがサーバーへのアタッチ方法が異なります。

SpringBoot3✖️Docker環境でデバッグする方法(IntelliJ IDEA)

まとめ

今回はDockerComposeを使用して実際にSpringBootを起動するところまで実施しました。
次回はReactのDocker環境の構築をしていきたいと思います。

コメント

タイトルとURLをコピーしました