Java11+Spring Boot+Dockerで作るWebアプリケーション

こんにちは、福圓です。
冬休み中に個人的に欲しいと感じてとあるWebアプリケーションを作っていました。その時に作成したアプリケーションの構成をメモとしてブログに残しておきたいと思います。実際に作成したものと内容は異なりますが、構成としてはWebアプリケーションからデータベースにアクセスして取得したデータの一覧を画面に表示する、といったシンプルなものです。一度に全てを書くと若干長くなるので2回に分割して掲載したいと思います。

使用する言語やフレームワーク、RDBMSは以下の通りです。
IDEはIntelliJ IDEAを使用しております。

Java11(OpenJDK)
Spring Boot
MySQL5.7

プロジェクトの雛形を作成

まずはプロジェクトの雛形を作成します。
IntelliJで開発している場合はメインメニューからファイル | 新規 | プロジェクトを選択し、Spring Initializrを選択して雛形を作成することが出来ます。


ビルドシステムはGradleを使用します。

ここで必要なライブラリ関連を選択します。
Lombokはアノテーションを付けるだけでgetter, setter, toString, equalsなどをコンパイル時に自動生成してくれる便利なライブラリです。
ThymeleafはSpring Bootで使用が推奨されているテンプレートエンジンです。

雛形作成後はこのような形となります。

DockerでMySQLを使用できるようにする

次にDockerでMySQLを使用できるように環境を構築していきます。
以下のようにルートディレクトリにdockerディレクトリとdocker-compose.ymlを作成します。

├── build.gradle
├── docker
│   └── mysql
│       ├── Dockerfile
│       ├── conf.d
│       │   └── my.cnf
│       └── initdb.d
│           ├── 1_schema.sql
│           └── 2_initdata.sql
├── docker-compose.yml

Dockerfile

FROM mysql:5.7
RUN touch /var/log/mysql/mysqld.log

my.cnf

[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4

1_schema.sql

CREATE TABLE customer (
    id INT NOT NULL AUTO_INCREMENT,
    first_name varchar(20),
    last_name varchar(20),
    PRIMARY KEY (id)
);

2_initdata.sql

INSERT INTO customer(first_name, last_name) VALUES('Tarou', 'Tanaka');
INSERT INTO customer(first_name, last_name) VALUES('Jiro', 'Suzuki');

docker-compose.yml

version: '2'
services:
  dbserver:
    build: ./docker/mysql
    image: demo-db:0.0.1
    restart: always
    environment:
      MYSQL_DATABASE: demo_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
    - "3314:3306"
    volumes:
    - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
    - ./docker/mysql/conf.d:/etc/mysql/conf.d
    - ./log/mysql:/var/log/mysql

volumes:
  mysql-db:
    driver: local

MySQLコンテナを立ち上げてログインしてみる

以下のコマンドでサービスのビルドと同時にサービスを起動します。
先程作成したsqlのスクリプトが実行されてテーブルとデータが作成されます。

$ docker-compose up -d --build

以下のようにMySQLのコンテナが立ち上がります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
5a24978ff730        demo-db:0.0.1       "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        33060/tcp, 0.0.0.0:3314->3306/tcp   demo_dbserver_1

コンテナが立ち上がったことを確認したので、MySQLにログインしてテーブルが作成されているか確認します。

$ docker exec -it demo_dbserver_1 bash
root@5a24978ff730:/# mysql -u user -ppassword demo_db
mysql> select * from customer;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | Taro       | Tanaka    |
|  2 | Jiro       | Suzuki    |
+----+------------+-----------+
1 row in set (0.00 sec)

テーブルが作成されていることを確認したところで今回は終わりたいと思います。
今回はWebアプリケーションの雛形を作成してDockerでMySQLコンテナを立ち上げるところまでを実施しました。

次回は実際にWebアプリケーションからMySQLに接続して取得したデータを画面に表示するところまでを掲載しようと思います。

なお、MMMは会社としてもDockerコンテナに注力しています。ぜひ以下のページをご覧ください。

Dockerコンテナ基盤(AWS Fargate/Amazon ECS)