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
ディレクトリ/ファイル説明
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教科書