久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么用Docker構建、運行、發布來一個Spring Boot應用

159次閱讀
沒有評論

共計 10896 個字符,預計需要花費 28 分鐘才能閱讀完成。

這篇文章主要介紹了怎么用 Docker 構建、運行、發布來一個 Spring Boot 應用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

Docker 簡介

Docker 是一個 Linux 容器管理工具包,具備“社交”方面,允許用戶發布容器的 image (鏡像),并使用別人發布的 image。Docker image 是用于運行容器化進程的方案,在本文中,我們將構建一個簡單的 Spring Boot 應用程序。

有關 Docker 的詳細介紹,可以移步至《簡述 Docker》

前置條件

JDK 1.8+

Maven 3.0+

Docker 最新版。有關 Docker 在的安裝,可以參閱《Docker 在 CentOS 下的安裝、使用》。如果你的電腦不是 Linux 系統,最好裝個虛擬機,在虛擬機里面裝個 Linux,因為 Docker 的依賴 Linux。

用 Maven 構建項目創建目錄結構

項目的目錄結構因符合 Maven 的約定。

在 *nix 系統下執行 mkdir -p src/main/java/docker_spring_boot , 生產如下結構 :

└── src
 └── main
 └── java
 └── com
 └── waylau
 └── docker_spring_boot

創建 pom.xml 文件

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/maven-v4_0_0.xsd 
 modelVersion 4.0.0 /modelVersion 
 groupId com.waylau /groupId 
 artifactId docker-spring-boot /artifactId 
 packaging jar /packaging 
 version 1.0.0 /version 
 name docker-spring-boot /name 
 description Getting started with Spring Boot and Docker /description 
  parent 
  groupId org.springframework.boot /groupId 
  artifactId spring-boot-starter-parent /artifactId 
  version 1.3.3.RELEASE /version 
  relativePath/ 
  /parent 
 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 
  !-- 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 
 properties 
 project.build.sourceEncoding UTF-8 /project.build.sourceEncoding 
 docker.image.prefix waylau /docker.image.prefix 
 spring.boot.version 1.3.3.RELEASE /spring.boot.version 
 /properties 
 /project

Spring Boot Maven plugin 提供了很多方便的功能:

它收集的類路徑上所有 jar 文件,并構建成一個單一的、可運行的“über-jar”,這使得它更方便地執行和傳輸服務。

它搜索的 public static void main() 方法來標記為可運行的類。

它提供了一個內置的依賴解析器,用于設置版本號以匹配 Spring Boot 的依賴。您可以覆蓋任何你想要的版本,但它會默認選擇的 Boot 的版本集。

Spotify 的 docker-maven-plugin 插件是用于構建 Maven 的 Docker Image

imageName 指定了鏡像的名字,本例為 waylau/docker-spring-boot

dockerDirectory 指定 Dockerfile 的位置

resources 是指那些需要和 Dockerfile 放在一起,在構建鏡像時使用的文件,一般應用 jar 包需要納入。本例,只需一個 jar 文件。

編寫 Spring Boot 應用

編寫一個簡單的 Spring Boot 應用:

src/main/java/com/waylau/docker_spring_boot/Application.java:

package com.waylau.docker_spring_boot;
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;
 
 *  主應用入口
 * @author  a href= http://waylau.com waylau.com /a 
 * @date 2016 年 3 月 19 日
 */
@SpringBootApplication
@RestController
public class Application {@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(Application.class, args);
}

解釋下上面的代碼:

類用 @SpringBootApplication @RestController 標識, 可用 Spring MVC 來處理 Web 請求。

@RequestMapping 將 / 映射到 home(),并將 Hello Docker World 文本作為響應。

main() 方法使用 Spring Boot 的 SpringApplication.run() 方法來啟動應用。

運行程序使用 Maven

編譯:

mvn package

運行:

java -jar target/docker-spring-boot-1.0.0.jar

訪問項目

如果程序正確運行,瀏覽器訪問 http://localhost:8080/,可以看到頁面“Hello Docker World.”字樣。

將項目容器化

Docker 使用 Dockerfile 文件格式來指定 image 層,

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

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD docker-spring-boot-1.0.0.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

構建 Docker Image

執行構建成為 docker image:

mvn package docker:build

運行

運行 Docker Image

docker run -p 8080:8080 -t waylau/docker-spring-boot

[root@waylau spring-boot]# docker run -p 8080:8080 -t waylau/docker-spring-boot
 . ____ _ __ _ _
 /\\ / ___ _ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ |  _ |  _| |  _ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
   |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.3.3.RELEASE)
2016-03-20 08:45:51.276 INFO 1 --- [ main] c.waylau.docker_spring_boot.Application : Starting Application v1.0.0 on 048fb623038f with PID 1 (/app.jar started by root in /)
2016-03-20 08:45:51.289 INFO 1 --- [ main] c.waylau.docker_spring_boot.Application : No active profile set, falling back to default profiles: default
2016-03-20 08:45:51.722 INFO 1 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy
2016-03-20 08:45:54.874 INFO 1 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean  beanNameViewResolver  with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2016-03-20 08:45:57.893 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-03-20 08:45:57.982 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2016-03-20 08:45:57.984 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.32
2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 6877 ms
2016-03-20 08:45:59.672 INFO 1 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet:  dispatcherServlet  to [/]
2016-03-20 08:45:59.695 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:  characterEncodingFilter  to: [/*]
2016-03-20 08:45:59.701 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:  hiddenHttpMethodFilter  to: [/*]
2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:  httpPutFormContentFilter  to: [/*]
2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:  requestContextFilter  to: [/*]
2016-03-20 08:46:00.862 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy
2016-03-20 08:46:01.166 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped  {[/]}  onto public java.lang.String com.waylau.docker_spring_boot.Application.home()
2016-03-20 08:46:01.189 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped  {[/error],produces=[text/html]}  onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2016-03-20 08:46:01.190 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped  {[/error]}  onto public org.springframework.http.ResponseEntity java.util.Map java.lang.String, java.lang.Object  org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-03-20 08:46:01.438 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-03-20 08:46:01.833 INFO 1 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-03-20 08:46:02.332 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-03-20 08:46:02.343 INFO 1 --- [ main] c.waylau.docker_spring_boot.Application : Started Application in 13.194 seconds (JVM running for 15.828)

推送 image 到 Docker Hub

首先,你在 Docker Hub 要有注冊賬號,且創建了相應的庫;

其次,docker 推送前,先要登錄,否則報 unauthorized: access to the requested resource is not authorized 的錯誤

執行:

docker login

[root@waylau spring-boot]# docker login
Username: waylau
Password: 
Email: waylau521@gmail.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded

執行推送

docker push waylau/docker-spring-boot

[root@waylau spring-boot]# docker push waylau/docker-spring-boot
The push refers to a repository [docker.io/waylau/docker-spring-boot]
751d29eef02e: Layer already exists 
4da3741f39c7: Pushed 
5f70bf18a086: Layer already exists 
7e4d0cb13643: Layer already exists 
8f045733649f: Layer already exists 
latest: digest: sha256:eb4d5308ba1bb27489d808279e74784bda6761b3574f4298d746abba59b35164 size: 9415

鏡像加速器

Docker Hub 在國外,有時候拉取 Image 極其緩慢,可以使用國內的鏡像來實現加速

阿里云源

echo  DOCKER_OPTS=\ --registry-mirror=https://yourlocation.mirror.aliyuncs.com\  | sudo tee -a /etc/default/docker
sudo service docker restart

DaoCloud

sudo echo “DOCKER_OPTS=\”\$DOCKER_OPTS –registry-mirror=http://your-id.m.daocloud.io -d\””   /etc/default/docker
sudo service docker restart

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“怎么用 Docker 構建、運行、發布來一個 Spring Boot 應用”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計10896字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 宜都市| 讷河市| 淳安县| 卢氏县| 洪洞县| 汉寿县| 天水市| 浮山县| 阿荣旗| 于田县| 云林县| 页游| 通海县| 邻水| 青阳县| 门头沟区| 皮山县| 上杭县| 图片| 南充市| 普兰店市| 永平县| 淮安市| 西昌市| 宿州市| 盈江县| 木里| 固安县| 长垣县| 天柱县| 离岛区| 大同县| 海阳市| 连平县| 綦江县| 连州市| 松江区| 巴里| 克东县| 珲春市| 贺兰县|