15
14

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でのデータベース環境構築in Spring boot(IntellJ)

Last updated at Posted at 2019-03-01

#Spring boot + dockerでデータベース連携するぞ!
初記事。
ご指摘たくさんください。

Spring bootでポートフォリオを作ろうと思った時にdockerでのDB構築に手間取ったのでメモ。

###今回のゴール
サンプルプロジェクトにてdockerを用いて構築したデータベース(Mysql)の値を画面へ出力する

###・対象読者...
docker初心者
or
開発経験の浅い(1、2年)エンジニア

###今回注力する観点
・dockerfileの作成の仕方
・docker上に作成したMySQL環境とspring bootプロジェクトの連携

※dockerの概念などはザックリ説明→とりあえずdockerとアプリケーションを連携するところまで

##dockerとは

@kotaro-drさんの記事を載せさせていただきます。
【図解】Dockerの全体像を理解する -前編-
┗ドキュメントが綺麗で初学者でもかなりわかりやすい
【図解】Dockerの全体像を理解する -中編-
┗中編の最初にはデータベースの永続化にも関わってくるデータ管理の話が出てくるので今回は最低そこまでチラ見すればOKです。
ついでに後編も載せておきます。
【図解】Dockerの全体像を理解する -後編-

##なぜdockerなのか
・Vurtualboxよりも軽量である←テーマと焦点がズレるため詳しくは割愛。
・開発環境をすぐに用意できる
┗「この端末では動くのに自分の端末では動かない。」ということがなくなる。
┗知り合いに質問したりteratailなどのQAサービスで質問したりするときに自分の今の環境をそのまま相手に渡すことができ、回答が返って来やすくなる。
※今回はローカルマシンにIntelliJとJavaが入っていることを前提に進めます。Javaをdockerに含めることもできますが今回の観点を
「dockerでのMysql環境の構築とアプリケーションとの連携」としているため。
IntelliJとJavaのインストールについては以下に載せます。
■IntelliJ
IntelliJ -for mac
IntelliJ -for Windows
■Java11
Java -for mac
Java -for Windows

##早速やってみよう
■環境情報
言語:Java(jdk11)
FW:Spring boot
IDE:IntelliJ
※今回、IDEをIntelliJにしてみました。操作感はほぼeclipseと同じですが、UIがなんかいい感じ。今では世界シェアはeclipseを抜いているとかいないとか。。。
まずはプロジェクトを簡単に作ってみたいと思います。
その前にIntelliJにjdkのパスを登録します。以下リンク内で、【Javaプロジェクトの作り方】を検索すると出てきます。
JDKの登録

今回作成するプロジェクトのtreeです。(画像ですみません)

スクリーンショット 2019-02-24 15.49.49.jpg

今までリンクばかりでしたが、そろそろ自分の言葉を出していきたいと思います。
###プロジェクトの作成
今回はデータベースの値を全て出す簡単なモノを作ります。
というか見ればわかるレベルなので3分クッキングパターンで、出来たものが以下になります。
spring-boot-docker(github)
※要所でコメントを入れていますのでもし解釈が間違っている等ありましたらご指摘頂けると助かります。
####application.propertiesについて

spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=UTF-8&serverTimezone=JST 
#//demoが今回のデータベース名
spring.datasource.username=root //ユーザ名
spring.datasource.password=p@ssw0rd  //パスワード
spring.jpa.hibernate.ddl-auto=update  //アプリケーション起動時に、Entityに対応するテーブルがなければ作成

こちらはデータベース連携に必要な最低限の設定です。のちに作成するdocker-compose.ymlの内容と合わせる必要がありますので注意してください。

###dockerfileの作成
今回はsrcと同じ階層にdockerというフォルダを作成しその中に関連ファイルを作っていこうと思います。
場所についての記述が見つけられなかったため特に指定はないと認識しています。

fockerfile

FROM mysql:8.0  #dockerhubより取得するイメージを指定

RUN /bin/cp -f /etc/localtime /etc/localtime.org
RUN /bin/cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

COPY ./my.cnf /etc/mysql/conf.d/

RUN mkdir -p /var/log/mysql
RUN chown mysql.mysql /var/log/mysql

COPY:コマンドの左側がローカル側、右側がdockerイメージ側のことを書いております。
RUN:対象のイメージにインストールされているコマンドを実行できる

docker-compose.yml
version: '3'
services:
    mysql:
        build: ./mysql
        environment:
            - MYSQL_DATABASE=demo
            - MYSQL_ROOT_USER=root
            - MYSQL_ROOT_PASSWORD=p@ssw0rd
            - TZ=Japan
        volumes:
            - ./initdb.d:/docker-entrypoint-initdb.d
            - ./dbdata:/var/lib/mysql
        ports:
            - "3306:3306"

#↑コロン(:)で区切られている場合
#####・左側がホスト側、右側がコンテナ側のパスを表す
#####・初期データ投入→initdb.dディレクトリに最初に読み込むsqlファイルを入れる
#####永続化→dbdataに処理をするごとにデータ相当のファイルがどんどん入ってくる

#docker-composeを起動させよう
プロジェクト上のdocker-compose.ymlを右クリックし「再生」をします。
スクリーンショット 2019-03-01 22.49.47.jpg
すると、さっき書いたdockerfiledocker-compose.ymlを解釈してせっせか環境構築が始まります。
以下のように'Compose: docker' has been deployed successfully.と出たら完成です。
スクリーンショット 2019-03-01 22.53.15.jpg

では早速、データベースが出来上がっているかコンテナに入って確認してみます。
ターミナル(Windowsの場合はコマンドプロンプト)でプロジェクトのディレクトリへ移動します。
その中で
docker psコマンドで現在のコンテナの稼働状況を確認します。
実行後が下図です
スクリーンショット 2019-03-02 0.18.36.jpg

mysqlのイメージができていることがわかります。
起動にはこちらのCONTAINER IDもしくはNAMESを使います。今回はCONTAINER IDを使って起動してみます。

docker exec -it 【CONTAINER ID】 bashでコンテナに入ります。
root@37c06170b19b:/# こんな感じのターミナル(コマンドプロンプト)になっていれば入れています。
この画面よりrootユーザでMysqlへ接続します。
mysql -u root
今回はパスワードをp@ssw0rdとしてます。
以下のようにmysqlへ接続
スクリーンショット 2019-03-02 0.40.51.jpg

use demoで今回のサンプルデータベースを指定。あとは適当にsqlをうって確認します。初期データとしてはuserテーブルが入っていますので。
select * from user;
スクリーンショット 2019-03-02 0.46.40.jpg
テーブルの中身を確認できました。

あとは自分のショボいサンプルプロジェクトをDockerApplicationから実行すると...
以下のようにデータベースとの連携に成功しました。
スクリーンショット 2019-03-02 0.52.29(2).jpg

このようにdockerを使えば環境ごと相手に渡すことができるのでわざわざ相手にデータベースのセットアップやデータの投入をさせずに済みます。
dockerの知識はまだまだ浅いですが、これからどんどん使われていく事になると思いますので、積極的に使っていきたいものです。

次回は、Spring bootで認証画面を試してみたいと思います。

15
14
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
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?