Docker从入门到掉坑(三):容器太多,操作好麻烦

不知道大家在初次使用docker的时候是否有遇到这种场景,每次部署微服务都是需要执行docker run xxx,docker kill xxx 等命令来操作容器。假设说一个系统中依赖了多个docker容器,那么对于每个docker容器的部署岂不是都需要手动编写命令来启动和关闭,这样做就会增加运维人员的开发工作量,同时也容易出错。

Docker Compose 编排技术

在前边的文章中,我们讲解了Docker容器化技术的发展,但是随着我们的Docker越来越多的时候,对于容器的管理也是特别麻烦,因此Docker Compose技术也就诞生了。

Docker Compose技术是通过一份文件来定义和运行一系列复杂应用的Docker工具,通过Docker-compose文件来启动多个容器,网上有很多关于Docker-compose的实战案例,但是都会有些细节地方有所遗漏,所以下边我将通过一个简单的案例一步步地带各位从浅入深地对Docker-compose进行学习。

基于Docker Compose来进行对SpringBoot微服务应用的打包集成

我们还是按照老样子来构建一套基础的SpringBoot微服务项目,首先我们来看看基础版本的项目结构:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第1张图片

首先是我们pom文件的配置内容:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第2张图片

然后是java程序的内容代码,这里面有常规的controller,application类,代码如下所示:

启动类Application

Docker从入门到掉坑(三):容器太多,操作好麻烦_第3张图片

控制器 DockerController

Docker从入门到掉坑(三):容器太多,操作好麻烦_第4张图片

yml配置文件:

接下来便是docker-compose打包时候要用到的配置文件了。这里采用的方式通常都是针对必要的docker容器编写一份dockerfile,然后统一由Docker Compose进行打包管理,假设我们的微服务中需要引用到了MySQL,MongoDB等应用,那么整体架构如下图所示:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第5张图片

那么我们先从简单的单个容器入手,看看该如何对SpringBoot做Docker Compose的管理,下边是一份打包SpringBoot进入Docker容器的Dockerfile文件:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第6张图片

接着便是加入docker-compose.yml文件的环节了,下边是脚本的内容:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第7张图片

docker-compose.ym配置文件有着特殊的规则,通常我们都是先定义version版本号,然后便是列举一系列与容器相关的services内容。

接下来将这份docker服务进行打包,部署到相关的linux服务器上边,这里我采用的是一台阿里云上边购买的服务器来演示。

Docker从入门到掉坑(三):容器太多,操作好麻烦_第8张图片

目前该文件还没有进行打包处理,所以没有target目录,因此dockerfile文件构建的时候是不会成功的,因此需要先进行mvn的打包:

接着便是进行Docker-Compose命令的输入了:

你会发现这次输入的命令和之前教程中提及的docker指令有些出入,变成了docker-compose 指令,这条指令是专门针对Docker compose文件所设计的,加入了一个-d的参数用于表示后台运行该容器。由于我们的docker-compose文件中知识编写了对于SpringBoot容器的打包,因此启动的时候只会显示一个docker容器。

为了验证docker-compose指令是否生效,我们可以通过docker--compose ps命令来进行验证。

这里边我们使用 docker logs [容器id] 指令可以进入容器查看日志的打印情况:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第9张图片

最后我们通过请求之前写好的接口便会看到相关的响应:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第10张图片

基础版本的SpringBoot+Docker compose案例已经搭建好了,还记得我在开头画的那张图片吗:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第11张图片

通常在实际开发中,我们所面对的docker容器并不是那么的简单,还有可能会依赖到多个容器,那么这个时候该如何来编写docker compose文件呢?

下边我们对原先的SpringBoot项目增加对于MySQLMongoDB的依赖,为了方便下边的场景模拟,这里我们增加两个实体类:

用户类

Docker从入门到掉坑(三):容器太多,操作好麻烦_第12张图片

汽车类:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第13张图片

增加对于mongodb,mysql的pom依赖内容

Docker从入门到掉坑(三):容器太多,操作好麻烦_第14张图片

编写相关的dao层:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第15张图片
Docker从入门到掉坑(三):容器太多,操作好麻烦_第16张图片

在控制器中添加相关的函数入口:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第17张图片

对原先的docker-compose.yml文件添加相应的内容,主要是增加对于mongodb和mysql的依赖模块,

Docker从入门到掉坑(三):容器太多,操作好麻烦_第18张图片

这里头我尝试将application.yml文件通过不同的profile来进行区分:

应上篇文章中有读者问到,不同环境不同配置的指定问题,这里有一种思路,springboot依旧保持原有的按照profile来识别不同环境的配置,具体打包之后读取的配置,可以通过springboot-dockerfile这份文件的ENTRYPOINT 参数来指定,例如下边这种格式:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第19张图片

最后便是我们的yml配置文件内容,由于配置类docker容器的依赖,所以这里面对于yml的写法不再是通过ip来访问相应的数据库了,而是需要通过service-name的映射来达成目标。

application-prod.yml

Docker从入门到掉坑(三):容器太多,操作好麻烦_第20张图片

当相关的代码和文件都整理好了之后,将这份代码发送到服务器上进行打包。

接着我们便可以进行docker-compose的启动了。

这里有个小坑需要注意一下,由于之前我们已经对单独的springboot容器进行过打包了,所以在执行docker-compose up指令的时候会优先使用已有的容器,而不是重新创建容器。

这个时候需要先将原先的image镜像进行手动删除,再打包操作:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第21张图片

删除镜像的命令:

docker rmi 【镜像id】

Docker从入门到掉坑(三):容器太多,操作好麻烦_第22张图片

此时再重新进行docker-compose指令的打包操作即可:

Docker从入门到掉坑(三):容器太多,操作好麻烦_第23张图片

启动之后,可以通过docker-compose自带的一些指令来进行操作,常用的一些指令我都归纳在了下边:

docker-compose [Command]

Docker从入门到掉坑(三):容器太多,操作好麻烦_第24张图片

最后对相应的接口做检测:

相关的完整代码我已经上传到了gitee地址,如果有需要的朋友可以前往进行下载。

代码地址:https://gitee.com/IdeaHome_admin/wfw

实践完毕之后,你可能会觉得有了docker-compose之后,对于多个docker容器来进行管理显得就特别轻松了。

但是往往现实中并没有这么简单,docker-compose存在着一个弊端,那就是不能做跨机器之间的docker容器进行管理

因此随者技术的发展,后边也慢慢出现了一种叫做Kubernetes的技术。Kubernetes(俗称k8s)是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

觉得文章不错就给小老弟点个关注吧!加入我的个人粉丝群(Java架构技术栈:807987079)即可领取一份Java面试宝典《Java核心知识点整理.pdf》和《Java208道面试题(含答案)》喔!

你可能感兴趣的:(Docker从入门到掉坑(三):容器太多,操作好麻烦)