共計 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 行業資訊頻道,更多相關知識等著你來學習!