DockerでSpringBoot-gradle-mysqlの開発環境を作成する

# DockerでSpringBoot-gradle-mysqlの開発環境を作成する

Dockerを使用してCentOS用コンテナにgradle環境
DB用コンテナにmysql環境を構築して
仮想環境上でSpringBootが動作できるようにする

## 構成
コンテナ
　CentOSコンテナ： java8/gradle/mysql
　Mysqlコンテナ ： Mysql

CentOSコンテナでSpringBootを起動させ、MysqlコンテナのdbにアクセスしてDBデータを取得の後、tomcatポート8080を通してホスト上にDBデータを表示させる

## ディレクトリ構成

docker-compose.yml
centos　　　　　　　　ー　Dockerfile
gradle-project　　　　　ー　[project-name]　 ー　gradleプロジェクトファイル群
mysql　　　　　　　　　ー　settings　　　　ー　空フォルダ
　　　　　　　　　　　　ー　sql　　　　　　ー　init.sql

[github](https://github.com/ktkt11122334/springbootwithdocker)


## ディレクトリ/ファイル説明

docker-compose.yml：　CentOSとMysqlコンテナを作成するためのdocker-compose記述

centos -> Dockerfile：　CentOSコンテナ起動ようのDockerファイル

gradle-project -> [project-name]：　SpringBootアプリのGradleプロジェクトファイル群

mysql ->　settings：　mysqlのDBデータ永続用のvolume(/var/lib/mysql)
 　　　 ->　sql　->　init.sql：　Mysqlコンテナ起動時の初期化スクリプト

### docker-compose.yml

```yml

version: "3"

services:
  centos:
    build: ./centos # centosのDockerfileのビルド設定(後述)
    container_name: boot-container # centosコンテナ名指定
    ports:
      - "8080:8080"　# ホストOSコンテナ間通信のポートフォワード設定
    volumes:
      - ./gradle-project:/gradle-project # gradleプロジェクトの永続化設定
    links:
      - mysql # service[mysql]のコンテナ間通信処理の許可
    depends_on:
      - mysql # mysqlコンテナ起動後にcentosコンテナを作成するよう設定
    privileged: true　# centos操作で管理者権限付与(コマンド操作等で面倒ごとが発生しないため念のために)
    tty: true　# コンテナ作成後にcentosが起動し続けるよう設定

  mysql:
    image: mysql:5.7
    container_name: boot-mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci　#　mysqlデーモンコマンド 文字コード指定
    volumes:
      - ./mysql/sql:/docker-entrypoint-initdb.d　#　初期化スクリプトをコンテナへ配置
      - ./mysql/settings:/var/lib/mysql　#　永続化したいDBデータ群を格納するディレクトリをマウント
    environment: # mysqlの各々パラメータ設定
      MYSQL_DATABASE: bootdb
      MYSQL_USER: boot
      MYSQL_PASSWORD: boot
      MYSQL_ROOT_PASSWORD: root

```

### centos　ー＞　Dockerfile

```dockerfile

# centos7を取得
FROM centos:7

# コンテナ内で行うコマンドソフトの取得
RUN yum -y update
RUN yum -y install wget
RUN yum -y install unzip

# install mysql5.7
RUN yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# setting for mysql version 5.6　# mysql5.6の使用する場合は、下記のコメントアウトをはずす
#  RUN yum-config-manager --disable mysql57-community
#  RUN yum-config-manager --enable mysql56-community

RUN yum install -y mysql mysql-server

# install java 
RUN yum install -y java-1.8.0-openjdk
RUN yum install -y java-1.8.0-openjdk-devel

# install gradle
RUN wget https://services.gradle.org/distributions/gradle-6.4.1-bin.zip
RUN unzip -d /opt/gradle /gradle-6.4.1-bin.zip
RUN rm -rf /gradle-6.4.1-bin.zip
RUN ls /opt/gradle/

# setting path # gradle/javaコマンドを操作できるように事前に環境変数を定義
ENV GRADLE_HOME /opt/gradle/gradle-6.4.1
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
ENV PATH ${JAVA_HOME}/bin:${GRADLE_HOME}/bin:${PATH}

```

### gradle-project -> [project-name]：

[project-name]ディレクトリ内にgradleプロジェクトファイルを配置する
SpringInitilizerの出力やEclipseのgradleプロジェクトのファイル群を
そのままこのディレクトリに配置する

永続化設定を行っているため、ホストコンピュータとコンテナ内のファイル操作は連動して行われる。
したがって、Eclipse等で開発を進めて、そのままコンテナに対してbuild/jar実行操作を行える


### mysql ->　settings：

mysqlのDBデータ群が格納されるファイル群を格納する
コンテナ作成前は、空ディレクトリだが
コンテナ作成あとのmysql操作にしたがってデータファイル等が追加される

コンテナ内で作成されたデータファイルは、永続化を行えるように
volume定義しておく


### mysql ->　sql　->　init.sql

コンテナ起動時の初期化スクリプトを定義
今回はSpringBootから下記のdataレコードの内容を取得して、
表示するようにコードを記述している

```sql

CREATE DATABASE IF NOT EXISTS bootdb;

CREATE TABLE IF NOT EXISTS test(
  id int(11) PRIMARY KEY,
  data varchar(255) NOT NULL
);

INSERT INTO test (id, data) VALUES (1, 'welcome to spring boot with docker');

```


## コンテナ起動から動作確認まで

```


cd ./＊docker-compose.ymlのカレントディレクトリへ移動

# コンテナをバックグランド起動
docker-compose up -d
  Creating boot-mysql ... done
  Creating boot-container ... done

# コンテナ起動確認
docker ps
  CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
  74f3771fef53        boot_with_docker_centos   "/bin/bash"              4 minutes ago       Up 4 minutes        0.0.0.0:8080->8080/tcp   boot-container
  5448c1a111c0        mysql:5.7                 "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp, 33060/tcp      boot-mysql

# gradleでプロジェクトをビルド
docker exec -w /gradle-project/docker-app boot-container gradle build
# jarファイルが作成されていることを確認
docker exec -w /gradle-project/docker-app/build/libs boot-container ls
  docker-app-0.0.1-SNAPSHOT.jar

# boot起動
docker exec -w /gradle-project/docker-app/build/libs boot-container java -jar docker-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=docker
＊ application.ymlのdockerプレフィックスを使用してローカル環境とコンテナ環境で起動処理を場合分けしている

# 動作確認
curl http://localhost:8080/docker/test
  結果[welcome to spring boot with docker]

# コンテナダウン
docker-compose down


```

### 補足

mysqlはホストOSから直接アクセスできないようにしている。
CentOSコンテナ(サーバ)を踏み台設定(links)として
CentOSコンテナからMysqlコンテナ(サーバ)へアクセスするプライベートネットワークとして起動している

そのため、Mysqlへのデータ操作を行う場合は、CentOSからMysqlにアクセスする必要がある
したがって、CentOSのDockerfile記載の通り、mysqlをcentos側にもインストールしている

下記がMysqlアクセスの例

```

# CentOSコンテナのbashプロセス起動
docker exec -it  boot-container /bin/bash

# Mysqlログイン
mysql -u boot -p -h mysql

# データ確認
mysql> use bootdb
mysql> select * from test;

+----+------------------------------------+
| id | data                               |
+----+------------------------------------+
|  1 | welcome to spring boot with docker |
+----+------------------------------------+
1 row in set (0.00 sec)


```

## 最後に

SpringBootやMysqlなどのデータベース連携の開発を行い際に、
ローカル環境に各ソフトウェアのインストール等を行う必要があるが、
Dockerでコンテナ管理してしまえば簡単に開発環境が作成されるため、
個人開発用のためにもDockerを使用することを検討しました。

DockerのVolume機能を使用して、データベースのデータの永続化や
Springプロジェクトの管理の煩雑さも簡単になるためお勧めです。

SpringBootの設定値なども確認したい方がいらっしゃいましたらgithubを参照ください
[github](https://github.com/ktkt11122334/springbootwithdocker)

## Reference

https://blog.tiqwab.com/2017/03/21/docker-java.html
[プログラマのためのDocker教科書](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%EF%BC%86%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%98%BF%E4%BD%90%E5%BF%97%E4%BF%9D-ebook/dp/B017UGA7NG/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=USOWDBYOQ865&dchild=1&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEdocker%E6%95%99%E7%A7%91%E6%9B%B8&qid=1601222075&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%2Caps%2C250&sr=8-2)