简单几步,使用docker打包springboot应用

2019-11-18  本文已影响0人  昆猪IMK

当一个公司越做越大的时候,公司的系统应用也会随着不断增加的新业务变得越来越复杂和越来越臃肿,这个时候就需要将这些复杂臃肿的应用拆分成一个个的微服务,分而治之。微服务是现在企业级应用开发中流行的一个概念,涉及很多地方,下面我们从其中的一个小方面,微服务的封装,来做一个实践。

  1. 选型

    docker。 docker的大名大家应该都如雷贯耳了,用docker封装微服务可以省去运维上的麻烦,没有复杂的操作手册,无需一遍又一遍的执行一些繁琐的shell命令,也不会出现诸如“在我电脑上是没问题的啊”这种说不清楚的问题,用docker来封装微服务,操作简单,省时省力。

    springboot。被封装的微服务样例使用springboot来搭建。

    ubuntu。服务器环境。下面的例子中的ubuntu环境运行在我本地的虚拟机中。

    centos。微服务的运行环境。

  2. 安装docker

    在Ubuntu环境中运行一下命令即可

  apt install docker.io
  1. 获取centos镜像

    centos是目前主流的服务器linux的发行版,占用资源少,且稳定。我们先从docker的镜像库中搜索centos,并根据获取到本地

    • 搜索centos镜像
  docker search centos
1.jpg
  docker pull centos
2.jpg
  docker images
3.jpg
  1. 制作自己的镜像,这一步中需要将已经编写好并导出的springboot应用jar包复制到centos镜像中,并且在镜像中配置好jdk

    • 将要上传的jar包和上传到ubuntu的目录


      4.jpg
    • 启动centos容器
  docker run -i -t -v /home/kuzz/software/:/mnt/software/ ff426288ea90 /bin/bash

这条命令比较长,我们稍微分解一下,其实包含以下三个部分:docker run <相关参数> <镜像 ID> <初始命令>
其中,相关参数包括:
-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
假设我们的所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。
也就是说:/root/software/是本来虚拟机的真实目录,其对应的容器中的目录为:/mnt/software/
那么虚拟机中/home/kuzz/software/下存放的文件信息,到容器的/mnt/software/能对应的看到文件信息。

5.jpg 8.jpg
  exit
  docker ps -a
9.jpg
  docker commit d5803e784667 kuzz/simpleboot:0.1
  docker images
10.jpg
  1. 编辑Dockerfile文件

    在ubuntu目录中新建一个Dockerfile文件,内容如下,其中FROM指定基础镜像,ENV为启动时的环境变量,ENTRYPOINT为启动时运行的命令。


    11.jpg
12.jpg
  1. 根据Dockerfile编译生成新镜像,命令中-t 指定新镜像名字,命令最后的 . 表示Dockerfile所在的目录
  docker build -t newboot .

此时查看本地镜像,可以发现新生成的镜像newboot也在其中了


13.jpg
  1. 启动新容器,其中-d 表示以守护进程的方式启动,-p绑定宿主机和容器的端口,下面18080位宿主机ubuntu的端口,8080为容器中的端口
  docker run -d -p 18080:8080 newboot
  1. 此时在浏览器中输入unbuntu的ip和18080端口,就可以访问被封装的服务了


    14.jpg
  1. 操作过程中可能遇到的一些问题

    由于上面整个过程是在虚拟机中完成的,所以当最后在本地电脑中访问虚拟机ubuntu的18080端口时访问不了,原因是ubuntu的防火墙禁止访问了这个端口。执行以下命令可开启端口

  ufw allow 18080

若ubuntu中未安装 ufw,可用以下命令安装

  apt-get install ufw

若用ufw开启端口后仍不能访问,可试着删除防火墙后,再安装ufw

  apt-get remove iptables
  1. 后记

    实际上上面的操作也略显繁琐了,在正常的可以访问外网的服务器上,我们完全可以直接将centos作为基础包,即Dockerfile中的FROM参数,然后再将上传jdk和jar包的动作配置在Dockerfile中完成,但考虑到真实的部署场景可能服务器并不能访问外网,需要将centos,还有jdk等都先配置好,在将镜像传到生产服务器上运行启动,所以选择了先拉取外网镜像库中的centos,再创建一个本地的镜像这样的做法。

    docker的功能强大,能做的事情远不止与此,配置也可以有很多其他灵活的方法,以上的实践纯属抛砖引玉,欢迎一起探讨。

上一篇下一篇

猜你喜欢

热点阅读