SpringBoot3を起動するdocker-compose.ymlを作成する
はじめに
こちらに移行しました🙇
バックエンドにSpringBoot3(REST API)フロントエンドにReactを使用してSNS風のWebアプリケーションを作っていきます。
勉強も兼ねて記録に残したいと思いますので誰かの役に立てば嬉しいです😊
今パートの目標
前回は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-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: <ネットワーク名>
コンテナが使用するネットワークを指定します。詳細については以下を参照してください。
depends_on: <サービス名>
依存関係を指定します。
下記を指定した場合はdbコンテナが起動してから起動するという依存関係になります。
depends_on:
- db
build:
context: <ファイルパス>
Dockerfileのパスを指定します。
dockerfile: <ファイル名>
Dockerfileのファイル名を指定します。
args: <変数キー: 変数の値>
ここにはDockerfileに渡す変数を指定します。
ここで指定した値をDockerfileで受け取るにはARG命令を使用します。
下記の流れで環境変数を受け渡ししています。
WORKDIR=app
args:
WORKDIR: $WORKDIR
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
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でも可能ですがサーバーへのアタッチ方法が異なります。
まとめ
今回はDockerComposeを使用して実際にSpringBootを起動するところまで実施しました。
次回はReactのDocker環境の構築をしていきたいと思います。
Discussion