当一个公司越做越大的时候,公司的系统应用也会随着不断增加的新业务变得越来越复杂和越来越臃肿,这个时候就需要将这些复杂臃肿的应用拆分成一个个的微服务,分而治之。微服务是现在企业级应用开发中流行的一个概念,涉及很多地方,下面我们从其中的一个小方面,微服务的封装,来做一个实践。
-
选型
docker。 docker的大名大家应该都如雷贯耳了,用docker封装微服务可以省去运维上的麻烦,没有复杂的操作手册,无需一遍又一遍的执行一些繁琐的shell命令,也不会出现诸如“在我电脑上是没问题的啊”这种说不清楚的问题,用docker来封装微服务,操作简单,省时省力。
springboot。被封装的微服务样例使用springboot来搭建。
ubuntu。服务器环境。下面的例子中的ubuntu环境运行在我本地的虚拟机中。
centos。微服务的运行环境。
-
安装docker
在Ubuntu环境中运行一下命令即可
apt install docker.io
-
获取centos镜像
centos是目前主流的服务器linux的发行版,占用资源少,且稳定。我们先从docker的镜像库中搜索centos,并根据获取到本地
- 搜索centos镜像
docker search centos
1.jpg
- 根据搜索到的NAME参数,获取镜像到本地,不加版本号的情况下,默认拉取的是最新版本
docker pull centos
2.jpg
- 查看本地镜像
docker images
3.jpg
-
制作自己的镜像,这一步中需要将已经编写好并导出的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/能对应的看到文件信息。
-
解压jdk
将jdk压缩包解压到指定目录,我在centos的镜像中创建了一个/app/java的目录,并解压在这个目录中
6.jpg -
将应用jar包复制到指定目录,我放在了/app/simpleboot目录中
7.jpg这里这个jar就是需要被封装的微服务,功能比较简单,就是在获取到http请求时,打印一段文字,名字叫simpleboot.jar
- 退出容器
exit
- 找到刚刚编辑过的容器id
docker ps -a
9.jpg
- 提交更改,将更改保存为一个新镜像,这里我将新镜像命名为kuzz/simpleboot,版本号为0.1
docker commit d5803e784667 kuzz/simpleboot:0.1
- 此时输入命令查看镜像,本地已经有了新保存的镜像
docker images
10.jpg
-
编辑Dockerfile文件
在ubuntu目录中新建一个Dockerfile文件,内容如下,其中FROM指定基础镜像,ENV为启动时的环境变量,ENTRYPOINT为启动时运行的命令。
11.jpg
- 根据Dockerfile编译生成新镜像,命令中-t 指定新镜像名字,命令最后的 . 表示Dockerfile所在的目录
docker build -t newboot .
此时查看本地镜像,可以发现新生成的镜像newboot也在其中了
13.jpg
- 启动新容器,其中-d 表示以守护进程的方式启动,-p绑定宿主机和容器的端口,下面18080位宿主机ubuntu的端口,8080为容器中的端口
docker run -d -p 18080:8080 newboot
-
此时在浏览器中输入unbuntu的ip和18080端口,就可以访问被封装的服务了
14.jpg
-
操作过程中可能遇到的一些问题
由于上面整个过程是在虚拟机中完成的,所以当最后在本地电脑中访问虚拟机ubuntu的18080端口时访问不了,原因是ubuntu的防火墙禁止访问了这个端口。执行以下命令可开启端口
ufw allow 18080
若ubuntu中未安装 ufw,可用以下命令安装
apt-get install ufw
若用ufw开启端口后仍不能访问,可试着删除防火墙后,再安装ufw
apt-get remove iptables
-
后记
实际上上面的操作也略显繁琐了,在正常的可以访问外网的服务器上,我们完全可以直接将centos作为基础包,即Dockerfile中的FROM参数,然后再将上传jdk和jar包的动作配置在Dockerfile中完成,但考虑到真实的部署场景可能服务器并不能访问外网,需要将centos,还有jdk等都先配置好,在将镜像传到生产服务器上运行启动,所以选择了先拉取外网镜像库中的centos,再创建一个本地的镜像这样的做法。
docker的功能强大,能做的事情远不止与此,配置也可以有很多其他灵活的方法,以上的实践纯属抛砖引玉,欢迎一起探讨。
网友评论