??上篇文章介紹了SpringBoot關(guān)于jar和war部署:SpringBoot 打包部署(十一),本篇繼續(xù)介紹關(guān)于項目的部署:Docker部署Spring Boot。
一、Docker簡介
??Docker 是一個開源的應(yīng)用容器引擎,基于Go 語言并遵從Apache2.0協(xié)議開源。
??Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。
??容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
二、適合的版本
- Docker對系統(tǒng)及內(nèi)核的要求:
??Docker 運行在 CentOS 7 上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 3.10 以上。
??Docker 運行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 2.6.32-431 或者更高版本。
- Docker支持以下的CentOS版本:
??CentOS 6.5 (64-bit) 或更高的版本
??CentOS 7 (64-bit)---首選(本篇文章基于Centos7介紹)
- Docker 支持以下的 Ubuntu 版本:
??Ubuntu Precise 12.04 (LTS)
??Ubuntu Trusty 14.04 (LTS)
??Ubuntu Wily 15.10
三、環(huán)境準備
??Docker部署SpringBoot項目之前,請確保安裝了JDK、Maven以及Docker。JDK與Maven的安裝本章就不做介紹了,請自行搜百度。
??本篇文章測試基于Linux CentOS 7,所以Docker要求CentOS 7 系統(tǒng)的內(nèi)核版本高于3.10,先查看你的系統(tǒng)是否支持docker。
- 通過命令 uname -r 查看
[root@moabZ ~]# uname -r3.10.0-862.6.3.el7.x86_64
- yum安裝docker
yum install docker
- 安裝好后,啟動docker并設(shè)置開啟自啟動
service docker start
chkconfig docker on
??也可用CentOS7支持的新式systemmd語法,如下
systemctl start docker.service //啟動
systemctl enable docker.service //設(shè)置開啟自啟動
- 配置國內(nèi)加速鏡像服務(wù),修改保存后重啟 Docker 以使配置生效。
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]}
//重啟Docker使配置生效systemctl restart docker
- 輸入docker version命令,返回docker版本相關(guān)信息,證明docker安裝成功。
四、SpringBoot項目
- 添加pom依賴
<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>
- 創(chuàng)建TestDockerController
@RestController
public class TestDockerController {
@RequestMapping("/")
public String index() {
return "Hello,this is my first Docker!";
}
}
在TestController中添加一個index()方法,訪問返回:Hello,this is my first docker。
- 啟動類
@SpringBootApplication
public class SpringbootDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDockerApplication.class, args);
}
}
??啟動項目后,瀏覽器訪問:http://ip地址:8080/,頁面返回:Hello,this is my first docker!,說明 Spring Boot 項目配置正常。
五、配置Docker
- 在pom里添加Docker插件
<!--添加 Docker鏡像名稱springbootdocker-->
<properties>
<docker.image.prefix>springbootdocker</docker.image.prefix>
</properties>
<!--在build的 plugins中添加 Docker構(gòu)建插件 -->
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</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>
<!-- Docker maven plugin -->
上述pom.xml包含了docker-maven-plugin的配置:
imageName指定了鏡像的名字,上述的鏡像名稱就是springbootdocker。
dockerDirectory指定Dockerfile的位置,也就是在src/main/docker目錄下創(chuàng)建Dockerfile。
resources是指那些需要和Dockerfile放在一起,在構(gòu)建鏡像時使用的文件。
- 創(chuàng)建Dockerfile
??在src/main/docker目錄下創(chuàng)建Dockerfile,此主要為了說明如何來構(gòu)建鏡像。
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD springboot-dockerr-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
??FROM openjdk:8-jdk-alpine是指Docker Hub上官方提供的java鏡像,版本號是8也就是jdk1.8,有了這個基礎(chǔ)鏡像后,Dockerfile可以通過FROM指令直接獲取它的狀態(tài)——也就是在容器中java是已經(jīng)安裝的。
??VOLUME ,我們添加了一個VOLUME指向/ tmp的內(nèi)容,因為這是Spring Boot應(yīng)用程序默認為Tomcat創(chuàng)建工作目錄的地方。效果是在/var/lib/docker下的主機上創(chuàng)建一個臨時文件,并將其鏈接到/tmp下的容器。
??ADD springboot-dockerr-0.0.1-SNAPSHOT.jar將應(yīng)用jar包復(fù)制到/app.jar
??ENTRYPOINT表示容器運行后默認執(zhí)行的命令。為了縮短 Tomcat 的啟動時間,添加java.security.egd的系統(tǒng)屬性指向/dev/urandom作為 ENTRYPOINT。
六、Docker部署項目
-
打包
把新建的項目拷貝到服務(wù)器上,進入項目路徑下進行打包
mvn package
-
構(gòu)建docker鏡像
?構(gòu)建鏡像有兩種方式:
方式一:在
Linux里創(chuàng)建一個docker文件夾,里面放置Dockerfile和SpringBoot打包的項目springboot-docker-0.0.1-SNAPSHOT.jar,在該docker文件下執(zhí)行docker build -t dockerName .執(zhí)行
docker build命令,docker就會根據(jù)Dockerfile里你定義好的命令進行構(gòu)建新的鏡像。
-t代表要構(gòu)建的鏡像的tag,
dockerName是生成的鏡像名稱,
.代表當(dāng)前目錄,也就是Dockerfile所在的目錄。
然后就可以看到在下載各種依賴的maven、各種jar,構(gòu)建完畢后,啟動項目。
方式二:把項目拷貝到服務(wù)器,
cd到項目springboot-docker目錄下,然后執(zhí)行mvn package docker:build
?我們構(gòu)建鏡像選擇的是方式二
mvn package docker:build
??出現(xiàn)如下信息表示構(gòu)建成功
- 鏡像構(gòu)建成功。通過docker images查看鏡像:
springbootdocker/springboot-docker 就是我們構(gòu)建好的鏡像,下一步就是運行該鏡像。
- 啟動鏡像
docker run -p 8080:8080 -t springbootdocker/springboot-docker
-p表示端口映射,冒號左邊為docker容器外的端口號,右邊為容器內(nèi)的端口號。 8080:8080意思是將docker容器的8080端口映射到服務(wù)器上的8080端口。
- 查看運行鏡像
??啟動完成之后我們使用docker ps查看正在運行的鏡像:
??可以看到我們構(gòu)建的容器正在在運行,訪問瀏覽器:http://ip:8080/,返回

說明使用 Docker 部署 Spring Boot 項目成功!
七、Docker應(yīng)用場景
??Web應(yīng)用的自動化打包和發(fā)布。
??自動化測試和持續(xù)集成、發(fā)布。
??在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應(yīng)用。
八、優(yōu)缺點
- 優(yōu)點:
??1、更快速的交付和部署
??2、更高效的資源應(yīng)用
??3、更輕松的遷移和擴展
??4、更簡單的更新管理
- 缺點:
??1、必須是在64位機器上運行,并且目前僅支持X86_64和AMD64,32位系統(tǒng)暫時不支持
??2、系統(tǒng)的Linux內(nèi)核必須是3.8或者更高的,內(nèi)核支持Device Mapper、AUFS、VFS、BTRFS等存儲格式。
??3、內(nèi)核必須支持cgroups和命令空間。
九、總結(jié)
??Docker部署SpringBoot至此結(jié)束了,通過本篇文章我們簡單了解了Docker簡介、Docker安裝以及在項目中的配置。下一篇我們繼續(xù)學(xué)習(xí)通過Jenkins部署Spring Boot。