MySQLの設定を簡略化するために、SpringBootにDockerを導入する 　CodeSpaces上でも動くことを確認

# 概要
SpringBootにDockerを導入します。

# dockerを導入する理由
MySQLの設定をしないで動かせるようにしたいため。
第三者が行うセッティングを減らすため

# 開発環境
OS:windows10

バックエンド側：
IDE:IntelliJ Community
spring-boot-starter-parent 2.75
java　：　11

データベース
mysql:8.0.29
クライアントソフト: MySQL Workbench

Docker:20.10.22


# 手順

## 今回作成したファイル一覧

ファイル名|説明
----------------|-----
application.properties| 従来のプロパティファイル spring.profiles.active=dockerでdockerに切り替える
application-docker.properties|docker用のプロパティファイル
Dockerfile|SpringBoot Applicationのイメージファイル
docker-compose.yml|バックエンドアプリケーション、MySQLをDockerのコンテナで起動するためのファイル
mysql/*.sql|データベースの初期データが入っているフォルダ。拡張子sqlのファイルはMySQL WorkBenchで作成


## Docker Desktopをインストール
以下リンクからインストール

https://docs.docker.com/desktop/install/windows-install/

コマンドを実行できるか確認
```
 docker -v
Docker version 20.10.22, build 3a2c30b
```

## Dockerファイルを作成する
```Dockerfile:Dockerfile

FROM eclipse-temurin:11
WORKDIR /app
COPY target/springboot-ecshop-rest-api-0.0.1-SNAPSHOT.jar /app/springboot-ecshop-api.jar
ENTRYPOINT ["java","-jar","springboot-ecshop-api.jar"]

```




docker imageコマンドを実行してビルドされていることを確認する。


```bash:command
>docker images
REPOSITORY              TAG       IMAGE ID       CREATED              SIZE
springboot-ecshop-api   latest    a0a584839f65   About a minute ago   499MB
```





## docker-compose.ymlファイルを作成する
```yml:docker-compose.yml
version: "3.8"

services:
  mysqldb:
    container_name: mysqldb
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: ecshopdb
    networks:
      springboot-mysql-net:
#   MYSQLの初期データを設定
    volumes:
      - ./mysql/:/docker-entrypoint-initdb.d/

# 以下コマンドを実行してspringboot-ecshop-api.jarを最新にしておくこと
# mvn clean package
  springboot-ecshop-api:
    container_name: springboot-ecshop-api
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    depends_on:
      - mysqldb
    networks:
      springboot-mysql-net:
    restart: on-failure

networks:
  springboot-mysql-net:

```

## application-docker.properties
```properties:application-docker.properties
server.port=5000
spring.datasource.url=jdbc:mysql://mysqldb:3306/ecshopdb
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update

````


## application.properties
デバッグで処理を追うときにはローカルを使う

```diff_properties:application.properties
server.port=5000
#MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/ecshopdb
spring.datasource.username=admin
spring.datasource.password=root1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

logging.level.org.springframework.security=DEBUG
app.jwt-secret = JWTSecretKey
app.jwt-expiration-milliseconds = 6048000

spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER

+ # dockerで動かしたい場合コメントアウトしてください
+ # コメントアウト後以下コマンドをターミナル上で実行して.jarファイルを更新
+ # mvn clean package
+ spring.profiles.active=docker
```



# 実際に動くか確認
## 結論

方法|結果
---|---
１．ローカルIntelliJ|○
2.CodeSpacesブラウザから|○
3.CodeSpaces VSCodeから|○

CodeSpacesでも試した所動きました。良い意味で想定外です。
dockerとクラウドIDEが合わさると最強の開発環境に見える

## １．ローカルのデスクトップアプリケーション（IntelliJ Community）で動くか確認
intelliJのターミナルで以下コマンドを実行する
```bash:command
springboot-ecshop-rest-api > mvn package
```

targetフォルダが作成されます。
```bash:command
springboot-ecshop-rest-api > docker-compose up -d build
```
１分ぐらい待って
ttp://localhost:5000/api/products?pageNo=2&pageSize=4&category=1
にアクセス

結果（下画像）　動いてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/1de94730-ba5b-d7ee-ad3f-2829b6b12714.png)




SpringBootのログを表示するコマンド(dockerなしで実行するとアスキーアートが出てくるあれ)
```bash:command
springboot-ecshop-rest-api > docker logs -f springboot-ecshop-api

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.5)

```

を開く

## ２．CodeSpace（ブラウザ版）

下の図のようにCodeボタンを押し、＋ボタンを押してCodeSpacesを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/31d5f482-430d-9fe9-4bf1-12fd23f5eb8e.png)

開けた時の様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d7a0ab69-64d5-0473-698d-ab9618f3ccde.png)


起動後ブランチを11.MySqlWithDockerに切り替える。

以下コマンドを実行する
```bash:command
mvn package
```
targetフォルダ作成後される。
以下コンテナを実行してDockerコンテナを起動（dockerは自動的にインストールされるみたいですね。）
```
docker-compose up -d --build
```

port番号5000のURLを開き、URLの末尾にパラメータを加える
/api/products?pageNo=2&pageSize=4&category=1


ブラウザでGETメソッドを取得することを確認。（下画像）
ただしURLがグッチャグチャなんでフロントエンドとの連携は難しそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/97afc986-0f21-85b3-2ccd-0f408ae6a895.png)

MySQLとの連携ができていると確認できます。

## ３．CodeSpace(ローカルのVSCodeで開く)
VSCode経由でCodeSpacesを起動します。（下画像参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/cdc6cfb6-06c2-5341-23c8-f26abc3af520.png)

ttp://localhost:5000/api/products?pageNo=2&pageSize=4&category=1
にアクセス（下画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ea0ae105-34ed-d5ef-35cb-c0872fb78c38.png)

MySQLとの連携ができていると確認できます。
ブラウザ版と違ってURLがきれいなのが良いですね。

# 参考
良かったらgithubアカウント持っている方は試してみてください
https://github.com/RYA234/springboot-ecshop-rest-api


Section26: Docker-compose  docker-composeの大まかな作り方

https://www.udemy.com/course/building-real-time-rest-apis-with-spring-boot/learn/lecture/35754880#content

mysqlに初期データを持たせる。

https://jongz.hatenablog.com/entry/2020/12/13/064949