Docker容器化spring boot应用详解
作者:ithaka 发布时间:2023-09-10 00:20:15
前置条件
容器化spring boot应用所需环境:
jdk 1.8 +
maven 3.0 +
我们的需求是:使用maven打包,将spring boot应用制作成docker镜像并上传到docker hub。在其他机器上,可以直接docker pull并运行容器。
创建spring boot应用
spring boot 包结构为:
└── src
└── main
└── java
└── me
└── ithakar
创建spring boot Application主类,src/main/java/me/ithakar/Application.java
package me.ithakar;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "docker app running";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
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>me.ithakar</groupId>
<artifactId>docker-app</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
打包并启动应用
mvn package && java -jar target/docker-app-0.1.0.jar
访问 http://localhost:8080/ ,获得响应:
docker app running
则spring boot应用启动成功
创建Dockerfile文件
Dockerfile是一个文本文件,类似shell脚本,其内包含了一条条的指令。每一条指令的内容,就是描述对应的镜像层应当如何构建。
Dockerfile位置:src/main/docker/Dockerfile
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD docker-app-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
FROM 命令指定基础镜像,以一个镜像为基础,在其上进行定制。在这里我们的基础镜像是frolvlad/alpine-oraclejdk8:slim。
VOLUME 定义匿名卷。对于可能需要操作数据库类需要保存动态数据的应用,其数据文件应该保存在主句的卷,而不是容器的储存层。在这里我们是将其挂载在了/tmp这个位置,从而保证了容器的无状态化。
ADD 命令是较高级的复制命令,将jar包复制到/app.jar
ENTRYPOINT 容器运行后默认执行的命令
添加maven docker插件
docker maven插件是为了方便java开发者,由spotify公司开发的一款maven插件。添加以下代码至pom.xml文件中。
<properties>
<docker.image.prefix>ithaka</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<pushImage>true</pushImage>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
注意,docker.image.prefix中的ithaka为我的docker hub 账户,使用时将其换成自己的
使用maven命令打包应用、构建docker镜像并上传镜像到docker hub:
mvn package docker:build -DpushImage
此时我们将得到一个报错:
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build (default-cli) on project docker-app: Exception caught: denied: requested access to the resource is denied
这是因为我们在maven中push时,并没有包含docker的用户信息,所以权限校验失败。
解决方法为,在maven全局setting.xml配置中,添加docker hub server信息
<server>
<id>docker-hub</id>
<username>ithaka</username>
<password>密码</password>
<configuration>
<email>邮箱</email>
</configuration>
</server>
在pom.xml中的docker-maven-plugi插件中,指定server
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
再继续执行
mvn package docker:build -DpushImage
出现
The push refers to a repository [docker.io/ithaka/docker-app]
8c02854cd300: Pushed
a03c3b5dbe04: Pushed
8018d52798bb: Pushed
1e6468b956ae: Pushed
3fb66f713c9f: Pushed0.0.1: digest: sha256:63456345745755577c19103dcf4838894e34d45a68a1ec23b2f69d6f059 size: 1375
即为上传docker hub成功。
启动docker容器
在另外一台机器上,执行命令
docker run -p 8080:8080 -t ithaka/docker-app
访问http://ip:8080/ ,获得响应:
docker app running
docker应用启动成功
参考文档:
Spring Boot with Docker
docker-maven-plugin
来源:https://segmentfault.com/a/1190000009618531


猜你喜欢
- 在这个被Ajax技术统治的互联网时代,很多Ajax程序都会在异步读取数据的同时,显示一个正在读取或Loading的动画。今天彬Go要向大家推
- 一提到网上搜索信息,大家马上就会想到百度(Baidu)、谷歌(Google)或者是雅虎(Yahoo)等知名搜索网站。然而最近,一款综合了百度
- V5Shop联盟系统第三方嵌入式整合接口开通通过不断研发,风靡一时的V5SHOP联盟系统今日终于再次发布一大功能模块-----第三方网店系统
- 将证书导入网站目录为了让目标网站所对应的目录文件信息全部使用SSL加密传输功能,我们需要将前面申请好的网站证书导入到目标网站所对应的目录中;
- 目前,市场上有多种Internet邮件服务器产品供选择,这些邮件服务器产品价格各异,所提供的功能也有不少差别。对于网络管理员来说,如何根据自
- 最近看到一些文章关于站内搜索和用户体验的文章,一般都说的是第三方提供的,其实织梦就有一个很好的站内搜索,我们完全可以利用这一功能,提高用户体
- 您是不是在为不知道怎样提高网站上的广告单价而烦恼?那么就好好学习一下我们今天的这篇文章吧!在Google AdSense 系统投放广告时,网
- 要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如
- 从2008年起,我开始了网络编辑的生涯,一开始确实不明白网站这些事情是做什么的,但是我慢慢对网站运营也熟悉起来。我觉得做网站和心态有很大的关
- 理论基础: 点击率越低,广告分成越低。问题:众所周知,一般访问并不点击广告。大部分网站广告点击90%是来自搜索引擎的用户看到的第一个页面。另
- 国防部网站截图对话嘉宾:国防部网站总编辑 季桂林【核心阅读】国防部新闻事务局设立、新闻发言人亮相…&
- 今天一早例行操作,打开我的邮箱,一封“您已成功获得百度主题推广服务”的邮件映入我的眼帘,开始我还以为看错了,后来点进去从头到尾仔细看了几篇,
- 线程线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。可以把线程看成是操作系统分配CPU时间的基本单元。一个进程可以拥有一个至多个
- ftp 文件传输服务,其余的不多讲了,直接进入主题。今天我给大家说的是使用vsftpd架设ftp服务器,希望对大家有所帮助。A 安装vsft
- 根据对一些站长的最新调查显示,百度收录新网站的大约时间是2周。也就是说,新站做好了,需要等2周时间才能在百度收录。只有很少一部分幸运的站长,
- 一年前,个人中心1.0版本成功发布,成为了登录QQ空间用的首页,为广大用户提供一个查看动态、便捷互动、玩转应用的一站式平台,开始了QQ空间从
- linux杀掉指定端口1、查看端口netstat -ntlp2、杀掉端口kill 端口3、重启服务service nginx&nb
- 由淘宝网TOP开放平台发起的以“赢在淘宝-TOP应用大赛”于2009年9月1日启动至今,吸引了包括杭州光云软件公司在内的众多国内顶尖优秀技术
- Godaddy主机用户如果想在服务器上恢复干净设置,可以重置服务器。重置会擦除服务器的硬盘驱动上的所有内容。服务器恢复到购买它时的状态。可以
- 内容摘要:Google AdSesne一直在努力寻找、测试新的广告方式,就像上次Simon发现AFC广告组中有连结组的新Googl