心安

使用Docker和 Spring Boot快速搭建微服务

字数统计: 1.9k阅读时长: 7 min
2018/12/03 Share

前言

  • 先说几句废话

    Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文不再赘述Docker的意义和基础内容,不了解的同学可以先去看一些Docker的基础使用以及这门技术出现的意义。我们废话不多说,直接进入正题,如何快速搭建属于我们自己的服务。

  • 说一下使用的工具和技术的版本

    1. Spring boot版本是2.x
    2. Java版本是JDK8
    3. 远程工具使用的是Xshell 6
    4. 使用的远程服务器是阿里云ECS
    5. Maven版本是3.0.5
    6. 代码仓库是github
    7. 版本控制工具是Git
    8. Docker版本是1.13.1
    9. 开发工具是Intellj IDEA旗舰版

    建议使用版本不低于博主的版本。教程源码已托管到github,可以查看项目根目录下的README.md快速开始。

项目搭建

  • 打开Idea,选择新建项目。

    选择Spring Initializr,然后next,填写“groupId”和“ArtifactId”之后,继续next,勾选web模块,不选也没关系,后面修改pom就行了,然后next,最后finish

  • 修改pom

    打开pom.xml,主要修改Spring boot版本,这里只做一个hello world的demo,所以只需要web模块的依赖就够了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
    </parent>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>
  • 编写application.yaml

    将application.properties修改为application.yml或者application.yaml,别问我为什么非要用yml格式,因为我想用这个格式。这里只定义一下port就行了,我们先设置为9001,可以根据自己需要再进行修改。

1
2
server:
port: 9001
  • 接口编写

    新建一个TestController,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package com.yuhangma;

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    /**
    * @author XinAnzzZ
    * @date 2018/12/03 22:04
    */
    @RestController
    public class TestController {

    @GetMapping("/test/docker")
    public String testDocker() {
    return "Hello Docker !";
    }
    }
  • 启动测试

    直接运行main函数,然后浏览器访问http://127.0.0.1/test/docker,浏览器正常显示,ok,进入下一步。

代码托管

  • 新建仓库

    进入Github,登录账户,需要注册的伙伴,自行百度。新建一个仓库,名字自定义即可,建议不要勾选Initialize this repository with a README选项,否则推代码的时候有点麻烦。为了避免出现不必要的麻烦,还是别勾选了。

  • 代码上传

    git的安装,自行百度,这个没难度,下载下来双击安装,然后无脑点击“下一步”就行了。进入项目文件夹根目录,也就是pom.xml所在的目录,打开命令行,执行以下命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 初始化为git项目,此时文件夹中会多一个名为".git"隐藏文件夹
    git init
    // 添加到远程仓库 其中https://github.com/XinAnzzZ/test-domain-name是你刚刚新建的仓库地址,替换成你的就行了
    git remote add origin https://github.com/XinAnzzZ/test-domain-name
    // 将全部文件添加到git管理
    git add .
    // 提交到本地仓库
    git commit -m "init"
    // 推代码 期间可能出现让输入用户名密码,输入注册的github账号密码即可
    git push origin master

    这时候去github刷新一下,应该就能看到推上去的代码了。

Docker部署服务

注意,这一步的前提是你的环境都已经准备好了。Jdk8 + Maven + Git + Docker + Docker-Compose。安装过程自行百度。

  • 拉取镜像

    进入Docker官方仓库,搜索“maven”,选择最多下载量的就对了,然后选择合适的版本,不知道选啥?那就看我选啥你选啥吧。回到Xshell,执行git pull maven:[版本号],博主的版本是git pull maven:[3.5.4-jdk-8-alpine]

    等待完成,执行docker images,会发现已经拉取下来了maven的镜像。
    也可以不做这一步,因为启动容器的时候,如果docker发现没有对应的镜像会自动去拉取。

  • 拉取代码

    进入自己的工作目录,这里我们起名叫“/docker/java-service”。
    然后进入这个目录,执行git clone https://github.com/XinAnzzZ/test-domain-name,完成。

  • 脚本编写

    进入/docker/java-service/test-domain-name目录,执行vim docker-entrypoint.sh新建docker端点文件。

    1
    2
    3
    4
    5
    #!/bin/bash
    cd /usr/src/mymaven
    mvn clean install -Dmaven.test.skip
    cd ./target
    java -jar -Dserver.port=9001 test-domain-name-0.0.1-SNAPSHOT.jar

    脚本解释,这个是docker-compose的入口脚本文件,简单来讲就是容器启动的时候会执行这个脚本。我们可以看到,这个脚本首先进入到/usr/src/mymaven目录执行了maven编译打包的操作,其中-Dmaven.test.skip表示跳过maven代码测试环节。
    打包完成,进入target目录,运行了打包好的jar包。不太明白什么意思?接着往下看,结合下面的解释,你就能看懂。

    执行vim docker-compose.yml新建docker-compose的配置文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    version: '2'
    services:
    java_service_test_domain_name:
    container_name: java-service-domain
    image: maven:3.5.4-jdk-8-alpine
    volumes:
    - /root/.m2:/root/.m2
    - /docker/java-service/test-domain-name:/usr/src/mymaven
    ports:
    - "9001:9001"
    command: "/bin/sh /usr/src/mymaven/docker-entrypoint.sh"

    命令解释,container_name是指定容器名称。

    image表示使用的镜像名称。

    ports表示端口映射,将linux主机的9001端口映射到docker容器的9001端口。也就是说外部请求服务器的9001端口,那么等于请求docker容器内的9001端口,而我们的项目又监听了9001端口,这样我们就能够处理外部的请求了。

    command指的是运行是执行的命令,这里执行了上面的入口脚本文件。

    volumes指的是目录映射,这个算是docker里面比较难理解的概念。我们可以暂时这么理解,我们操作/docker/java-service/test-domain-name目录就等于操作/usr/src/mymaven目录。
    比如说,我们在/docker/java-service/test-domain-name里面新建了一个文件,那么docker容器里面/usr/src/mymaven目录下就会也新建同样的文件。那么/docker/java-service/test-domain-name里面放的是什么呢?其实就是我们项目的源代码,这样一来,相当于我们把我们的源代码放到了docker容器的/usr/src/mymaven目录下面。

    结合第一个脚本文件,我们发现,容器启动的时候,会进入/usr/src/mymaven目录下执行打包操作,是不是很巧妙呢?
    我们做了目录映射将我们的源代码目录映射到了容器的某个特定目录下面,然后启动的时候打包运行,简直完美!

  • 运行容器

    进入“docker-compose.yml”文件所在的目录,也就是/docker/java-service/test-domain-name目录下,执行docker-compose up -d,容器就启动起来了。
    这时候进入浏览器输入http://ip:9001/test/docker,就能访问到我们的项目。注意,linux要开启对应的端口哦。

整个的开发部署过程还是相对简单的,不过需要各位读者对git、maven、linux、docker都要有一定的了解,希望各位想学技术的小伙伴不要放弃,坚持按照教程做下去。基础不够的同学暂时不用纠结,看看热闹就行了。

最后,各位加油~~~

示例代码github

原文作者:XinAnzzZ

原文链接:https://www.yuhangma.com/2018/docker/2018-12-03-docker-springboot/

发表日期:December 3rd 2018, 12:31:46 am

更新日期:September 26th 2019, 10:46:42 am

版权声明:(转载本站文章请注明作者和出处 心 安 – XinAnzzZ ,请勿用于任何商业用途)

CATALOG
  1. 1. 前言
  2. 2. 项目搭建
  3. 3. 代码托管
  4. 4. Docker部署服务