本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇。

在之前的文章里面介绍了如何基于docker容器部署一些常见的基础环境,例如MySQL、Redis这些,那么这篇文章里面我会介绍一些关于SpringBoot如何打包运行到docker容器中。

先介绍一下需要准备的基础环境内容:

1.一台centos机器

docker运行在centos7上,要求系统为64位,Linux内核版本为3.10以上

docker运行在centos6.5或更高的版本上,要求系统为64位,系统内核版本为2.6.32-431或更高版本

关于如何查看当前系统的内核版本可以通过uname指令来查询:

  1. [root@izwz9ic9ggky8kub9x1ptuz target]# uname -r
  2. 3.10.0-514.26.2.el7.x86_64
  3. [root@izwz9ic9ggky8kub9x1ptuz target]#

2.一份基础的SpringBoot项目代码

首先我们来构建一个简单的springboot模板项目,下边这份是相关的依赖文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>com.sise</groupId>
  8. <artifactId>docker-springboot</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>2.0.0.RELEASE</version>
  15. </parent>
  16.  
  17. <properties>
  18. <docker.image.prefix>springboot</docker.image.prefix>
  19. </properties>
  20.  
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. </dependencies>
  32.  
  33. <build>
  34. <!-- 注意这里的命名要与后边编写DockerFile中的命名一致 -->
  35. <finalName>spring-boot-docker-1.0</finalName>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-maven-plugin</artifactId>
  40. </plugin>
  41. <!-- Docker maven plugin -->
  42. <plugin>
  43. <groupId>com.spotify</groupId>
  44. <artifactId>docker-maven-plugin</artifactId>
  45. <version>1.0.0</version>
  46. <configuration>
  47. <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
  48. <dockerDirectory>src/main/docker</dockerDirectory>
  49. <resources>
  50. <resource>
  51. <targetPath>/</targetPath>
  52. <directory>${project.build.directory}</directory>
  53. <include>${project.build.finalName}.jar</include>
  54. </resource>
  55. </resources>
  56. </configuration>
  57. </plugin>
  58. <!-- Docker maven plugin -->
  59. </plugins>
  60. </build>
  61.  
  62. </project>

注意,这里有几个配置点需要仔细注意一下,在上边的maven配置中有一条叫做dockerDirectory的属性配置:

  1. <configuration>
  2. <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
  3. <dockerDirectory>src/main/docker</dockerDirectory>
  4. <resources>
  5. <resource>
  6. <targetPath>/</targetPath>
  7. <directory>${project.build.directory}</directory>
  8. <include>${project.build.finalName}.jar</include>
  9. </resource>
  10. </resources>
  11. </configuration>

这条属性对应的是指Dockerfile文件所存放的位置:

注意有坑:

在src/main/docker的目录底下需要我们编写一份叫做Dockerfile的文件,注意这份Dockerfile文件的命名一定不能修改,否则会识别不出来,导致后边会抛出下边这种异常:

  1. Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project docker-springboot:
  2. Exception caught: Request error: POST unix://localhost:80/build?t=springboot%2Fdocker-springboot: 500, body:
  3. {"message":"Cannot locate specified Dockerfile: Dockerfile"}: HTTP 500 Internal Server Error -> [Help 1]

这份Dockerfile文件需要用特殊的语法规则来进行编写,这里我给出一份基础的Dockerfile文件模板:

  1. FROM openjdk:8-jdk-alpine
  2. VOLUME /tmp
  3. ADD spring-boot-docker-1.0.jar app.jar
  4. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

稍微解释一下这里的语义含义:

FROM [image]指需要依赖的其他镜像信息,这里选择了jdk镜像

对于不熟悉的镜像环境如果需要搜索可以去到docker的官方网站进行查看:
https://hub.docker.com/

在这里插入图片描述

ADD 源地址目标地址 是指将原先的src文件 添加到我们需要打包的镜像里面

VOLUME /tmp Spring Boot应用程序为Tomcat创建的默认工作目录。作用是在你的主机”/var/lib/docker”目录下创建一个临时的文件,并且链接到容器中的”/tmp”目录。这部分的内容可以进入相应的目录下边去详细查看:

  1. [root@izwz9ic9ggky8kub9x1ptuz docker]# cd /var/lib/docker
  2. [root@izwz9ic9ggky8kub9x1ptuz docker]# ls
  3. builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
  4. [root@izwz9ic9ggky8kub9x1ptuz docker]# cd ./tmp/
  5. [root@izwz9ic9ggky8kub9x1ptuz tmp]# ls
  6. docker-builder661781695
  7. [root@izwz9ic9ggky8kub9x1ptuz tmp]# cd docker-builder661781695/
  8. [root@izwz9ic9ggky8kub9x1ptuz docker-builder661781695]# ls
  9. dockerFile docker-springboot-1.0-SNAPSHOT.jar
  10. [root@izwz9ic9ggky8kub9x1ptuz docker-builder661781695]#

ENTRYPOINT 这条指令的含义是说执行应用的时候默认传输的命令内容。

SpringBoot的代码也比较简单,分别是Application启动类:

  1. package com.sise.docker;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5.  
  6. /**
  7. * @author idea
  8. * @data 2019/11/10
  9. */
  10. @SpringBootApplication
  11. public class DockerApplication {
  12.  
  13. public static void main(String[] args) {
  14. SpringApplication.run(DockerApplication.class);
  15. }
  16. }

以及相应的SpringBoot控制器:

  1. package com.sise.docker.controller;
  2.  
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. /**
  8. * @author idea
  9. * @data 2019/11/10
  10. */
  11. @RestController
  12. @RequestMapping(value = "/docker")
  13. public class DockerController {
  14.  
  15. @GetMapping(value = "/test")
  16. public String test(){
  17. return "this is docker test";
  18. }
  19. }

application.yml文件信息:

  1. server:
  2. port: 7089

3.服务器上边需要安装maven和docker环境

关于docker的环境安装,在上一篇文章中已经讲解到了,没看上一篇的,点这里:Docker 从入门到掉坑

maven的环境安装讲解:

首先需要选择自己机器上边的安装地址,然后下载相应的文件包,并且进行解压:

  1. wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz
  2. tar zxf apache-maven-3.1.1-bin.tar.gz

然后我们进行相应的环境变量配置:

  1. export MAVEN_HOME=[maven的安装路径]
  2. export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

记得刷新一下profile配置文件

  1. source /etc/profile

最后记得验证一下maven的配置是否正常:

  1. [root@izwz9ic9ggky8kub9x1ptuz docker]# mvn -version
  2. Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 23:22:22+0800)
  3. Maven home: /opt/maven/apache-maven-3.1.1
  4. Java version: 1.8.0_151, vendor: Oracle Corporation
  5. Java home: /opt/jdk/jdk1.8.0_151/jre
  6. Default locale: en_US, platform encoding: UTF-8
  7. OS name: "linux", version: "3.10.0-514.26.2.el7.x86_64", arch: "amd64", family: "unix"

一切就绪了,现在我们来将原先的准备好的一份SpringBoot项目上传到centos机器里面,然后通过maven的命令进行打包:

  1. mvn package docker:build

当构建成功之后会有以下信息出现:

  1. [INFO] Built springboot/spring-boot-docker
  2. [INFO] ------------------------------------------------------------------------
  3. [INFO] BUILD SUCCESS
  4. [INFO] ------------------------------------------------------------------------
  5. [INFO] Total time: 54.346 s
  6. [INFO] Finished at: 2018-03-13T16:20:15+08:00
  7. [INFO] Final Memory: 42M/182M
  8. [INFO] ------------------------------------------------------------------------

接着我们便可以通过熟悉的docker images命令来查看当前的镜像内容了:

最后便是启动我们的镜像文件,并且进行测试:

  1. [root@izwz9ic9ggky8kub9x1ptuz springboot-docker]# docker run -p 7089:7089 -d springboot/docker-springboot
  2. 38ec31c7a4802d852ee0834e1773136bd58a255875a9fa8cb2898aef0daa3e51
  3. [root@izwz9ic9ggky8kub9x1ptuz springboot-docker]#

启动成功之后,我们通过命令进行测试接口:

  1. [root@izwz9ic9ggky8kub9x1ptuz springboot-docker]# curl 127.0.0.1:7089/docker/test
  2. this is docker test
  3. [root@izwz9ic9ggky8kub9x1ptuz springboot-docker]#

好了,一个基本的基于docker容器运行的SpringBoot容器构建到这里就告一段落了。

写在文末

在文末部分,我打算继上一篇文章中所提到的几个不足我在这里进行一些补充:
应 @古名 读者提到的问题,关于docker镜像的没有做官方的介绍:

当我们需要查询某些特殊镜像的时候有两种途径去搜索有关镜像的信息,一种是直接进入官网镜像搜索,还有一种是通过docker search 的方式搜索镜像。

第一种方式的具体操作为进入https://hub.docker.com 官网,然后在顶部的搜索栏进行相关的搜索。例如说我们要搜索关于mysql的镜像信息,那么就可以通过以下操作:

在官网上的搜索和在命令行执行docker search [镜像关键字]的结果基本是一致的:

  1. [root@izwz9ic9ggky8kub9x1ptuz springboot-docker]# docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 8787 [OK]
  4. mariadb MariaDB is a community-developed fork of MyS 3080 [OK]
  5. mysql/mysql-server Optimized MySQL Server Docker images. Create 652 [OK]
  6. percona Percona Server is a fork of the MySQL relati 459 [OK]
  7. centos/mysql-57-centos7 MySQL 5.7 SQL database server 64
  8. centurylink/mysql Image containing mysql. Optimized to be link 61 [OK]
  9. mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr 56
  10. deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
  11. bitnami/mysql Bitnami MySQL Docker Image 35 [OK]
  12. tutum/mysql Base docker image to run a MySQL database se 34
  13. schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup 28 [OK]
  14. prom/mysqld-exporter 23 [OK]
  15. linuxserver/mysql A Mysql container, brought to you by LinuxSe 22
  16. centos/mysql-56-centos7 MySQL 5.6 SQL database server 17
  17. circleci/mysql MySQL is a widely used, open-source relation 16
  18. mysql/mysql-router MySQL Router provides transparent routing be 14
  19. arey/mysql-client Run a MySQL client from a docker container 13 [OK]
  20. imega/mysql-client Size: 36 MB, alpine:3.5, Mysql client: 10.1.… 9 [OK]
  21. openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image 6
  22. fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas 4 [OK]
  23. genschsa/mysql-employees MySQL Employee Sample Database 2 [OK]
  24. ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
  25. jelastic/mysql An image of the MySQL database server mainta 1
  26. widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl 0 [OK]
  27. monasca/mysql-init A minimal decoupled init container for mysql 0

这里你可能会疑惑,为何输入了MySQL关键字之后却出来了这么多的相关信息,实际上这里走的是一次全文搜索,会将一些在描述内容中包含有MySQL的镜像信息都统一查询出来。

假设我们需要选择mysql的某一份镜像进行下载的话,可以直接docker pull mysql,但是这种方式会拉去最新版本的镜像到宿主机中。如果对版本有要求,我们可以到官网上选择合适的版本进行指定拉去。

图中我也圈起来了拉去不同版本镜像的命令。

应 @别慌张 读者问到的docker可视化管理工具的问题。

实际上docker的可视化管理工具有很多:shipyard,DockerUI,Portainer,Rancher等等

我建议是,如果是作为初学者,还是建议使用命令行会好些,可视化工具实际上是会弱化开发人员的动手能力。使用可视化工具的主要目的还是为了提升工作效率和降低实操难度而设计的。

Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务的更多相关文章

  1. Docker从入门到掉坑(三):容器太多,操作好麻烦

    前边的两篇文章里面,我们讲解了基于docker来部署基础的SpringBoot容器,如果阅读本文之前没有相关基础的话,可以回看之前的教程. Docker 从入门到掉坑 Docker从入门到掉坑(二): ...

  2. Docker从入门到掉坑(四):上手k8s避坑指南

    在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作,在接下来的这篇文章开始,我们将开始进入对于k8s模块的学习 不熟悉的可以先回顾之前的章节,Docker教程系列文章将归 ...

  3. 基于Openshift的SpringBoot微服务

    基于Openshift的SpringBoot微服务 OpenShift是红帽的云开发平台即服务(PaaS).自由和开放源码的云计算平台使开发人员能够创建.测试和运行他们的应用程序,并且可以把它们部署到 ...

  4. Docker 从入门到掉坑

    Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...

  5. Docker从入门到掉坑(五):继续挖一挖 k8s

    在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习 pod是啥 在k8s里面,有很多新的技术概念,其 ...

  6. Docker 从入门到实践(二)Docker 三个基本概念

    一.Docker 的三个进本概念? 了解 Docker 的三个基本概念,就可以大致了解 Docker 的生命周期. 镜像(Image) 容器(Container) 仓库(Repository) 二.镜 ...

  7. Docker从入门到实战(二)

    Docker从入门到实战(二) 一:什么是docker Docker是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到主流的Linux.MacOS.Windo ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

随机推荐

  1. C++学习笔记-预备知识

    1.1 C++简介 C++融合3种不同的编程方式:C语言代表的过程性语言.C++在C语言基础上添加的类代表的面向对象语言.C++模板支持的广泛编程. 1.2 C++简史 1.2.1 C语言 Ritch ...

  2. 快速入门Maven(一)

    一.Maven简介 1.什么是maven Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理. 2.Maven的好处 构建是程序员每天要 ...

  3. API---注册表编程

    首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...

  4. 域渗透-Kerberos协议中spn的应用

    0x01 关于SPN 服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称. 服务主体名称是服务实例(可以理解为一个服务,比如 HTTP.MSSQL ...

  5. Linux系统基础

    Linux系统基础 目录   简介 0x01 Linux文件与目录管理 0x02 Linux系统用户以及用户组管理 0x03文档的压缩与打包 0x04 apt安装软件 0x05 进程管理 标签 Lin ...

  6. PHP 数组转json格式,key的保存问题

    <?php $arr = [ 2, 3, ]; echo print_r($arr,true); echo json_encode($arr); echo "\n\n"; $ ...

  7. opencv实践::透视变换

    问题描述 拍摄或者扫描图像不是规则的矩形,会对后期处理产生不 好影响,需要通过透视变换校正得到正确形状. 解决思路 通过二值分割 + 形态学方法 + Hough直线 +透视变换 #include &l ...

  8. HDU 3873 Invade the Mars(带限制条件的Dijkstra)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路: 军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间). ...

  9. vue-cli 3.x 自定义插件并发布到 npm

    干货转载——https://www.cnblogs.com/wisewrong/archive/2018/12/28/10186611.html 全是知识点呐 赶紧记下来啊 一.调整项目结构 首先用 ...

  10. 02--Java Jshell的使用 最适合入门的Java教程

    JShell JShell目标 Java Shell 工具(简称:JShell)是一个用于学习Java编程语言和构建Java代码原型的交互式工具.JShell是一个Read-Evaluate-Prin ...