我想在Spring Boot中建立一个简单的Web应用程序!【使用Docker进行环境设置】
【背景】
这篇文章是之前的文章”利用Spring Boot创建简单的Web应用!【实施CRUD操作】”的续篇。
为了能够轻松地部署之前创建的Todo应用程序,我们将尝试使用Docker构建环境。
我们将根据之前的代码进行操作,如果配置相同,则应该可以轻松地进行环境搭建。
【这篇文章的内容】
使用Docker构建使用Spring Boot和MySQL的应用程序环境。
构建环境是maven,但也作为补充提供了使用gradle的解释。
【开发环境】
-
- PC: MacBook Pro(2019)
-
- プロセッサ: 1.4 GHz クアッドコアIntel Core i5
-
- OS: macOS 12.2.1
-
- IDE: IntelliJ IDEA 2021.2.3(Community Edition)
-
- Java: openjdk 11.0.12 2021-07-20 LTS
-
- Spring Boot: 2.6.1
-
- maven: 3.8.4
-
- MySQL: 8.0.28
-
- Docker Desktop: 4.7.0
Docker: 20.10.14
docer-compose: 1.29.2
请注意,从现在开始我将使用Mac电脑。
【准备】
■安装Docker Desktop
您可以从以下链接下载Mac版和Windows版的安装程序:
■停止本地的MySQL数据库
由于在以前的文章中已经说明了在本地安装了MySQL,所以如果它正在运行,最好停止它。停止方法也在之前参考的网站上有说明。
Windows操作系统:https://prog-8.com/docs/mysql-env-win
Mac:https://prog-8.com/docs/mysql-env 的环境与MySQL有关。
【环境设置】
■ 目录结构
以下是目录结构的设定。
TodoApp
|-- SpringBootTodo
| |-- src
| |-- pom.xml
| `-- Dockerfile
|-- mysql
| |-- Dockerfile
| |-- data
| `-- settings
| `-- setting.cnf
`-- docker-compose.yml
-
- SpringBootTodo
前回作成したアプリのディレクトリ
他のアプリへの差し替え可能
mysql
data: DBのデータを格納する
settings: MySQLの設定ファイルを格納する
■修改pom.xml文件
<!--省略-->
<build>
<finalName>app</finalName> <!--追加-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<!--省略-->
为了将构建后的文件名设置为”app”,我们添加了app。可以使用任何喜欢的名称,但需要注意的是,接下来需要修改的Dockerfile。
创建Spring Boot的Dockerfile
FROM maven:3.8.4-jdk-11 AS builder
WORKDIR /tmp
COPY ./src ./src
COPY ./pom.xml .
RUN mvn package
FROM openjdk:11.0.14.1-oracle
COPY --from=builder /tmp/target/app.jar /app/app.jar
EXPOSE 8080
这个Spring Boot的Dockerfile是根据这篇文章参考的。
这里分为构建和应用程序运行两部分。
-
- ビルド
mavenのビルド環境を用意
作業ディレクトリを/tmpにする
./srcをコピー
./pom.xmlをコピー
mavenのビルドコマンドを実行
アプリケーション実行
Javaの実行環境を用意
ビルドして作成したapp.jarファイルをコピー
コンテナのポートを8080に指定
创建一个MySQL的Dockerfile。
FROM mysql:8.0.28-debian
EXPOSE 3306
MySQL的Dockerfile是参考了这位同事的文章。(非常感谢他/她的简洁明了的文章)
-
- mysqlの環境を用意
- コンテナのポートを3306に指定
创建MySQL的配置文件
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
我只需要设置最低限度的字符编码。
创建docker-compose.yml文件。
我們將在Compose的一側進行其他設定。
version: "3"
services:
spring-boot:
build:
context: ./SpringBootTodo
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
mysql:
condition: service_started
entrypoint: "java -jar /app/app.jar"
networks:
- app-net
mysql:
build:
context: ./mysql
dockerfile: Dockerfile
ports:
- "3306:3306"
volumes:
- ./mysql/settings:/etc/mysql/conf.d/
- ./mysql/data/:/var/lib/mysql/
environment:
MYSQL_DATABASE: spring_boot_todo
MYSQL_ROOT_PASSWORD: password
networks:
- app-net
networks:
app-net:
driver: bridge
-
- services
Spring Boot
Dockerfileを指定
コンテナのポート8080と実行環境のポート8080をつなぐ
MySQLの起動後に実行するように指定
実行コマンド
ネットワークを指定
MySQL
Dockerfileを指定
コンテナのポート3306と実行環境のポート3306をつなぐ
ローカルの設定とdataディレクトリをコンテナ内のディレクトリに紐付ける
作成するDB名を指定(好きな値に変更)
root権限のpasswordを指定(好きな値に変更)
ネットワークを指定
networks
アプリケーションのネットワークをbridgeで構築
networkを構築しないとうまく動かないので要注意(こちら参照)
■ 修改Spring Boot的properties文件
## ■DBの接続先情報
spring.datasource.url=jdbc:mysql://todoapp-mysql-1:3306/spring_boot_todo
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
todoapp_mysql_1はMySQLのコンテナ名を入れる
spring_boot_todoはdocker-compose.ymlで指定したDB名を入れる
passwordはdocker-compose.ymlで指定したMySQLのroot権限のpasswordを入れる
【确认操作】
打开终端,并进入包含docker-compose.yml文件的目录,执行以下操作。
sudo docker-compose up -d
【资料库】
我会提供一个参考库给你参考。
【补充(Gradle情况下)】
如果构建环境不是使用maven而是gradle,我们也会提供整理的内容。
(只是假设构建环境不同的情况下进行详细记录)
■修改 build.gradle
// 省略
bootJar{
archiveFileName = 'app.jar'
}
// 省略
通过上述操作将文件名固定为app.jar。
■创建Spring Boot的Dockerfile(使用Gradle版本)
FROM gradle:7.4.1-jdk11 AS builder
WORKDIR /tmp
COPY ./src ./src
COPY ./build.gradle .
RUN gradle build
FROM openjdk:11.0.14.1-oracle
COPY --from=builder /tmp/build/libs/app.jar /app/app.jar
EXPOSE 8080
和Maven几乎一样,只是根据Gradle来调整文件名、命令和输出路径等。这就是它与Maven的区别!
【总结】
这次我们使用Docker构建了一个使用Spring Boot和MySQL的应用程序环境。通过使用Docker,开发和部署变得更加高效,因此我们希望能充分利用它。
如果这篇文章有任何错误,请毫不犹豫地指出来。
如果这篇文章对大家有所帮助,我会感到非常幸福。
【文献引用】
-
- Spring Bootアプリケーションのコンテナ化を試してみた
-
- DockerでPHPとMySQLのシンプルすぎる環境構築を行う
- 他のDockerコンテナからコンテナ内のMySQLに接続する