Docker + Spring Boot示例

码头工人Spring启动

在本教程中,我们将向您展示如何对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项目结构。

项目结构

在项目的根部看到Dockerfile吗? 我们只需要此Dockerfile文本文件即可对Spring Boot应用程序进行Docker化。

2. Maven

2.1项目依赖性。 这里没有什么特别的,只是一些Spring Boot依赖项。

pom.xml
<?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启动所有内容,并返回一个控制器。

App.java
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百里香页。

index.html
<!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

输出

完成后,接下来,我们将在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示例。

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的文件夹。

Terminal
$ 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 .

Terminal
$ 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添加到映射端口。
Terminal
$ sudo docker run -d -p 8080:8080 -t spring-boot:1.0

输出

很少有其他示例可以启动容器

Terminal
$ 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开始(可配置)

application.properties
# 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

参考文献

翻译自: https://mkyong.com/docker/docker-spring-boot-examples/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值