用 Docker 构建、运行、发布一个 Spring Boot 应用

1.安装docker略去

2.创建testDocker项目,创建方式:

在http://start.spring.io/中创建项目

用 Docker 构建、运行、发布一个 Spring Boot 应用

3.将项目引入eclipse

4.入口类方法中添加

@SpringBootApplication
@RestController
public class TestDockerApplication
{
    
    @RequestMapping("/")
    public String home()
    {
        return "Hello Docker World." + "<br />Welcome to <a href='http://waylau.com'>waylau.com</a></li>";
    }
    
    public static void main(String[] args)
    {
        SpringApplication.run(TestDockerApplication.class, args);
    }
}

5.运行程序

使用maven

编译:maven clean

运行: java -jar target/testDocker-0.0.1-SNAPSHOT.jar

访问项目
如果程序正确运行,浏览器访问 http://localhost:8080/,可以看到页面 “Hello Docker World.” 字样。


6.将项目容器化
Docker 使用 Dockerfile 文件格式来指定 image 层,


创建文件 src/main/docker/Dockerfile:


FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD testDocker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

解释下这个配置文件:


VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 "app.jar" 添加到容器的
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source


7.构建 Docker Image
执行构建成为 docker image:


mvn package docker:build


8.运行

docker run -p 8080:8080 -t jyd/testdocker


然后访问http://localhost:8080/,一切正常


说明:重点看下pom文件中配置


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- tag::plugin[] -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>${
docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
           <!-- end::plugin[] -->
</plugins>
</build>


<properties>
    <docker.image.prefix>jyd</docker.image.prefix>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>


其中${project.artifactId} 的名字要求不能有大写字母,所以我的项目中把这里写死了,用得testdocker


参照文章:https://yq.aliyun.com/articles/47344