1. 程式人生 > >用 Docker 釋出來一個 Nginx+Spring Boot+MongoDB應用

用 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容器並配置反向代理。