前言
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 liunx機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。Docker自2013年以來非常火熱,因為它能把開發、測試、運維緊密的聯絡起來。spring boot又能很好的融合Docker,讓我們看一下spring boot是怎樣與Docker結合的吧。
一、建立新專案
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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.github.carter659</groupId> <artifactId>spring12</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring12</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <docker.image.prefix>springboot</docker.image.prefix> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.11</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> </plugins> <finalName>spring12</finalName> </build> </project>
properties節點中設定docker映象的字首“springboot”:
<docker.image.prefix>springboot</docker.image.prefix>
加入maven外掛“docker-maven-plugin”:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.11</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>
package com.github.carter659.spring12; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * 部落格出處:http://www.cnblogs.com/GoodHelper/ * */ @SpringBootApplication @RestController public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @GetMapping("/") public String index() { return "你好,docker"; } }
建立“src/main/docker/Dockerfile”檔案:
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD spring12.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" ]
FROM為使用哪個映象
VOLUME為掛載路徑
ADD為複製檔案到映象中
RUN為初始化時執行的命令
ENV為設定環境變數
ENTRYPOINT為啟動時執行的命令
專案結構如圖:
二、部署Docker
選擇一個linux系統,如ubuntu或centos,在此之前需安裝jdk和maven
1.安裝docker環境:
ubuntu為:
$ apt-get install docker.io -y
centos為:
$ yum install docker-io -y
2.生成映象
下面以ubuntu為例
$ mvn package docker:build
3.檢視映象
$ docker images
發現了“springboot/spring12”,
其中“springboot”是之前設定的docker映象字首“<docker.image.prefix>springboot</docker.image.prefix>”,
“spring12”是生成的檔名“<finalName>spring12</finalName>”,這些都在pom.xml中設定。
4.執行映象
$ docker run -p 8080:8080 -t springboot/spring12
輸入網址測試:
docker的部署基本完成了,在生成映象後也可以加入“-DpushImage”引數,再生成完畢的時候把映象推送的映象倉庫中
$ mvn package docker:build -DpushImage
總結
上述的實現方式並不完美,實際專案中還需要讓spring boot應用在後臺執行,並且能實現啟動伺服器後自動啟動docker容器。其思路是,通常會使用supervisord來輔助完成,思路是在supervisord的配置檔案中執行shell指令碼。然而這同樣不完美,而最好的做法是實現“持續整合”,其思路是使用jenkins來結合git鉤子,當提交新版本的程式碼後,jenkins去執行shell指令碼pull程式碼,然後maven打包,接下來生成最新版的docker映象,最後推送新映象和執行docker容器。
參考官方文件:http://spring.io/guides/gs/spring-boot-docker/
程式碼:https://github.com/carter659/spring-boot-12.git
如果你覺得我的部落格對你有幫助,可以給我點兒打賞,左側微信,右側支付寶。
有可能就是你的一點打賞會讓我的部落格寫的更好:)