Windows环境下Spring Boot+Docker构建应用

前言

最近在研究SpringCloud+Docker构建微服务化的架构,之前没有接触过Docker,在学习的过程中遇到了不少的问题,花了一天的时间学习了Docker,花了一天的时间学习SpringCloud,总算有了一点点的进展。本文将一步步带你构建一个基于 Spring Boot 和 Docker 的单体应用,但愿共同学习共同进步。

SpringBoot简介

Spring Boot 是 Spring 社区发布的一个开源项目,旨在帮助开发者快速简单的构建可独立运行的项目。Spring Boot 会选择最适合的 Spring 子项目和第三方开源库进行整合。大部分 Spring Boot 应用只需要非常少的配置就可以快速运行起来。
Spring Boot是SpringCloud的基础,cloud是在boot之上的,所以要完成一个微服务的搭建,你必须先完成SpringBoot+Docker的构建。

官网地址:http://projects.spring.io/spring-boot/

Docker简介

Docker 是一套以容器技术为核心的,用于应用的构建、分发和执行的体系和生态。官网地址:

官网地址:https://docker.com
ps:我的博客里整理一些docker的学习资料,但是经过一些弯路,还是强烈建议大家去看官网的doc文档,虽然是英文的,但是不难懂,而且很详细。

环境搭建

  • 操作系统:64位,系统不限(需支持Docker,我这里是Win10),Windows 上建议安装 Git 客户端,方便支持 Linux 命令行操作

  • JDK 1.8 + :推荐一款 Java 环境管理工具 jenv

  • Maven 3.0 + :我这里用的是阿里的 Maven 仓库

  • Docker

    * Linux安装教程参考:https://docs.docker.com/engine/installation/linux/
    
    * 如果你使用的是Mac或Windows,官方已有原生应用支持,下载地址:https://docs.docker.com/
    
  • 一个你喜欢的编译器或IDE,推荐 Atom 或 Intellij IDEA,或者Sublime Text

步骤

第一步:新建工程目录

因为是Windows系统,走了不少的弯路。Spring官方给出的docker整合示例,是在Linux环境下的。Linux环境是直接可以通过指令build打包的,但是Windows不行,得借助Docker Quickstart Terminal,也就是安装成功后桌面上的:

于是我们打开终端Terminal,输入:mkdir spring-boot-docker

创建了我们的项目。接着,在根目录下创建 pom.xml 文件
touch pom.xml

在当前目录下新建子目录:

mkdir -p src/main/java/com/keozhao/hello

一个典型的 Maven 项目结构

第二步:配置pom.xml文件

在 pom.xml 中添加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
  <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>bingohuang.com</groupId>
<artifactId>spring-boot-docker-cloudcomb</artifactId>
<version>0.1.0</version>
<packaging>jar</packaging>
<name>Spring Boot + Docker + Cloudcomb</name>
<description>一步步带你构建 Spring Boot + Docker 应用及网易蜂巢服务</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<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>
        <scope>test</scope>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
    </project>

以上 pom 文件并不复杂,是一个 Spring Boot 的标准配置,Spring Boot 的 Maven 插件会提供以下功能:

1.收集的类路径上所有 jar 文件,并构建成一个单一的、可运行的 jar 文件,这使得它更方便地执行和传输服务。
2.搜索 public static void main() 方法来标记为可运行的类。
3.提供了一个内置的依赖解析器,用于设置版本号以匹配 Spring Boot 的依赖。你可以覆盖任何你想要的版本,但它会默认使用 Spring Boot 所设置的版本集。

操作示例:

通过start指令,调用系统默认打开该文件的程序,你直接将上述代码写入即可

第三步:编写SpringBoot应用程序

创建一个简单的 Java 应用程序:
touch src/main/java/com/keozhao/hello/Application.java

代码如下:

  package com.keozhao.hello;

  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RestController;

  /**
      * Sprint Boot 主应用入口
      * @author Keo.Zhao
      * @date 2016.12.10
  */
@SpringBootApplication
@RestController
public class Application {

@RequestMapping("/")
public String home() {
    return "Hello Spring Boot, Docker and CloudComb!";
}


public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
 } 

代码核心就是处理了根路径(/)的 web 请求,并包含可执行的 main 方法,比较好理解,解释一下其中几个关键点:

  • 用 @SpringBootApplication 和 @RestController 注解类, 表示可用 Spring MVC 来处理 Web 请求

  • @RequestMapping 将 / 映射到 home() 方法,并返回相应文本

  • main() 方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用

操作示例:

我这里默认打开是Sublime Text,于是从Sublime写入

第四步:本地运行

Maven构建

该应用的核心代码就已完成,也就两个文件,可见 Spring Boot 非常简单。在项目根目录执行:mvn package

之后会在根目录下生成一个 target 目录,并在 target 目录下包含一个可执行的 jar 包。

运行jar包

Spring Boot 的强大之处是将应用打成一个可独立运行的 jar 文件:

java -jar target/spring-boot-docker-cloudcomb-0.1.0.jar

不出意外,输出日志,应用启动,默认会监听 8080 端口。

访问应用

应用正常启动后,浏览器访问 http://127.0.0.1:8080/,即可看到页面输出字样:

第五步:容器化构建及运行

书写DockerFile

在项目根目录下创建一个 Dockerfile 文件,touch Dockerfile
内容如下:

FROM frolvlad/alpine-oraclejdk8:slim

COPY target/spring-boot-docker-cloudcomb-0.1.0.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

此 Dockerfile 并不复杂,核心功能就是将可执行文件拷贝到镜像中,并在容器启动时默认执行启动命令 java -jar /app.jar
一样也是也通过start的指令打开,再写入、保存。

docker 构建

在项目根目录下执行 docker 构建镜像命令:
docker build -t spring-boot-docker-cloudcomb:0.1.0 .
(别忘记后面的点)

docker build 指令详情

这一步完成,你已经成功构建了镜像,输入docker images可以看见

docker运行

运行 docker 容器:
docker run -p 8080:8080 -t spring-boot-docker-cloudcomb:0.1.0

访问项目

同样,会输出日志(略有不同),监听 8080 端口,浏览器访问 192.168.99.100:8080,输出文本。

Hello Spring Boot, Docker and CloudComb!

其实就是启动docker的ip地址,如下:
这里写图片描述

到这里,你已经成功完成了Windows环境下SpringBoot + Docker构建应用!!

一点小发现:

如果你觉得在终端窗口一步步创建文件比较麻烦,或许我们可以直接把工程copy到Terminal的运行环境中。其实在上文,start打开应用时,我们可以发现文件创建在了C:\Users\Keo.Zhao这个路径下,Keo.Zhao是我的用户名,不同的电脑这里必然会有差异,不妨打开你的电脑看看这个路径。因为docker才学习了一天,其实一些细节、机制还不了解。但是我猜测,Terminal本质还是为Windows用户提供了一个虚拟的Linux环境,在Linux的环境里是没有盘符这个概念的,所以默认当前系统用户的目录为运行的目录(应该可以更改,后期再研究,有不对的地方希望大牛能指出,多谢!)。所以,可以直接把你在ide里写好的项目,copy到C:\Users\Keo.Zhao目录下,你的也许会叫做C:\Users\administrator,打开Terminal,输入dir,一定会有新的发现~

本文参考链接:

https://github.com/163yun/spring-boot-docker-cloudcomb

https://docs.docker.com/

https://spring.io/guides/gs/spring-boot-docker/#initial

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐