👌

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

2023/12/20に公開

はじめに

こちらに移行しました🙇
https://kubodai-code.com/spring-react4/

バックエンドにSpringBoot3(REST API)フロントエンドにReactを使用してSNS風のWebアプリケーションを作っていきます。
勉強も兼ねて記録に残したいと思いますので誰かの役に立てば嬉しいです😊

今パートの目標

前回はSpring Initializrを使用してSpringBootの雛形を作成しました。
今回はDockerComposeを使用して実際にSpringBootを起動していきたいと思います。
https://zenn.dev/pandaman/articles/0a49c9d2a82ab2

環境について

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とは、複数のコンテナを一度に作ったり、まとめて管理したりできるツールです。
以下の記事がとても分かりやすいです。
https://blog.cloud-acct.com/posts/u-dockercompose-yml

docker-compose.ymlを作成する

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

中身を編集します。

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命令を使用します。
下記の流れで環境変数を受け渡ししています。

.env
WORKDIR=app
docker-compose.yml
  args:
    WORKDIR: $WORKDIR
Dockerfile
ARG WORKDIR

HOME=/${WORKDIR}
=> HOME=/app

command: <コンテナで実行するコマンド>

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

envファイルを作成する。

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

share-favplace-api % touch .env

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

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

.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ファイルを編集する

db-variables.env
POSTGRES_USER=postgresuser
POSTGRES_PASSWORD=postgrespassword
POSTGRES_DB=share_favplace_db
TZ=UTC
PGTZ=UTC

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

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

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

api-variables.env
# db
POSTGRES_USER=postgresuser
POSTGRES_PASSWORD=postgrespassword
POSTGRES_DB=share_favplace_db
DB_PORT=5432

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

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

SpringBootを起動する

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

docker-compose build

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

docker-compose up -d

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

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

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

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

まとめ

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

Discussion