微服务的Docker自动化部署

如何将一个微服务打包成一个可以独立运行的Docker镜像呢?需要完成两个任务:

(1)JDK环境的Docker化

(2)微服务的Docker化

制作JDK1.8的Docker镜像

Docker常用命令介绍

(1)查看Docker本地仓库中已经下载好的镜像

  1. docker images

(2)搜索远程仓库中相关镜像

  1. docker search [imageName]

(3)查看所有被创建的容器(Container)

  1. docker ps -a

(4)查看所有正在运行的容器(Container)

  1. docker ps

(5) 创建并启动一个容器

  1. #创建后台进程
  2. docker run -di --name=[containerName] -p [port]:[port] [imageId或者imagename]

(6)设置开机后,容器自启动

  1. docker update [containerName/containerId] --restart=always

(7)查看容器启动日志文件

  1. docker logs [containerName/containerId]

(8)删除容器

  1. docker rm [containerName/containerId]

(9)删除镜像

  1. # 必须先停止容器,在删除容器,最后删除镜像
  2. docker rmi [imagesName/imagesId]

(10)启动、重启、停止容器

  1. #启动
  2. docker start [containerName/conatainerId]
  3. #重启
  4. docker restart [containerName/conatainerId]
  5. #停止
  6. docker stop [containerName/conatainerId]

制作image的一般流程

JDK无法单独运行,必须依赖于相应的操作系统,因此需要Ubuntu或者Centos等系统的image,同时还要linux版本的jdk,制作步骤如下所示:

Step1: 下载Centos:7的Docker镜像、linux版本的dk1.8包

Step2: 编写Dockerfile的执行脚本,并和jdk1.8置于同一目录下。

  1. #依赖镜像名称和ID
  2. FROM centos:7
  3. #指定镜像创建者信息
  4. MAINTAINER ITCAST
  5. #切换工作目录
  6. WORKDIR /usr
  7. RUN mkdir /usr/local/java
  8. #ADD 是相对路径jar,把java添加到容器中
  9. ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
  10. #配置java环境变量
  11. ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
  12. ENV JRE_HOME $JAVA_HOME/jre
  13. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
  14. ENV PATH $JAVA_HOME/bin:$PATH

Step3: 执行Docker 的build命令生成镜像文件

  1. docker build -t='jdk1.8' .
  2. ## [注]-t表示生成的镜像名 . 表示docker的images仓库所在的根目录,
  3. ##该命令执行完成之后,就会将jdk安装到一个centos:7上,并且配置了java的环境变量

[注意]上述步骤可以看成在Centos:7系统上安装jdk1.8,并且配置了相关java环境


将本地的image上传至私人仓库

(1)搭建私人仓库

  1. #从远程仓库拉去相关镜像
  2. docker pull registry
  3. #创建并且运行容器
  4. docker run di ‐‐name=registry p 5000:5000 registry
  5. # 修改并配置私人容器的IP地址
  6. vi /etc/docker/daemon.json
  7. # {"insecure‐registries":["192.168.184.135:5000"]}
  8. #重启Docker容器
  9. systemctl restart docker

(2)将镜像上传至私人仓库

  1. docker tag [resourceImages] ip/tag
  2. #如 dockers tag jdk1.8 192.168.56.3:5000/jdk1.8
  3. # 标记后的镜像名字包含了私人仓库的的访问ip和端口

(3)使用push命令上传至私人仓库

  1. docker push 192.168.56.3:5000/jdk1.8
  2. #如 dockers tag jdk1.8 192.168.56.3:5000/jdk1.8

使用Maven插件实现自动化docker部署

(1)在使用Docker-Maven插件之前需要先设置宿主机,使其能被远程访问。

  1. vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock

这个设置的含义为:开启docker的任意ip地址和2375端口,则任意一台远程及其可以通过该宿主机的ip:2375访问dockers。

(2)配置微服务项目的POM.XML文件,主要是添加项目构建、打包、部署的插件。包含两大主要插件:

  • spring-boot-maven-plugin
  • docker-maven-plugin
  1. <project>
  2. <build>
  3. <!-- 打包后jar包名称 -->
  4. <finalName>app</finalName>
  5. <plugins>
  6. <!--Maven插件,编译,打包,部署等相关工作 -->
  7. <plugin>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-maven-plugin</artifactId>
  10. </plugin>
  11. <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
  12. <!-- Maven工具和Docekr进行连接的插件 -->
  13. <plugin>
  14. <groupId>com.spotify</groupId>
  15. <artifactId>docker-maven-plugin</artifactId>
  16. <version>0.4.13</version>
  17. <!-- 配置文件 -->
  18. <configuration>
  19. <!-- docker所构建的镜像的名字 -->
  20. <imageName>192.168.56.3:5000/${project.artifactId}:${project.version}</imageName>
  21. <!-- 构建所需要的基础镜像,上面所构建的jdk1.8镜像文件,也就是在该镜像文件的基础上再包裹一层,故其可以看作一个完整的最小运行系统 -->
  22. <baseImage>jdk1.8</baseImage>
  23. <!--创建和启动容器时所执行的命令:jar -jar /app.jar -->
  24. <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
  25. <resources>
  26. <resource>
  27. <!-- 生成的jar包在当前项目的根目录下,该pom.xml文件同级 -->
  28. <targetPath>/</targetPath>
  29. <!-- target文件夹下面 -->
  30. <directory>${project.build.directory}
  31. </directory>
  32. <!-- 使用app.jar包来制作镜像 -->
  33. <include>${project.build.finalName}.jar</include>
  34. </resource>
  35. </resources>
  36. <!-- 要上传的docker地址,个人的docker私人仓库和端口(上面步骤已经开放) -->
  37. <dockerHost>http://192.168.56.3:2375</dockerHost>
  38. </configuration>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

以上的配置实际上就是生成了一个Dockerfile文件

  1. FROM jdk1.8
  2. ADD app.jar /
  3. ENTRYPOINT ["java","‐jar","/app.jar"]

(3)命令行窗口进入该项目根目录下面,使用Maven工具或者插件(Maven命令)完成编译、打包、制作镜像、上传镜像等一系列步骤。

  1. # 清除项目、打包成jar包,使用docker:build制作镜像文件,上传该镜像文件至私人仓库,所有的配置信息均来自上述配置的pom.xml文件
  2. mvn clean package docker:build DpushImage

在实际项目中,使用jar命令打包,导致jar包没有相关的元文件,无法直接部署,必须使用maven的package打包才行


实际上是将使用package打包好的jar包(使用jar -jar /app.jar 命令是可以直接运行的)复制到原来的jdk1.8镜像文件中,使用该镜像文件创建并启动容器执行相jar命令调用jdk环境运行jar吧

(4)使用该镜像就可以创建容器,启动容器,会执行设置好的命令:jar -jar app.jar。微服务项目也就顺利启动起来。至此,微服务项目的docker化已经介绍完毕

微服务项目的docker自动化部署流程的更多相关文章

  1. 基于【SpringBoot】的微服务【Jenkins】自动化部署

    最近,也是抽空整理了一些在工作中积累的经验,通过博客记录下来分享给大家,希望能对大家有所帮助: 一.关于自动化部署 关于自动化部署的优点,我就不在这里赘述了:只要想想手工打包.上传.部署.重启的种种, ...

  2. IDEA微服务项目的application.yml没有绿色叶子的解决办法

    1.今天在写微服务项目的时候成功入坑,那么问题是啥呢?接下来和我一起走入bug的世界吧,让我们看看究竟是怎么回事. *问题描述 1.application.yml是灰色的小格子 2.实在难看 *需要解 ...

  3. spring-boot项目的docker集成化部署(一)

    目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker ...

  4. 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署

    部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目部署:6、微服务应用程序Docker部署实现多开。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  6. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  7. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  8. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  9. 使用微服务架构思想,设计部署OAuth2.0授权认证框架

    1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...

随机推荐

  1. double运算的坑

    某个结果运算后,得出的数据:a = 15.599999999 而不是15.6,导致条件判断 a < 15.6 为true,使程序出现bug 解决办法,对运算后的浮点数,进行格式化(以保留一位小数 ...

  2. 【ElasticSearch学习】之一图读懂文档索引全过程

    ES索引过程详解: 1.客户端发送索引请求. 客户端向ES节点发送索引请求,以RestClient客户端发起请求为例: ES提供了Java High Level REST Client,用户可以通过R ...

  3. 初学dp心得

    从STL到贪心,再到现在的动态规划,可以说动态规划真的让我学的有点蒙,对于一些题目,会做,但是不会用DP,现在还不能熟练的写出状态转移方程,更重要的是,自己宛如一个哺乳期的小孩,做题需要套模板,没有模 ...

  4. 树上倍增法求LCA

    我们找的是任意两个结点的最近公共祖先, 那么我们可以考虑这么两种种情况: 1.两结点的深度相同. 2.两结点深度不同. 第一步都要转化为情况1,这种可处理的情况. 先不考虑其他, 我们思考这么一个问题 ...

  5. SVN 部署(基于 Linux)

    1.通过 yum 命令安装 svnserve,命令如下: # 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 yum -y install subversion # 若需查看 ...

  6. 一个简单的wed服务器SHTTPD(1)————命令行和文件配置解析

    开始学习<LInux网络编程>中的综合案例,虽然代码书上有,还是自己打一下加深理解和印象. 主要有两个函数,完成命令行的解析,另一个实现配置文件的解析,注释还是比较丰富的哦. //star ...

  7. Java.lang.String类

    1.String类定义   String 字符串对象本质上是一个 final 修饰的字符串数组对象, java字符串就是Unicode字符序列. 因为被final修饰, 所以字符串是常量,它们的值一旦 ...

  8. 去 HBase,Kylin on Parquet 性能表现如何?

    Kylin on HBase 方案经过长时间的发展已经比较成熟,但也存在着局限性,因此,Kyligence 推出了 Kylin on Parquet 方案(了解详情戳此处).通过标准数据集测试,与仍采 ...

  9. HashMap 底层探索

    其实HashMap就是一个Node数组,只是这个数组很奇怪它的每一个Node节点都有自己的下一个Node;这个是hashMap的Node的源码: static class Node<K,V> ...

  10. async与await----js的异步处理

    async与await----js的异步处理 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 之前写代码遇到一个问题,返回 ...