使用Docker部署打包发布springboot项目
作者:烟雨观春柳 发布时间:2023-05-01 02:45:51
前言
从安装docker到多种方式打包发布,编译,镜像,容器等问题,遇到种种问题,终于不负所望,一步步解决,本文我会比较大跨度的来说明一切解决办法。
第一:环境
1.虚拟机安装的centos7。
2.docker已安装好,不会的可以参看我的docker安装文章。
3。搞一个很简单的springboot项目即可,先搞定发布编译再说。
第二:开始描述从搞项目到docker发布:
1.springboot项目代码:
层次图:
哈哈,红叉叉忽略就行了,我的环境问题,无所谓。
代码: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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.king</groupId>
<artifactId>springdocker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springdocker</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--properties节点中设置docker镜像的前缀“springboot”-->
<docker.image.prefix>springdemo</docker.image.prefix>
<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-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>0.4.3</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>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
2:Dockerfile文件
FROM java:8
VOLUME /tmp
ADD springdocker-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
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
3:其余代码:
package com.king.springdocker.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value="/demo")
public class helloController {
@RequestMapping(value="/hello")
public String hello() {
return "hello king!!!!!!";
}
}
========applicationProperties========
server.port=80
server.servlet.context-path=/king
=============================
package com.king.springdocker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringdockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringdockerApplication.class, args);
}
}
=====================================
第三:
1.xhell进入服务器,我是在/home/下创建文件夹king,本地用开发工具将项目打包,将所打jar包和Dockerfile,放入king目录下。如图所示:
2.执行如下命令:
docker build -t hellodocker .
命令解释:hellodocker名字随你喜欢,镜像名自己起,-t就是代表要构建的镜像tag。
不要忘记点,点是代表是在当前目录,也就是现在Dockerfile文件所在的目录。
[root@localhost king]# docker build -t hellodocker .
Sending build context to Docker daemon 17.36MB
Step 1/6 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
---> Running in a6293dd37995
Removing intermediate container a6293dd37995
---> 08f10f02092e
Step 3/6 : ADD springdocker-0.0.1-SNAPSHOT.jar app.jar
---> c4eaf809b297
Step 4/6 : RUN sh -c 'touch /app.jar'
---> Running in 6c8a30b4220f
Removing intermediate container 6c8a30b4220f
---> dba5ee5d2d27
Step 5/6 : ENV JAVA_OPTS=""
---> Running in 25f5b705eb27
Removing intermediate container 25f5b705eb27
---> e1982350619d
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
---> Running in f98b4cc2f63b
Removing intermediate container f98b4cc2f63b
---> 1d881201c9c5
Successfully built 1d881201c9c5
Successfully tagged hellodocker:latest
3.docker images,查看如下图:
hellodocker成功出现。现在开始执行,打开浏览器,ip端口地址访问,哎呦喂,不行哦,看下咋回事。
发现原来是我开启的是80端口,所以说网上各种教程例子,看多了容易照搬,还是自己思考好。
改为:docker run -d -p 80:80 hellodocker。
嗯,重新访问地址,好,搞定,成功打印:hello king!!!!!!
第四:各种错误教训集合。
之前网上找资料,这个博客,那个博客,结果呢,不是这种就是那种错,哎,也怨不得别人,谁能说那么详细呢。总结下:
错误一:Dockerfile文件为:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD springdocker-0.0.1-SNAPSHOT.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" ]
报错如下:
Sending build context to Docker daemon 17.36MB
Step 1/6 : FROM frolvlad/alpine-oraclejdk8:slim
pull access denied for frolvlad/alpine-oraclejdk8, repository does not exist or may require 'docker login'
也是无语了,FROM换了好多没搞定,又是搞各种镜像,又是配置的,最后反正是改为:FROM java:8,搞定了,这个呢,看下docker命令介绍,好好理解下用法:
docker概念
1、docker:最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker。
2、dockerfile:它是Docker镜像的描述文件,可以理解成火箭发射的A、B、C、D……的步骤。
3、docker镜像:通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
4、docker容器:是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
dockerfile指令
Dockerfile由多条指令组成,每条指令在编译镜像时执行相应的程序完成某些功能,由指令+参数组成,以逗号分隔,#作为注释起始符,虽说指令不区分大小写,但是一般指令使用大些,参数使用小写
错误2:
之前还用过将项目整体放到服务器,然后用命令:mvn package docker:build,去打包编译,结果报错,其实也是由于Dockerfile的from来源不对。报错如下:
来源:https://www.cnblogs.com/emperorking/articles/11244253.html
猜你喜欢
- xampp 把apache mysql, php, phpmyadmin都integrate在一起, 很好安装,操作简单,但是也有弊端。 用
- 试验环境1.一台安装有RHEL5的计算机;2.系统安装盘;试验内容1.安装nfs软件包2.配置nfs服务器3.nfs服务器管理4.客户端测试
- 在论坛更换域名后,由于地址发生了变化,导致一些还是保留原地址的链接发生错误,表现为图片不显示,附件不能下载等一些问题。解决这些问题的根本办法
- 1.官方简介grep是linux的常用命令,用于对文件和文本执行重复搜索任务的Unix工具,可以通过grep命令指定特定搜索条件来搜索文件及
- 如果看到这个标题,你有一些疑问,那你更要看完这篇文章,对于新手来说,购买WordPress空间之后,需要做的事情很多,Wopus这里列举出一
- 北京时间10月12日消息,据国外媒体报道,一份政府机构声明显示,德国总理默克尔对谷歌的图书扫描计划表示反对,这位女总理希望藉此在网上保护作者
- “世界上最愚蠢的人,就是自以为聪明的人;同样,最想自己发财的人,往往也发不了财。”与以往特立独行的马云一样,如今马云依旧是妙语连珠。在人们频
- SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。但是你只须记住下面的内容--该协议的基本命令和方法就行了。协议
- 一,需求1,虚拟用户登录由于之前配置成功了postfix+MySQL虚拟用户登录,体会到了使用虚拟用户的好处和灵活性,所以这次也考虑采用虚拟
- 远程桌面服务所使用的通信协议是Microsoft定义RDP(Reliable Data Protocol)协议,RDP协
- 1. 关键词密度关键词除了需要出现在标题里面,还需要在整个网页里面以一定的频率出现。你需要在标题、段落内容、(文字内容的)页头和页尾、Alt
- 从前两天开始,无数MSN用户在登录时,莫名其妙地吃到闭门羹。记者了解到,微软近期正在全国范围内启动大规模强制升级,用户若不按要求点“是”同意
- 经常听到读计算机专业学生,毕业之后发出感叹:“我在大学什么也没学到,现在计算机的东西都不会!”。就其原因来看,不外乎是其一,学生自身原因。有
- 一、遵循W3C规范W3C是英文 World Wide Web Consortium 的缩写,中文意思是W3C理事会或万维网联盟。W3C于19
- Web性能优化最佳实践中最重要的一条是减少HTTP请求,它也是YSlow中比重最大的一条规则。减少HTTP请求的方案主要有合并JavaScr
- 为了更好的解决虚拟机与主机的共享问题,VMware公司有一个VMWare-tools,来实现文件共享。这里主要讲的是在Windows下用 V
- Linux中的硬链接和软链接软链接和硬链接命令lnln是创建链接的命令:创建硬链接:ln file link创建软链接:ln -s file
- linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间、堆、栈......副本(采用写时 * 制),子进程将会
- 本人亲身经验,站长建站,百度最快11天3号就收录了,google慢点11月9号才收录,不过10天之内能收录还是归功于以下方法!1.在忙活了一
- Google Web Fonts 免费为你的博客提供安全而漂亮的字体服务。通过使用Google Web Fonts,你的博客不用上传任何字体