一、为什么要使用Docker部署Spring Cloud项目

        说目前最流行的java开发方式就是Spring Boot和Spring Cloud应该不为过。Spring Boot进一步加强了“约定大于配置”这一Spring的中心思想,使得我们开发人员能够更快捷,更便利的开发Spring项目,也使得开发java web变得不再那么费劲。而Spring Cloud的出现更是让我们项目的开发有了更多的选择,Spring Cloud集成并封装netfix中的ribbon,eureka,hystrix,feign和zull等十分出色的项目,为我们提供了服务注册与发现,客户端的负载均衡和路由分发等功能,为现在的大部分中小企业开发分布式架构提供了一整套的解决方案,大大提高了工作效率,个人认为Spring Cloud在未来一定会像Spring一样的出色。而Docker的出现让容器化技术得以普及,更快的部署和维护与Spring Cloud的结合,能让我们不再像以前一样为了某一个模块的增加而服务器上大动干戈,还需要考虑环境的问题,现在只需要一句docker start .....便可轻松实现服务的扩展。

二、如何使用Docker来部署Spring Cloud项目

       Spring Cloud项目必须基于Spring Boot项目来开发,所以这里讲解Spring Boot项目的部署,Spring Cloud项目也是同理。博主使用的是Dockerfile的形式来部署。废话不多说,先张贴代码:

FROM frolvlad/alpine-oraclejdk8
VOLUME /usr/test
ADD test.jar app.jar
EXPOSE 8001
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
FROM:

    Docker是基于镜像的部署,幸运的是Docker官方和开发者们为我们维护了许多高质量的Docker镜像,而基于这些镜像我们能做出符合自己需求的镜像。此处的FROM意思为我们即将要创建的镜像的基础镜像的名字,这个名字可以是我们本地已有的镜像,也可以是Docker Hub上的镜像,如果是Docker Hub上的镜像,此时docker daemon会为我们自动下载该镜像。还有一个要注意的点,如果是本地镜像要加上版本(镜像名:版本号),否则默认版本号为latest。

VOLUME:

此处的映射路径为/usr/test。这是我们自定义的映射路径,后续要演示记录日志的功能。当然也可以指定/tmp 其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径。而为什么链接到容器的/tmp目录呢?因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录。当然此处的/tmp也可以变成你的日志记录文件夹,这样就可以在本地实时查看日志记录了。

ADD:

    将我们自身的项目admin.jar作为app.jar加入到容器中。

EXPORT:

    该命令用于声明在运行时容器提供服务的端口。注意:这只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时(即run命令的-P参数),会自动映射EXPORT的端口。

ENTRYPOINT:

    该命令制定Docker容器启动时执行的命令,可多次设置,但只有最后一条会生效。

   -Djava.security.egd=file:/dev/./urandom   这条命令有疑惑,这是因为linux中和windows中取随机数时的参考策略不同,linux默认的随机数会被取完,导致返回-1.而制定/dev/./urandom这个取随机数的策略时,当随机数取完之后会返回伪随机数,不至于影响业务。

三、创建镜像并运行

我们jar包中只有一个test类:

package com.example.test.rest;
import java.io.File;
import java.io.FileOutputStream;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestRest {
	@RequestMapping("/test/{info}")
	public String test(@PathVariable(value="info") String info) throws Exception {
		FileOutputStream fos = new FileOutputStream(new File("/usr/test/test.txt"));
		fos.write(info.getBytes());
		fos.close();
		return "test ok";
	}
}

  当我们访问/test/{info}时便将info的信息输出到/usr/test/test.txt中。废话不多说开始打包。

Docker部署springcloud多项目 docker springcloud多服务_微服务部署



文件上传到装有Docker的服务器上。

执行命令   docker build -t test/test8001:test .

-t 表示打包成功后的镜像tag   不要忘了最后一个点。.表示Dockerfile文件和jar包在同一个路径,如果不在需要写出Dockerfile的绝对路径。

Docker部署springcloud多项目 docker springcloud多服务_docker_02

打包成功!!!

我们先关闭所有正在运行的docker容器,并删除/var/lib/docker/volumes中的所有文件,呈现如下状态

Docker部署springcloud多项目 docker springcloud多服务_微服务部署_03

运行我们的docker 镜像。

Docker部署springcloud多项目 docker springcloud多服务_Docker_04

此时会返回一长串字符:06764ea7337484494183557c7425e706dd31e2333aced6034b7a53354c6c8a75

这串字符就是我们容器的唯一ID。

现在我们再来看看文件夹     /var/lib/docker/volumes

Docker部署springcloud多项目 docker springcloud多服务_微服务部署_05

我们可以看到这里产生了一个文件夹。但是这里的文件夹名称却和我们的容器ID不同,接着我们再看看/var/lib/docker/containers这个目录下有什么东西。

Docker部署springcloud多项目 docker springcloud多服务_微服务部署_06

在containers目录下出现了容器的唯一ID。这里面存储的是我们容器运行需要的数据。那么我们怎么看到volumes下的目录呢?

我们可以据下图的方式查看:

Docker部署springcloud多项目 docker springcloud多服务_微服务部署_07

根据docker inspect 容器ID   这条命令可以查看到容器的详细信息。但是显示的数据太多了,我们也可以选择性的查看。

根据 docker inspect --format "{{.Mounts}}" 06764ea73374

--format  根据模板来查看信息,我们这里就查看Mounts的信息

Docker部署springcloud多项目 docker springcloud多服务_docker_08

对应着docker inspect 06764ea73374 中划红线的这一段

Docker部署springcloud多项目 docker springcloud多服务_Docker_09



从上面我们可以看到。我们已经成功将容器中的/usr/test目录挂载到了主机的/var/lib/docker/volumes/5beee516b4656b67f907cf7178c0323434a4c7b2d044b4059f9e9b52c58e054a/_data目录下。上图划红线中的name后的字符串也就是我们在/var/lib/docker/volumes下面看到的文件夹名称。

接着我们尝试访问:

Docker部署springcloud多项目 docker springcloud多服务_springboot_10

上图显示访问成功了。那么在/var/lib/docker/volumes/5beee516b4656b67f907cf7178c0323434a4c7b2d044b4059f9e9b52c58e054a/_data这里面应该会有我们需要的test.txt文件。

Docker部署springcloud多项目 docker springcloud多服务_springcloud_11

我们可以看到。果然出现了!!!!那么会有hello world!字样吗?我们可以打开来看看。

Docker部署springcloud多项目 docker springcloud多服务_springcloud_12

果然出现了!!!这就证明我们的文件挂载成功了。

这时就算你停止容器,该文件也不会消失。基于此我们可以轻松的搭建微服务的日志系统。

下节讲解docker部署微服务时网络连接的注意点。


以上内容均为本人愚见,望各位大牛在评论中多加指点。小弟感激不尽!!!