用 Docker 釋出來一個 Nginx+Spring Boot+MongoDB應用
專案構建於Maven,需要先在pom.xml中增加docker的plugin:
<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.docker.springboot.www</groupId >
<artifactId>com.wang.seckill</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.wang.seckill</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding >
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
<relativePath></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>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</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.13</version>
<configuration>
<imageName>docker.SprongBoot/${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>
</project>
Spring Boot Maven plugin 提供了很多方便的功能:
- 它收集的類路徑上所有 jar 檔案,並構建成一個單一的、可執行的“über-jar”,這使得它更方便地執行和傳輸服務。
- 它搜尋的 public static void main() 方法來標記為可執行的類。
- 它提供了一個內建的依賴解析器,用於設定版本號以匹配 Spring Boot 的依賴。您可以覆蓋任何你想要的版本,但它會預設選擇的 Boot 的版本集。
Spotify 的 docker-maven-plugin 外掛是用於構建 Maven 的 Docker Image
- imageName指定了映象的名字,本例為 docker.SprongBoot/${project.artifactId}
- dockerDirectory指定 Dockerfile 的位置
- resources是指那些需要和 Dockerfile 放在一起,在構建映象時使用的檔案,一般應用 jar 包需要納入。本例,只需一個 jar 檔案。
配置完成後執行maven打包命令:
mvn package
此時會在target目錄下出現jar包:
com.wang.seckill-0.0.1-SNAPSHOT.jar (artifactId+version)
將專案容器化
Docker 使用 Dockerfile 檔案格式來構建 image,該檔案位於src/main/docker
FROM frolvlad/alpine-oraclejdk8
VOLUME /tmp
ADD docker-spring-boot-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Dockerfile檔案是手動用來構建docker image所使用的:
- FROM(指定基礎image)
VOLUME 指定了臨時檔案目錄為/tmp。其效果是在主機 /var/lib/docker 目錄下建立了一個臨時檔案,並連結到容器的/tmp(指定掛載點)。/tmp目錄用來持久化到 Docker 資料資料夾,因為 Spring Boot 使用的內嵌 Tomcat 容器預設使用/tmp作為工作目錄
ADD(從src複製檔案到container的dest路徑)專案的 jar 檔案作為 “app.jar” 新增到容器的
- ENTRYPOINT(設定container啟動時執行的操作本例為執行專案 app.jar。為了縮短 Tomcat 啟動時間,新增一個系統屬性指向 “/dev/urandom” 作為 Entropy Source
構建 Docker Image
執行構建成為 docker image:
mvn package docker:build
執行
執行 Docker Image:
docker run -p 8080:8080 -t xxx
此時你訪問localhost:8080即訪問Spring Boot應用。
配置Nging反向代理:
先下載nginx映象
docker pull nginx
啟動nginx,並配置與我們啟動的springboot容器互連
docker run -p 9090:80 -ti --link=xxx:background nginx
這裡的xxx是啟動springboot的容器的名稱如果沒有提供–name引數制定則通過docker ps 來檢視docker自動分配的name值。(–link必須指定)
修改 /etc/nging/nginx.conf並啟動nginx
server{
listen 80;
location /{
#反向代理,連結到springboot容器
proxy_pass http://background:8080;
}
}
//--link引數必須指定,雖然即使不指定,預設兩個容器也是互連的,但這裡寫springboot容器的ip地址根本無法連結過去。
退出容器
ctrl+P ctrl+Q
此時提供宿主機的瀏覽器來訪問localhost:9090則訪問到springboot應用。
配置mongoDB
下載mongDB容器並啟動指定name為mongoDB
docker run -ti --name mongoDB tutum/mongodb
重新啟動springboot容器,先停止之前的:
docker run -ti --name springboot --link=mongoDB:mongoDB xxxx
springboot應用中resouces的配置為:
spring.data.mongodb.host=mongoDB
spring.data.mongodb.port=27017
spring.data.mongodb.database=baseStationInfo
此時在springboot應用中訪問mongoDB資料庫則會訪問這個mongoDB的這個容器,而訪問是由nginx反向代理過去的。
提供三個容器來部署一個專案。
最後總結一下啟動順序:
- 啟動mongoDB容器制定name
- 啟動springboot並link到mongoDB容器,程式碼中連結mongoDB的URL即為mongoDB容器的name
- 啟動Nginx映象並link到springboot容器並配置反向代理。