![码头工人Spring启动](https://i-blog.csdnimg.cn/blog_migrate/a4a4f17cbbcb895042bdca264a8282b5.png)
在本教程中,我们将向您展示如何对Spring Boot Web应用程序(mvc + thymeleaf)进行Docker化。
经过测试
- Docker 19.03
- Ubuntu 19
- Java 8或Java 11
- Spring Boot 2.2.4。发布
- 马文
在本文的结尾,我们将创建一个Spring Boot MVC Web应用程序并在docker容器中运行。
PS此示例已通过Java 8和Java 11进行了测试。
1.项目目录
1.1标准的Maven项目结构。
![项目结构](https://i-blog.csdnimg.cn/blog_migrate/f95d41256124656e3938060d65727afa.png)
在项目的根部看到Dockerfile
吗? 我们只需要此Dockerfile
文本文件即可对Spring Boot应用程序进行Docker化。
2. Maven
2.1项目依赖性。 这里没有什么特别的,只是一些Spring Boot依赖项。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong</groupId>
<artifactId>docker-spring-boot</artifactId>
<version>1.0</version>
<name>docker-spring-boot</name>
<url></url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- debugging -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-web</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. Spring Boot
3.1 @SpringBootApplication
启动所有内容,并返回一个控制器。
package com.mkyong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@SpringBootApplication
@Controller
public class StartApplication {
@GetMapping("/")
public String index(final Model model) {
model.addAttribute("title", "Docker + Spring Boot");
model.addAttribute("msg", "Welcome to the docker container!");
return "index";
}
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
3.2百里香页。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/>
<link data-th-href="@{/css/main.css?{id}(id=${timestamp})}" rel="stylesheet">
<title>Hello Docker + Spring Boot</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Mkyong.com</div></a>
</nav>
<main role="main" class="container">
<div class="starter-template">
<h1 th:text="${title}">Default title.</h1>
<p th:text="${msg}">Default text.</p>
</div>
</main>
<script data-th-src="@{/js/main.js}"></script>
</body>
</html>
4.运行Spring Boot
4.1完成后,将其与Maven打包在一起。
$ cd project
$ mvn clean package
4.2运行Spring Boot。
$ cd project
$ java -jar target/spring-boot-web.jar
![输出](https://i-blog.csdnimg.cn/blog_migrate/890ab7a8f4018fc7906fd77592be040d.png)
完成后,接下来,我们将在target/spring-boot-web.jar
容器中启动此target/spring-boot-web.jar
。
4. Docker文件
Dockerfile
是一个文本文件,包含用于组装Dockerfile
所有命令。 查看Dockerfile
的命令:
4.1它会基于adoptopenjdk/openjdk11:alpine-jre
创建一个adoptopenjdk/openjdk11:alpine-jre
映像,这是一个安装了openjdk11
的高山linux 。 这个基础镜像采用adoptopenjdk/openjdk11:alpine-jre
只是一个例子,我们可以从官方Docker Hub中找到更多基础镜像
# For Java 8, try this
# FROM openjdk:8-jdk-alpine
# For Java 11, try this
FROM adoptopenjdk/openjdk11:alpine-jre
4.2将工作目录更改为/opt/app
WORKDIR /opt/app
4.3将spring-boot-web.jar
复制到/opt/app/app.jar
ARG JAR_FILE=target/spring-boot-web.jar
# cp spring-boot-web.jar /opt/app/app.jar
COPY ${JAR_FILE} app.jar
4.4使用ENTRYPOINT
运行jar文件。
# java -jar /opt/app/app.jar
ENTRYPOINT ["java","-jar","app.jar"]
4.5一个完整的Dockerfile
示例。
# For Java 8, try this
# FROM openjdk:8-jdk-alpine
# For Java 11, try this
FROM adoptopenjdk/openjdk11:alpine-jre
# Refer to Maven build -> finalName
ARG JAR_FILE=target/spring-boot-web.jar
# cd /opt/app
WORKDIR /opt/app
# cp target/spring-boot-web.jar /opt/app/app.jar
COPY ${JAR_FILE} app.jar
# java -jar /opt/app/app.jar
ENTRYPOINT ["java","-jar","app.jar"]
5. Dockerize Spring Boot应用程序
5.1转到包含Dockerfile
的文件夹。
$ cd project
$ pwd
/home/mkyong/projects/docker-spring-boot
$ ls -lsah
total 32K
4.0K drwxr-xr-x 5 mkyong mkyong 4.0K Feb 17 20:04 .
4.0K drwxr-xr-x 6 mkyong mkyong 4.0K Feb 14 13:02 ..
4.0K -rw-r--r-- 1 mkyong mkyong 537 Feb 17 20:04 Dockerfile
4.0K -rw-r--r-- 1 mkyong mkyong 80 Feb 14 13:02 docker-spring-boot.iml
4.0K drwxr-xr-x 2 mkyong mkyong 4.0K Feb 17 19:16 .idea
4.0K -rw-r--r-- 1 mkyong mkyong 2.4K Feb 17 18:36 pom.xml
4.0K drwxr-xr-x 4 mkyong mkyong 4.0K Feb 14 13:02 src
4.0K drwxr-xr-x 6 mkyong mkyong 4.0K Feb 17 19:44 target
5.2 sudo docker build -t name:tag .
$ pwd
/home/mkyong/projects/docker-spring-boot
$ sudo docker build -t spring-boot:1.0 .
Sending build context to Docker daemon 19.12MB
Step 1/5 : FROM adoptopenjdk/openjdk11:alpine-jre
---> 9aa3eab0cec0
Step 2/5 : ARG JAR_FILE=target/spring-boot-web.jar
---> Running in 14b8291509cb
Removing intermediate container 14b8291509cb
---> efc9e83cec99
Step 3/5 : WORKDIR /opt/app
---> Running in 844380f977af
Removing intermediate container 844380f977af
---> 5de2390296cc
Step 4/5 : COPY ${JAR_FILE} app.jar
---> d826c8181a83
Step 5/5 : ENTRYPOINT ["java","-jar","app.jar"]
---> Running in aa572b8d487b
Removing intermediate container aa572b8d487b
---> 468b2f899083
Successfully built 468b2f899083
Successfully tagged spring-boot:1.0
5.3启动/opt/app/app.jar
容器spring-boot:1.0
,在启动过程中运行/opt/app/app.jar
文件。
- 添加
run -d
以分离模式启动容器–在后台运行容器。 - 将
run -p
添加到映射端口。
$ sudo docker run -d -p 8080:8080 -t spring-boot:1.0
![输出](https://i-blog.csdnimg.cn/blog_migrate/890ab7a8f4018fc7906fd77592be040d.png)
很少有其他示例可以启动容器
$ sudo docker run -d -p 80:8080 -t spring-boot:1.0
$ sudo docker run -d -p 443:8443 -t spring-boot:1.0
$ sudo docker run -d -p 80:8080 -p 443:8443 -t spring-boot:1.0
完成后,我们对Spring Boot应用程序进行了docker化。
6.常见问题
6.1列出所有容器
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e36a2c0c241 spring-boot:1.0 "java -jar app.jar" 13 seconds ago Up 12 seconds 0.0.0.0:8080->8080/tcp elegant_euler
6.2按容器ID停止容器。
$ sudo docker stop 3e36a2c0c241
6.3如何部署容器?
最快的方法是标记图像并将其推送到官方docker hub,然后将容器拉回到服务器。
建立图片'name:tag'。
$ cd project
$ sudo docker build -t spring-boot:1.0 .
首先标记,然后再推送到Docker Hub。
$ sudo docker image tag spring-boot:1.0 your_id/spring-boot:1.0
$ sudo docker image push your_id/spring-boot:1.0
``
In production server.
```bash
$ sudo docker pull your_id/spring-boot:1.0
$ sudo docker run -d -p 80:8080 -t spring-boot:1.0
6.4对于SSL,在application.properties
声明证书(jks或p12),从端口8443
开始(可配置)
# SSL
server.port=8443
server.ssl.key-store=cert.p12
server.ssl.key-store-password=123
server.ssl.keyStoreType=PKCS12
启动Docker容器并将https 433
映射到8443
。
$ docker run -d -p 443:8443 -t spring-boot:1.0
注意
您可能喜欢这个docker Java应用程序示例 。
下载源代码
$ git clone https://github.com/mkyong/docker-java
$ cd docker-spring-boot
$ mvn清洁包
$ java -jar target / spring-boot-web.jar访问http:// localhost:8080
// dockerize
//创建一个docker镜像
$ sudo docker build -t spring-boot:1.0。
// 运行
$ sudo docker run -d -p 8080:8080 -t spring-boot:1.0访问http:// localhost:8080