您的位置:首页 > 运维架构 > Docker

将springBoot项目部署到docker入门实例

2017-08-24 17:47 1151 查看
由于springBoot项目的便捷性,再加上有了springCloud下的各种组合组件,可以很快的开发出微服务的系统。

docker作为一个开源的应用容器引擎,用它可以快速地实现微服务系统的部署。下文是我今天用docker+springBoot部署项目的一个记录。

操作环境:

VM虚拟机安装的ubuntu(ubuntu-16.04.3-desktop-amd64)

root@ubuntu:/home/ping# uname -a
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux


在ubuntu上安装好了jdk以及maven,并设好了环境变量

export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.0
export PATH=$PATH:$MAVEN_HOME/bin
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin




docker安装

为了方便,直接使用apt命令安装即可

apt-get install docker.io -y


安装完成前,为了使系统获取到最新的软件包,先执行apt-get update

安装完成后,执行docker -v查看下是否可以运行

root@ubuntu:/home/ping# docker -v
Docker version 1.12.6, build 78d1802


springBoot项目准备

为了测试方便,仅创建一个只有一个返回字符串的controller.

/**
* desc: 测试controller
* author: haiyangp
* date:   2017/8/24
*/
@RestController
@RequestMapping(value = "hello")
public class HelloController {

@RequestMapping(value = "say")
public String sayHello(){
return "Hello boy.Welcome here!";
}
}


在pom.xml中添加docker的插件

<?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.haiyang.springboot</groupId>
<artifactId>docker-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>docker-study</name>
<description>Demo project for Spring Boot</description>

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

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<docker.image.prefix>haiyang</docker.image.prefix> <!-- 在docker运行时要用的,只是一个前缀而已,就像包名一样,可自己任意定义此名称 -->
<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>
<!-- docker 插件 begin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- docker 插件 end -->
</plugins>
<finalName>docker-study</finalName><!--打包后文件名称-->
</build>
</project>


在这里面,主要用了docker-maven-plugin这个maven插件

此插件的地址为:https://github.com/spotify/docker-maven-plugin

在此插件的开源地址中,有关于插件的一些介绍

Dockerfile配置

在上面的pom.xml中的docker插件配置中有这样的一条配置

<dockerDirectory>src/main/docker</dockerDirectory>
在里面指定了dockfile的目录,所以需要在项目的src/main下创建一个docker目录,并在其目录中配置Dockerfile文件

dockerfile是用来构建docker镜像时用的,相当于一些linux命令,对于它的具体说明与配置,可以自行在网上搜索到,在这篇博文中有具体的介绍http://blog.csdn.net/we_shell/article/details/38445979



在此项目中,这里是这样写的

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD docker-study.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]


FROM 指定此docker需要依赖的docker image,由于这是一个spring boot项目,故要运行一个spring boot项目,必须得要有jdk,而上面写的frolvlad/alpine-oraclejdk8:slim这个镜像中包含了一套拥有jdk的环境,可以此环境中运行java程序

VOLUME 用来指定docker运行的临时目录。它将在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录

ADD 是将pom.xml中的targetPath下的docker-study.jar复制到容器中,并命名为app.jar

ENTRYPOINT 指定了容器启动时要执行的命令。那么这里就是执行java -jar /app.jar的意思,意思就是去运行这个springBoot项目了

在网上看见许多地方都加入了-Djava.security.egd=file:/dev/./urandom这个命令,通过查阅网上资料才得知由于tomcat每个session的生成时会产生一个sessionId,这个id是一个随机数,会调用系统的随机算法来产生……………………。看了文章后,终于也解决了我以前在一台centos服务器上跑springboot项目,启动要差不多等1分钟左右的时间才能启动完毕的疑惑。而在开发时,启动的速度又很快,差不多几秒就启动完成了,今天看了这篇文章后,终于豁然开朗了。感兴趣的如不了解熵的可以也看看这篇文章:http://hongjiang.info/jvm-random-and-entropy-source/(JVM上的随机数与熵池策略)以及百度百科的相关资料。

Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。

计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。

内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。

打包与构建docker镜像

我这里为了测试方便,是将代码直接压缩,然后再上传到linux上,再进行解压,获取出项目代码的。在实际开发中,应该通过专门的构建工具来完成,如jenkins之类的。
进入到项目后,直接运行打包构建docker命令即可.

mvn clean package docker:build

这个命令可以此maven插件的github项目介绍中找到 ,如下:


Usage

You can build an image with the above configurations by running this command.
mvn clean package docker:build


To push the image you just built to the registry, specify the
pushImage
flag.
mvn clean package docker:build -DpushImage


To push only specific tags of the image to the registry, specify the
pushImageTag
flag.
mvn clean package docker:build -DpushImageTag


我在linux上运行的命令如下:

root@ubuntu:/home/ping/Desktop/dockerTest/docker-study# ll
total 48
drwxr-xr-x 4 root root 4096 Aug 24  2017 ./
drwxrwxr-x 4 ping ping 4096 Aug 24 02:14 ../
-rw-r--r-- 1 root root 6164 Aug 24  2017 docker-study.iml
-rw-r--r-- 1 root root  249 Aug 24  2017 .gitignore
drwxr-xr-x 3 root root 4096 Aug 24  2017 .mvn/
-rw-r--r-- 1 root root 6468 Aug 24  2017 mvnw
-rw-r--r-- 1 root root 4994 Aug 24  2017 mvnw.cmd
-rw-r--r-- 1 root root 2204 Aug 24  2017 pom.xml
drwxr-xr-x 4 root root 4096 Aug 24  2017 src/
root@ubuntu:/home/ping/Desktop/dockerTest/docker-study# mvn package docker:build


当运行完成后,会打印出如下的结果信息
Downloaded: https://repo.maven.apache.org/maven2/com/spotify/docker-client/8.7.1/docker-client-8.7.1-shaded.jar (7.4 MB at 157 kB/s)
[INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier]
[INFO] Copying /home/ping/Desktop/dockerTest/docker-study/target/docker-study.jar -> /home/ping/Desktop/dockerTest/docker-study/target/docker/docker-study.jar
[INFO] Copying src/main/docker/Dockerfile -> /home/ping/Desktop/dockerTest/docker-study/target/docker/Dockerfile
[INFO] Building image haiyang/docker-study
Step 1 : FROM frolvlad/alpine-oraclejdk8:slim
---> 60a1d51a971c
Step 2 : VOLUME /tmp
---> Using cache
---> 4d543a55947f
Step 3 : ADD docker-study.jar app.jar
---> 1db2e0bda70e
Removing intermediate container 0470cb282ae4
Step 4 : ENTRYPOINT java -jar /app.jar
---> Running in eff27a78c88e
---> 4e5275716856
Removing intermediate container eff27a78c88e
Successfully built 4e5275716856
[INFO] Built haiyang/docker-study
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:15 min
[INFO] Finished at: 2017-08-24T02:21:51-07:00
[INFO] Final Memory: 37M/89M
[INFO] ------------------------------------------------------------------------
root@ubuntu:/home/ping/Desktop/dockerTest/docker-study#

这样就表示此项目打包与构建docker image成功了!

运行docker image

运行前先查看刚刚构建的那个docker image是否存在,运行docker images命令即可

root@ubuntu:/home/ping/Desktop/dockerTest/docker-study# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
haiyang/docker-study         latest              4e5275716856        12 minutes ago      181 MB
frolvlad/alpine-oraclejdk8   slim                60a1d51a971c        3 weeks ago         166.5 MB
root@ubuntu:/home/ping/Desktop/dockerTest/docker-study#


看见有haiyang/docker-study这个容器,证明是成功的

接下来,直接运行即可

docker run -p 8080:8080 -t haiyang/docker-study



docker run -p 8080:8080 -t haiyang/docker-study 这行命令的意思是运行haiyang/docker-study这个容器,-p参数意思是把容器里的8080端口转到linux的8080端口上, -t是返回一个终端

然后赶紧在浏览器里运行测试下



OK!运行成功了!

如要关闭此容器,指定 docker ps -a 获取出CONTAINER ID

再执行docker stop 加ID即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: