使用Docker部署打包發(fā)布springboot項(xiàng)目
前言
從安裝docker到多種方式打包發(fā)布,編譯,鏡像,容器等問(wèn)題,遇到種種問(wèn)題,終于不負(fù)所望,一步步解決,本文我會(huì)比較大跨度的來(lái)說(shuō)明一切解決辦法。
第一:環(huán)境
1.虛擬機(jī)安裝的centos7。
2.docker已安裝好,不會(huì)的可以參看我的docker安裝文章。
3。搞一個(gè)很簡(jiǎn)單的springboot項(xiàng)目即可,先搞定發(fā)布編譯再說(shuō)。
第二:開始描述從搞項(xiàng)目到docker發(fā)布:
1.springboot項(xiàng)目代碼:
層次圖:

哈哈,紅叉叉忽略就行了,我的環(huán)境問(wèn)題,無(wú)所謂。
代碼: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節(jié)點(diǎn)中設(shè)置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指定了臨時(shí)文件目錄為/tmp。其效果是在主機(jī)/var/lib/docker目錄下創(chuàng)建了一個(gè)臨時(shí)文件,并鏈接到容器的/tmp。改步驟是可選的,
如果涉及到文件系統(tǒng)的應(yīng)用就很有必要了。/tmp目錄用來(lái)持久化到 Docker 數(shù)據(jù)文件夾,因?yàn)?Spring Boot 使用的內(nèi)嵌 Tomcat 容器默認(rèn)使用/tmp作為工作目錄
項(xiàng)目的 jar 文件作為 “app.jar” 添加到容器的
ENTRYPOINT執(zhí)行項(xiàng)目 app.jar。為了縮短Tomcat 啟動(dòng)時(shí)間,添加一個(gè)系統(tǒng)屬性指向 “/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進(jìn)入服務(wù)器,我是在/home/下創(chuàng)建文件夾king,本地用開發(fā)工具將項(xiàng)目打包,將所打jar包和Dockerfile,放入king目錄下。如圖所示:

2.執(zhí)行如下命令:
docker build -t hellodocker .
命令解釋:hellodocker名字隨你喜歡,鏡像名自己起,-t就是代表要構(gòu)建的鏡像tag。
不要忘記點(diǎn),點(diǎn)是代表是在當(dāng)前目錄,也就是現(xiàn)在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成功出現(xiàn)。現(xiàn)在開始執(zhí)行,打開瀏覽器,ip端口地址訪問(wèn),哎呦喂,不行哦,看下咋回事。
發(fā)現(xiàn)原來(lái)是我開啟的是80端口,所以說(shuō)網(wǎng)上各種教程例子,看多了容易照搬,還是自己思考好。
改為:docker run -d -p 80:80 hellodocker。
嗯,重新訪問(wèn)地址,好,搞定,成功打印:hello king!!!!!!
第四:各種錯(cuò)誤教訓(xùn)集合。
之前網(wǎng)上找資料,這個(gè)博客,那個(gè)博客,結(jié)果呢,不是這種就是那種錯(cuò),哎,也怨不得別人,誰(shuí)能說(shuō)那么詳細(xì)呢??偨Y(jié)下:
錯(cuò)誤一: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" ]
報(bào)錯(cuò)如下:
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'
也是無(wú)語(yǔ)了,F(xiàn)ROM換了好多沒搞定,又是搞各種鏡像,又是配置的,最后反正是改為:FROM java:8,搞定了,這個(gè)呢,看下docker命令介紹,好好理解下用法:
docker概念
1、docker:最早是dotCloud公司出品的一套容器管理工具,但后來(lái)Docker慢慢火起來(lái)了,連公司名字都從dotCloud改成Docker。
2、dockerfile:它是Docker鏡像的描述文件,可以理解成火箭發(fā)射的A、B、C、D……的步驟。
3、docker鏡像:通過(guò)Dockerfile做出來(lái)的,包含操作系統(tǒng)基礎(chǔ)文件和軟件運(yùn)行環(huán)境,它使用分層的存儲(chǔ)方式。
4、docker容器:是運(yùn)行起來(lái)的鏡像,簡(jiǎn)單理解,Docker鏡像相當(dāng)于程序,容器相當(dāng)于進(jìn)程。
dockerfile指令
Dockerfile由多條指令組成,每條指令在編譯鏡像時(shí)執(zhí)行相應(yīng)的程序完成某些功能,由指令+參數(shù)組成,以逗號(hào)分隔,#作為注釋起始符,雖說(shuō)指令不區(qū)分大小寫,但是一般指令使用大些,參數(shù)使用小寫

錯(cuò)誤2:
之前還用過(guò)將項(xiàng)目整體放到服務(wù)器,然后用命令:mvn package docker:build,去打包編譯,結(jié)果報(bào)錯(cuò),其實(shí)也是由于Dockerfile的from來(lái)源不對(duì)。報(bào)錯(cuò)如下:

到此這篇關(guān)于使用Docker部署打包發(fā)布springboot項(xiàng)目的文章就介紹到這了,更多相關(guān)Docker部署打包發(fā)布springboot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于SpringBoot的Docker部署實(shí)踐
- 使用docker部署springboot項(xiàng)目到服務(wù)器的詳細(xì)過(guò)程
- docker Compose部署springboot+vue前端端分離
- idea快速實(shí)現(xiàn)將SpringBoot項(xiàng)目打包Docker鏡像并部署
- Docker部署springboot項(xiàng)目到騰訊云的實(shí)現(xiàn)步驟
- Docker快速部署SpringBoot項(xiàng)目介紹
- IDEA通過(guò)Docker插件部署SpringBoot項(xiàng)目的過(guò)程詳解
- idea整合docker快速部署springboot應(yīng)用的詳細(xì)過(guò)程
- SpringBoot?docker項(xiàng)目部署實(shí)戰(zhàn)
相關(guān)文章
Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解
bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上,下面這篇文章主要給大家介紹了關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-01-01
docker-compose up -d和docker-compose up -
本文主要介紹了docker-compose up -d和docker-compose up --build的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
綁定Dokcer容器到主機(jī)指定網(wǎng)卡的方法
這篇文章主要介紹了綁定 Dokcer 容器到主機(jī)指定網(wǎng)卡的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
詳解Docker掛載本地目錄及實(shí)現(xiàn)文件共享的方法
本篇文章主要介紹了詳解Docker掛載本地目錄及實(shí)現(xiàn)文件共享的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
解決Docker啟動(dòng)Elasticsearch7.x報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決Docker啟動(dòng)Elasticsearch7.x報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
docker學(xué)習(xí)筆記之把容器commit成鏡像的方法
本篇文章主要介紹了docker學(xué)習(xí)筆記之把容器commit成鏡像,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

