Docker部署Spring cloud微服务详细讲解 (一) - 初学程序员 - CSDN博客

一、为什么要使用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:

    Docker的运行相当于是操作系统的一个进程,但是该进程又与普通进程有些许不同,因为该进程内部维护着的是我们的一个微服务的完整结构,而往往项目中需要运行的微服务都有记录日志或者其他写出文件的功能。设想一下这样的情况:我们的微服务现在正在运行,但是访问量突然增大,开发人员又没有关注到这一点,没有进行水平扩展,这时候很有可能这个微服务就down了,而这个微服务一旦down了之后,出现的情况就是整个容器的status就变成了Exited,而此时如果将容器删除,容器中的所有数据卷会跟随容器一起删除,因为这些数据卷是临时的。此处的映射路径为/usr/test。这是我们自定义的映射路径,后续要演示记录日志的功能。当然也可以指定/tmp 其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径。而为什么链接到容器的/tmp目录呢?因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录。当然此处的/tmp也可以变成你的日志记录文件夹,这样就可以在本地实时查看日志记录了。

ADD:

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

EXPORT:

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

ENTRYPOINT:

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

    ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]这条命令中可能部分读者会对   -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;@RestControllerpublic 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的服务器上。

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

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

打包成功!!!

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

运行我们的docker 镜像。

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

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

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

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

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

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

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

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

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

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

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

接着我们尝试访问:

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

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

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

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

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

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


Original url: Access
Created at: 2019-04-15 15:12:24
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论