Docker是一个使用广泛的Linux容器管理工具包,它允许用户创建镜像,并将其容器实例化。通过本指南,我们可以学习到如何使用Docker部署Spring Boot项目。

先决条件

开发之前,你必须具备如下条件才能够开发:

  • 你必须在物理机或虚拟机上安装Docker,如果条件不允许,你可以是在本机安装Docker Toolbox,使用Docker Machine创建Docker引擎。关于Docker Toolbox的安装请查看官方安装方式。关于Docker的安装你可以参考:在Centos上安装Docker
  • 你需要掌握Spring Boot框架的变成模型

步骤一:构建Spring Boot项目

  1. 使用IDE工具(推荐Idea)构建Spring Boot项目:项目名称demo。在该项目中,我们发布一个Rest API服务,端点是:/user。由于发布的是基于Http的API接口,因此pom中需要引入spring-boot-starter-web构建。
  2. 开发DemoController代码如下:
@RestController
public class DemoController { @RequestMapping("/user")
public Map<String,Object> getUser() {
Map<String, Object> userMap = new HashMap<>(16);
userMap.put("name", "Jim");
userMap.put("sex", "male");
userMap.put("age", 22);
return userMap;
}
}
  1. 编辑application.yml文件:
server:
port: 8080
spring:
application:
name: demo-service

现在,一个微服务项目就开发完成了!

步骤二:使用插件构建项目

一般来说,开发完Spring Boot项目后,需要编写Dockerfile,然后使用mvn clean package命令对项目进行编译和打包,然后通过运行docker build命令,构建项目的镜像。这样做显得比较繁琐,为了提升开发效率,减轻开发人员工作量,我们可以使用docker-maven-plugin插件。通过该插件,你可以通过Maven构建的Docker镜像。使用mvn com.spotify:docker-maven-plugin:<version>:help -Ddetail=true命令查看docker-maven-plugin插件帮助信息。

  1. 在pom文件中引入,添加docker-maven-plugin插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
</plugin>
  1. 配置docker-maven-plugin。在构建之前,我们需要配置该插件,详细配置请参考这里
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<dockerHost>https://172.20.5.79:2376</dockerHost>
<dockerCertPath>C:\\Users\\Administrator\\.docker\\machine\\cert_79</dockerCertPath>
<baseImage>openjdk:8-alpine</baseImage>
<imageName>${project.build.finalName}</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<exposes>
<expose>8080</expose>
</exposes>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

解释一下上述配置:

  • dockerHost:配置Docker引擎的地址,格式为:http|https://ip:port
  • dockerCertPath:如果Docker引擎开启了TLS验证功能,你必须要将客户端证书、秘钥以及CA证书的路径配置在这里
  • baseImage:基准镜像。与Dockerfile中的FROM <baseImage>指令一致
  • imageName:镜像名称。由项目名称与版本号组成
  • imageTags:镜像Tag。默认是项目的版本号与latest
  • entryPoint:容器启动时,执行的命令
  • exposes:需要暴漏的端口
  • resource.targetPath:打包好的项目文件放置在容器的位置,targetPath路径必须要与entryPoint中的一致
  • resource.directory:项目的构建目录
  • resource.include:需要将项目构建目录中哪些内容拷贝至镜像中

步骤三:构建Docker镜像

  1. 配置完插件后,我们就可以构建Docker镜像了:
mvn clean package docker:build
  1. 使用Docker客户端查看docker 镜像:
[root@docker-test sentinel]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo 1.0 506b7ed0635e 22 seconds ago 116MB
  1. 运行demo:1.0镜像,将demo服务的8080端口映射到宿主机:
[root@docker-test sentinel]# docker run -itd --name demo -p 8080:8080 demo:1.0
dc5cd4780f8e42a4bf6ea0a696dbf3289785f2044e66aec8ba43213dd86a4fcc
  1. 查看已运行容器:
[root@docker-test sentinel]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc5cd4780f8e demo:1.0 "java -jar /demo.jar" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp demo
  1. 在浏览器中运行:http://ip:8080/user。如果返回数据,那就恭喜你了。

步骤四:将镜像上传至私有的镜像仓储中

在上述步骤中,我们已经实现了如何使用docker-maven-plugin插件将Spring Boot项目构建至Docker中。那么,如何将镜像推送至私有仓储呢?

在本实例中,我们采用阿里云的镜像仓储。

  1. 修改setting.xml文件,通常来说,该文件在~/.m2目录下。在setting.xml文件中添加server节点,用于登录阿里云的镜像注册中心:
<server>
<id>docker-repository</id>
<username>some_user</username>
<password>some_password</password>
</server>
  • username:登录阿里云注册中心用户名
  • password:登录阿里云注册中心的密码

由于要保证密码的安全性,这里不采用明文,需要对密码进行加密。加密方式参考:maven密码加密。步骤如下:

  • 首先使用你的私有仓库访问密码生成主密码:
mvn --encrypt-master-password <password>
  • 其次在settings.xml文件的同级目录创建settings-security.xml文件,将主密码写入:
<?xml version="1.0" encoding="UTF-8"?>
<settingsSecurity>
<master>{Ns0JM49fW9gHMTZ44n*****************=}</master>
</settingsSecurity>
  • 最后使用你的私有仓库访问密码生成服务密码,将生成的密码写入到settings.xml的<server>中:
mvn --encrypt-password <password>
<server>
<id>docker-repository</id>
<username>some_user</username>
<password>{73eo3WYROT0HkVfHD0cUF2Z/dtaGVtSPJ1TOsFLuO08=}</password>
</server>
  1. 修改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>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.2</version>
<packaging>jar</packaging> <name>demo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<docker.host>https://172.20.5.79:2376</docker.host>
<docker.cert.path>C:\\Users\\Administrator\\.docker\\machine\\cert_79</docker.cert.path>
<docker.repository>registry.cn-hangzhou.aliyuncs.com/mark0614</docker.repository>
<docker.registry.name>${project.artifactId}</docker.registry.name>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> <build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>package</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>${project.build.finalName}:${project.version}</image>
<newName>${docker.repository}/${project.build.finalName}:${project.version}</newName>
</configuration>
</execution>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>${docker.repository}/${project.build.finalName}:${project.version}</imageName>
</configuration>
</execution>
</executions>
<configuration>
<dockerHost>${docker.host}</dockerHost>
<dockerCertPath>${docker.cert.path}</dockerCertPath>
<baseImage>openjdk:8-jre-alpine</baseImage>
<imageName>${project.build.finalName}</imageName>
<serverId>docker-repository</serverId>
<registryUrl>${docker.repository}</registryUrl>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<entryPoint>["java", "-jar", "/var/app/${artifactId}/${project.build.finalName}.jar"]</entryPoint>
<exposes>
<expose>8080</expose>
</exposes>
<resources>
<resource>
<targetPath>/var/app/${project.build.finalName}/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>

解释一下:

  • executionsdocker-maven-plugin会在不同的构建阶段执行不同的目标任务。

    • package阶段进行docker build操作
    • package阶段同时执行tag操作,将镜像重新tag成docker-repository:port/namespace/imageName:version格式
    • install或者deploy阶段进行push操作
  • registryUrl:镜像注册中心地址
  • serverId:配置在settings.xml中的server认证信息
  1. 构建项目:
mvn clean package -Dmaven.test.skip=true

打印出如下信息,说明你成功了:

[INFO] Pushing registry.cn-hangzhou.aliyuncs.com/mark0614/demo:0.0.2
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/mark0614/demo]
3148c56ca932: Preparing
69cc5717c281: Preparing
5b1e27e74327: Preparing
04a094fe844e: Preparing
3148c56ca932: Pushing [> ] 165.9kB/14.51MB
69cc5717c281: Layer already exists
3148c56ca932: Pushing [=> ] 493.6kB/14.51MB
04a094fe844e: Layer already exists
3148c56ca932: Pushing [==> ] 821.2kB/14.51MB
5b1e27e74327: Layer already exists
3148c56ca932: Pushing [====> ] 1.313MB/14.51MB
3148c56ca932: Pushing [=======> ] 2.132MB/14.51MB
3148c56ca932: Pushing [========> ] 2.46MB/14.51MB
3148c56ca932: Pushing [=========> ] 2.787MB/14.51MB
3148c56ca932: Pushing [===========> ] 3.279MB/14.51MB
3148c56ca932: Pushing [============> ] 3.607MB/14.51MB
3148c56ca932: Pushing [==============> ] 4.098MB/14.51MB
3148c56ca932: Pushing [===============> ] 4.426MB/14.51MB

 http://note.youdao.com/noteshare?id=07e1e408801bdf8d907ab81850dd60c2&sub=CEE7634AEEE542F3A07EDC31DC0EFAC9

使用Docker部署Spring boot项目的更多相关文章

  1. Windows Docker 部署 Spring Boot 项目

    目录 Docker Configuration Config IDEA Plugin Create Spring Boot Project Containerize It Use Dockerfile ...

  2. 使用 Docker 部署 Spring Boot 项目

    Docker 介绍 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器解决方案. Docker 将应用程序与该程序的依赖,打包在一个文件里面 ...

  3. 使用 Docker 部署 Spring Boot 项目,带劲!!

    上一篇:年轻人的第一个 Docker 应用 Docker 一次构建.处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程 ...

  4. IDEA连接远程服务器Docker部署Spring Boot项目

    开始前的准备工作 拥有一台云服务器,我的是腾讯云服务器(CentOS7) 腾讯云服务器安装Docker,我的版本是Docker 19.03.9,关于安装和配置镜像加速器可以查阅我的另一篇博文:http ...

  5. 【docker】docker部署spring boot项目在服务器上

    IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...

  6. docker部署spring boot项目在服务器上

    IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...

  7. Docker 部署Spring Boot 项目并连接mysql、redis容器(记录过程)

    Spring Boot 项目配置 将写好的Spring Boot 项目通过maven 进行package打包获得可执行Jar 再src/main/docker(放哪都行)下编写创建Dockerfile ...

  8. docker 部署spring.boot项目【一】(引用外部配置文件)

    上一篇随笔,nginx是启动运行在容器内,spring.boot的web项目是运行在宿主内,这一篇的目的,是把web项目也制作成镜像,然后在容器里启动. 文件目录结构如下: 主要文件结构说明:(1)b ...

  9. 如何用Docker部署Spring Boot项目

    1.idea中安装docker插件: 2.新建DockerFile,内容如下. # 基础镜像使用java FROM java:8 # 作者 MAINTAINER vic <test@163.co ...

随机推荐

  1. Netflix公布个性化和推荐系统架构

    Netflix的推荐和个性化功能向来精准,前不久,他们公布了自己在这方面的系统架构. 3月27日,Netflix的工程师Xavier Amatrain和Justin Basilico在官方博客发布文章 ...

  2. 增加AP INVOICE 行&分配行

    -- 增加行 DECLARE v_row_id VARCHAR2(1000); v_line_number number; g_user_id CONSTANT NUMBER := fnd_globa ...

  3. "《算法导论》之‘线性表’":双向循环链表

    本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...

  4. 用xml来编写动画

    我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法.不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能 ...

  5. GraphCuts算法解析,Graphcuts算法求最大流,最小割实例

    图割论文大合集下载: http://download.csdn.net/detail/wangyaninglm/8292305 代码: /* graph.h */ /* Vladimir Kolmog ...

  6. linux终端用户登录流程

    终端可以通过连线,猫或网络(ssh,telnet,rlogin)和unix相连. 对于每个物理终端端口,都有一个getty监视,getty是由init程序启动的. getty收到用户名->调用l ...

  7. spring boot之入门Controller常用注解

    Controller常用注解 @Controller  处理http请求 @RestController Spring4之后新加的注解,原来返回json数据需要@ResponseBody配合@Cont ...

  8. 一个简单的例子搞懂ES6之Promise

    ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...

  9. mac上Python多版本共存

    http://www.cnblogs.com/mingaixin/p/6295963.html https://www.cnhzz.com/pyenv_virtualenv_virtaulenvwra ...

  10. win7 64位专业版下的x64编译问题

    在Django的开发过程中,碰到一个问题,就是所有本地库的位数必须是相同的,于是某些库需要重新编译一下,工作环境,不能用盗版程序,VC++ 2008\2010 Express版本身都不支持X64的编译 ...