说目前最流行的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"]
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加入到容器中。
该命令用于声明在运行时容器提供服务的端口。注意:这只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时(即run命令的-P参数),会自动映射EXPORT的端口。
该命令制定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
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论