Docker-composeを使ってJava(spring-boot)+Postgresqlの実行環境をコンテナ化してみた

## 目的
今まではJavaのみ、DBのみのコンテナ起動でしたが同時に設定させて動かしてみようというのが今回の目的になります。
実際のプロジェクトでもJavaのビルド資源はGit管理せず、CICDを使ってビルドデプロイしていくと思うので、
事前にJavaのJarファイルは用意(ビルド)しておき、そのJarファイルをコンテナに上げてコンテナで起動(デプロイ)したときにDB含めてちゃんと起動することを確認するといった流れですね。

## 使用するコマンド一覧
```:Dockerコマンド
コンテナを起動起動させる
docker-compose up -d 

//コンテナを終了させる
docker-compose down

起動しているコンテナの中にはいるコマンド
docker-compose exec #{container} bash

```
**補足**
-dオプション：バックグラウンドで動かしてくれるのでターミナルがそのまま使える


## Docker設定
**Dockerファイル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/2c5fe2ec-7762-d0e4-f217-c9851de611c9.png)
※補足
コンテナ内でgradlewビルドを行う際は```RUN microdnf findutils```は必ず設定してください。コンテナ内でgradlewビルドを行った際に使用するコマンドがコンテナに不足しているのでインストール設定を入れておく必要があるようです。

**Docker-composeファイル**
- 基本的にはそのままでよいと思いますが、「./build/libs」にてjarファイルをコンテナのルートディレクトリに直接配置してます。
```yml:docker-compose.yml
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)
```
**実行サンプル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/8f6789af-7ce8-051b-f4c2-e0dd7f70f4af.png)


### 2.コンテナに入りJarファイル実行
以下の実行コマンドでコンテナ内に入る。
※今回設定ファイル上、ServiceをJavaと定義しているので実行する際もそろえること。
```
docker-compose exec java bash
```

以下の実行コマンドでjarファイルを実行する。
※あらかじめgradlewビルドした時のjarファイルを指定してます。
```Java:実行コマンド
java -jar Sample3-0.0.1-SNAPSHOT.jar
```

**実行サンプル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/fd10a72f-592c-8fb8-a6dd-31d2aed3be27.png)


## 3.起動確認
**Spring起動**
2のjarファイル実行ができるとSpringが起動してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/b7984db8-a48c-8369-2de8-f29d6c15c422.png)

**リクエスト確認**
実際に今回のControllerクラスにリクエストを投げてみると
コンテナ内のローカルホストにアクセスしてレスポンスが表示されていることを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/5705e93f-5c25-9a0c-c66f-c673ac98a0f8.png)

**コンテナの起動ステータス**
DockerDesktop内のコンテナ状況はこんな感じ。
今回のJava(コンテナ名：spring)とDB側(コンテナ名:sample-db)の二つがちゃんと起動したうえでコンテナ内にアクセスできることを確認。
※DBについては前回立ち上がっていることを確認済みで、今回設定を何も変更していないのでコンテナ起動のみ確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/d9d5488e-21c3-7dc1-d788-6b44527de702.png)

## 最後に
細かいエラーはあったので試行錯誤しながらでしたが結構サクサクで起動できました。
大まかな部分は理解が進むとさらにスムーズに実装できそうです。
一人でも多くの助けになれば幸いです。
次は、hello worldじゃなくて投げたリクエストのパラメータをもとにDBから情報取得して返却するのをコンテナで表現させたいですね。
コンテナ周りの知識というより、JDBCとかMybatisとかそっちに寄っちゃいそうですが。。。