http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html

Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。

首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署。

一个简单 Spring Boot 项目

在 pom.xml 中 ,使用 Spring Boot 2.0 相关依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.0.RELEASE</version>
  5. </parent>

添加 web 和测试依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11. </dependencies>

创建一个 DockerController,在其中有一个index()方法,访问时返回:Hello Docker!

  1. @RestController
  2. public class DockerController {
  3. @RequestMapping("/")
  4. public String index() {
  5. return "Hello Docker!";
  6. }
  7. }

启动类

  1. @SpringBootApplication
  2. public class DockerApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(DockerApplication.class, args);
  5. }
  6. }

添加完毕后启动项目,启动成功后浏览器放问:http://localhost:8080/,页面返回:Hello Docker!,说明 Spring Boot 项目配置正常。

Spring Boot 项目添加 Docker 支持

在 pom.xml-properties 中添加 Docker 镜像名称

  1. <properties>
  2. <docker.image.prefix>springboot</docker.image.prefix>
  3. </properties>

plugins 中添加 Docker 构建插件:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. <!-- Docker maven plugin -->
  8. <plugin>
  9. <groupId>com.spotify</groupId>
  10. <artifactId>docker-maven-plugin</artifactId>
  11. <version>1.0.0</version>
  12. <configuration>
  13. <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
  14. <dockerDirectory>src/main/docker</dockerDirectory>
  15. <resources>
  16. <resource>
  17. <targetPath>/</targetPath>
  18. <directory>${project.build.directory}</directory>
  19. <include>${project.build.finalName}.jar</include>
  20. </resource>
  21. </resources>
  22. </configuration>
  23. </plugin>
  24. <!-- Docker maven plugin -->
  25. </plugins>
  26. </build>

在目录src/main/docker下创建 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"]

这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中,简单解释一下:

  • FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
  • VOLUME ,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
  • ADD ,拷贝文件并且重命名
  • ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

这样 Spring Boot 项目添加 Docker 依赖就完成了。

构建打包环境

我们需要有一个 Docker 环境来打包 Spring Boot 项目,在 Windows 搭建 Docker 环境很麻烦,因此我这里以 Centos 7 为例。

安装 Docker 环境

安装

  1. yum install docker

安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

  1. service docker start
  2. chkconfig docker on
  3. #LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:
  4. systemctl start docker.service
  5. systemctl enable docker.service

使用Docker 中国加速器

  1. vi /etc/docker/daemon.json
  2. #添加后:
  3. {
  4. "registry-mirrors": ["https://registry.docker-cn.com"],
  5. "live-restore": true
  6. }

重新启动docker

  1. systemctl restart docker

输入docker version 返回版本信息则安装正常。

安装JDK

  1. yum -y install java-1.8.0-openjdk*

配置环境变量 打开 vim /etc/profile 添加一下内容

  1. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
  2. export PATH=$PATH:$JAVA_HOME/bin

修改完成之后,使其生效

  1. source /etc/profile

输入java -version 返回版本信息则安装正常。

安装MAVEN

下载:http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

  1. ## 解压
  2. tar vxf apache-maven-3.5.2-bin.tar.gz
  3. ## 移动
  4. mv apache-maven-3.5.2 /usr/local/maven3

修改环境变量, 在/etc/profile中添加以下几行

  1. MAVEN_HOME=/usr/local/maven3
  2. export MAVEN_HOME
  3. export PATH=${PATH}:${MAVEN_HOME}/bin

记得执行source /etc/profile使环境变量生效。

输入mvn -version 返回版本信息则安装正常。

这样整个构建环境就配置完成了。

使用 Docker 部署 Spring Boot 项目

将项目 spring-boot-docker 拷贝服务器中,进入项目路径下进行打包测试。

  1. #打包
  2. mvn package
  3. #启动
  4. java -jar target/spring-boot-docker-1.0.jar

看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。

  1. mvn package docker:build

第一次构建可能有点慢,当看到以下内容的时候表明构建成功:

  1. ...
  2. Step 1 : FROM openjdk:8-jdk-alpine
  3. ---> 224765a6bdbe
  4. Step 2 : VOLUME /tmp
  5. ---> Using cache
  6. ---> b4e86cc8654e
  7. Step 3 : ADD spring-boot-docker-1.0.jar app.jar
  8. ---> a20fe75963ab
  9. Removing intermediate container 593ee5e1ea51
  10. Step 4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
  11. ---> Running in 85d558a10cd4
  12. ---> 7102f08b5e95
  13. Removing intermediate container 85d558a10cd4
  14. Successfully built 7102f08b5e95
  15. [INFO] Built springboot/spring-boot-docker
  16. [INFO] ------------------------------------------------------------------------
  17. [INFO] BUILD SUCCESS
  18. [INFO] ------------------------------------------------------------------------
  19. [INFO] Total time: 54.346 s
  20. [INFO] Finished at: 2018-03-13T16:20:15+08:00
  21. [INFO] Final Memory: 42M/182M
  22. [INFO] ------------------------------------------------------------------------

使用docker images命令查看构建好的镜像:

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. springboot/spring-boot-docker latest 99ce9468da74 6 seconds ago 117.5 MB

springboot/spring-boot-docker 就是我们构建好的镜像,下一步就是运行该镜像

  1. docker run -p 8080:8080 -t springboot/spring-boot-docker

启动完成之后我们使用docker ps查看正在运行的镜像:

  1. docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 049570da86a9 springboot/spring-boot-docker "java -Djava.security" 30 seconds ago Up 27 seconds 0.0.0.0:8080->8080/tcp determined_mahavira

可以看到我们构建的容器正在在运行,访问浏览器:http://192.168.0.x:8080/,返回

  1. Hello Docker!

说明使用 Docker 部署 Spring Boot 项目成功!

示例代码-github

示例代码-码云

参考

Spring Boot with Docker
Docker:Spring Boot 应用发布到 Docker

(转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot的更多相关文章

  1. Spring Boot2.0:使用Docker部署Spring Boot

    一.Spring Boot项目添加 Docker 支持1.在pom.xml中添加 Docker 构建插件 <plugins> <!-- Docker maven plugin --& ...

  2. SpringCloud 教程 (四) docker部署spring cloud项目

    一.docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...

  3. Spring Boot 2 (四):使用 Docker 部署 Spring Boot

    Spring Boot 2 (四):使用 Docker 部署 Spring Boot Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常 ...

  4. Spring Boot 2.0(四):使用 Docker 部署 Spring Boot

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  5. 使用Docker部署Spring boot项目

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

  6. 使用 Docker 部署 Spring Boot 项目

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

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

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

  8. 【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

    如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动 ...

  9. Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

    Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ...

随机推荐

  1. aspx 页面中 js 引用与页面后台的数据交互 --【 js 调后台】

    后台调用 js 方法 前台调用后台方法与变量:  后台被调用的方法必须是public 或 protected 后台被调用的方法必须是静态的static 方法一:通过WebService来实现 步骤: ...

  2. c#的WebService和调用

    WebService: 1.新建一个空白web应用程序 2.在上面建立的web应用程序添加web服务 4.保存发布至 IIS Client: 1.新建一个程序(可以是winform.控制台.web) ...

  3. 【Java每日一题】20170301

    20170228问题解析请点击今日问题下方的“[Java每日一题]20170301”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  4. Java学习笔记之——常用类

    Random,String,Math 1.Random Random()  创建一个新的随机数生成器 案例:产生3个5-10的随机数 运行结果 注意:   2.StingBuffer,StringBu ...

  5. 使用Linux的Crontab定时执行PHP脚本

    0 */6 * * * /home/kdb/php/bin/php /home/kdb/apache/htdocs/lklkdbplatform/kdb_release/Crontab/index.p ...

  6. 使用JAVA反射技术实现代码零耦合与功能无限扩展!

    1.反射使用的背景 最近在做一个功能,就是实现邮件发送功能,但是邮件发送有不同的内容和数据格式,在开始设计的时候直接将发送的内容写在了发送模块中,后来发现功能增加后,无法继续在里边写了,因为里边的功能 ...

  7. 解决ie6中png图片格式不兼容问题

    在IE6中对图片格式png24支持度不高,如果使用的图片格式是png24,则会导致透明效果无法正常显示 解决方法: 1.可以使用png8来代替png24,即可解决问题,但是使用png8代替png24以 ...

  8. 30分钟彻底弄懂flex布局

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由elson发表于云+社区专栏 目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布 ...

  9. leetcode-28.实现strStr()

    leetcode-28.实现strStr() 题意 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字 ...

  10. Kotlin入门(21)活动页面的跳转处理

    Activity的活动页面跳转是App最常用的功能之一,在前几章的demo源码中便多次见到了,常常是点击界面上的某个按钮,然后跳转到与之对应的下一个页面.对于App开发者来说,该功能的实现非常普通,使 ...