目的
今まではJavaのみ、DBのみのコンテナ起動でしたが同時に設定させて動かしてみようというのが今回の目的になります。
実際のプロジェクトでもJavaのビルド資源はGit管理せず、CICDを使ってビルドデプロイしていくと思うので、
事前にJavaのJarファイルは用意(ビルド)しておき、そのJarファイルをコンテナに上げてコンテナで起動(デプロイ)したときにDB含めてちゃんと起動することを確認するといった流れですね。
使用するコマンド一覧
コンテナを起動起動させる
docker-compose up -d
//コンテナを終了させる
docker-compose down
起動しているコンテナの中にはいるコマンド
docker-compose exec #{container} bash
補足
-dオプション:バックグラウンドで動かしてくれるのでターミナルがそのまま使える
Docker設定
Dockerファイル
※補足
コンテナ内でgradlewビルドを行う際はRUN microdnf findutils
は必ず設定してください。コンテナ内でgradlewビルドを行った際に使用するコマンドがコンテナに不足しているのでインストール設定を入れておく必要があるようです。
Docker-composeファイル
- 基本的にはそのままでよいと思いますが、「./build/libs」にてjarファイルをコンテナのルートディレクトリに直接配置してます。
version: '3'
services:
# Javaの設定情報
java:
# コンテナ名
container_name: spring
build: ./java
ports:
- "8080:8080"
# local参照先:コンテナ展開先
volumes:
- ./build/libs:/app
# コンテナ内のディレクトリ定義
working_dir: /app
tty: true
# postgresの設定情報
postgres:
# コンテナ名
container_name: sample-db
# ビルドするDockerImageが格納されているディレクトリ
build: ./postgres
# OS起動時に自動でコンテナを起動させる(=always)
restart: always
# hostポート番号:コンテナポート番号
ports:
- "5432:5432"
# 初期SQL
volumes:
- ./postgres/init:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
expose:
- "5432"
動かしてみる
1.ビルド
まずは作成したdocker-composeファイルもとにコンテナを起動してもらいたいので以下のコマンドで起動します。
※doker-composeファイルの変更を繰り返していたのでbuildコマンドを使用してますがbuildコマンドは必須で使用しなくても大丈夫です。
docker-compose up -d (-- build)
2.コンテナに入りJarファイル実行
以下の実行コマンドでコンテナ内に入る。
※今回設定ファイル上、ServiceをJavaと定義しているので実行する際もそろえること。
docker-compose exec java bash
以下の実行コマンドでjarファイルを実行する。
※あらかじめgradlewビルドした時のjarファイルを指定してます。
java -jar Sample3-0.0.1-SNAPSHOT.jar
3.起動確認
Spring起動
2のjarファイル実行ができるとSpringが起動してくれる。
リクエスト確認
実際に今回のControllerクラスにリクエストを投げてみると
コンテナ内のローカルホストにアクセスしてレスポンスが表示されていることを確認できる。
コンテナの起動ステータス
DockerDesktop内のコンテナ状況はこんな感じ。
今回のJava(コンテナ名:spring)とDB側(コンテナ名:sample-db)の二つがちゃんと起動したうえでコンテナ内にアクセスできることを確認。
※DBについては前回立ち上がっていることを確認済みで、今回設定を何も変更していないのでコンテナ起動のみ確認。
最後に
細かいエラーはあったので試行錯誤しながらでしたが結構サクサクで起動できました。
大まかな部分は理解が進むとさらにスムーズに実装できそうです。
一人でも多くの助けになれば幸いです。
次は、hello worldじゃなくて投げたリクエストのパラメータをもとにDBから情報取得して返却するのをコンテナで表現させたいですね。
コンテナ周りの知識というより、JDBCとかMybatisとかそっちに寄っちゃいそうですが。。。