Java11+Spring Boot+Dockerで作るWebアプリケーションその2
本記事は前回私が掲載した記事Java11+Spring Boot+Dockerで作るWebアプリケーションの続きとなります。
前回はWebアプリケーションの雛形を作成してDockerでMySQLコンテナを立ち上げるところまでを構築しましたので、今回はWebアプリケーションからMySQLに接続して取得したデータを画面に表示するところまでを構築したいと思います。
バックエンド側とフロントエンド側のディレクトリ構造およびファイル構成は以下のようになります。
└── src
└──main
├── java
│ └── com
│ └── example
│ └── demo
│ ├── DemoApplication.java
│ ├── domain
│ │ └── Customer.java
│ ├── repository
│ │ └── CustomerRepository.java
│ ├── service
│ │ └── CustomerService.java
│ └── web
│ └── CustomerController.java
└── resources
├── application.yml
├── static
└── templates
└── customer
└── list.html
アプリケーション部分を作成
CustomerController.java
@Controller
@RequestMapping("customer")
public class CustomerController {
@Autowired
CustomerService customerService;
@GetMapping(path = "list")
String list(Model model) {
List<Customer> customers = customerService.findAll();
model.addAttribute("customers", customers);
return "customer/list";
}
}
Customer.java
@Data
@Entity
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue
private Integer id;
private String firstName;
private String lastName;
}
CustomerService.java
@Service
@Transactional
public class CustomerService {
@Autowired
CustomerRepository customerRepository;
public List<Customer> findAll() {
return customerRepository.findAll();
}
}
CustomerRepository.java
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}
list.html
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Customers</title>
</head>
<body>
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">ID</th>
<th scope="col">FirstName</th>
<th scope="col">LastName</th>
</tr>
</thead>
<tbody>
<tr th:each="customer : ${customers}">
<td th:text="${customer.id}">id</td>
<td th:text="${customer.firstName}">firstName</td>
<td th:text="${customer.lastName}">lastName</td>
</tr>
</tbody>
</table>
</body>
</html>
application.yml
spring:
profiles:
active: localhost
---
spring:
profiles: localhost
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo_db
username: user
password: password
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
data:
web:
base-path: /customer
---
spring:
profiles: docker
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://dbserver/demo_db
username: user
password: password
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
data:
web:
base-path: /customer
前回アプリケーションのルート配下に作成したdocker-compose.ymlに以下のようにappの設定を追加します。
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
app:
build: .
image: demo-app/boot:0.0.1
depends_on:
- dbserver
ports:
- "8080:8080"
volumes:
- .:/app
environment:
JAR_TARGET: demo-0.0.1-SNAPSHOT.jar
volumes:
mysql-db:
driver: local
最後にアプリケーションのルート配下にDockerfileを作成して完成です。
Dockerfile
FROM ubuntu:18.10
RUN apt-get update
RUN apt-get -y install openjdk-11-jdk
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
VOLUME /tmp
RUN mkdir /app
WORKDIR /app
# jar target
ENV JAR_TARGET "demo-0.0.1-SNAPSHOT.jar"
# set entrypoint to execute spring boot application
ENTRYPOINT ["sh","-c","java -jar -Dspring.profiles.active=docker build/libs/${JAR_TARGET}"]
ここまで出来たら以下のコマンドでビルドして起動します。
docker-compose build
docker-compose up
正常にMySQLとアプリケーションが起動したことを確認後、以下のURLにアクセスするとDBに登録されたcustomerデータが画面に表示されるかと思います。
http://localhost:8080/customer/list
以上、非常にシンプルな構成ですが、Java11+Spring Boot+Dockerで構成されたアプリケーション構築についてのまとめでした。
なお、以下のぺージでMMMのDockerコンテナへの取り組みをご紹介しています。ぜひ合わせてご覧ください。
・Dockerコンテナ基盤(AWS Fargate/Amazon ECS)