用 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.3</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,

FROM frolvlad/alpine-jdk8
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容器并配置反向代理。

更多Docker相关教程见以下内容: 

Docker 的详细介绍请点这里
Docker 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2016-10/136353.htm