5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-27

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

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

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


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


# 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レコードの内容を取得して、
表示するようにコードを記述している


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

Reference

https://blog.tiqwab.com/2017/03/21/docker-java.html
プログラマのためのDocker教科書

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?