今パートの目標
前回は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: <ネットワーク名>
コンテナが使用するネットワークを指定します。詳細については以下を参照してください。
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でも可能ですがサーバーへのアタッチ方法が異なります。
まとめ
今回はDockerComposeを使用して実際にSpringBootを起動するところまで実施しました。
次回はReactのDocker環境の構築をしていきたいと思います。
コメント