Docker基础-项目部署流程解析
一、部署Java应用
(1)项目准备
可以看到该项目拥有common与service两个模块,说明它是一个聚合工程。common是一个通用的工具模块,service是业务模块。
将来该工程需要访问我们之前部署好的那个MySQL数据库,但是它是部署在虚拟机中的一个docker内部。
而在真实项目部署时像数据库这样的容器是无法通过端口映射在外部去进行访问的,只能通过容器名去访问,所以项目中JDBC的连接就得按照容器名去进行配置了。
可以看到有三个yaml配置文件,内部设定了JDBC的连接参数。
- 可以发现这里连接的地址没有写死,而是使用了 $占位符 来读取配置中的其他配置变量,也就是说这里的IP地址不是写死的,而是一个变量。因为等会我们把它部署到虚拟机后要与虚拟机中的mysql容器互连,而它又是动态地址。
- 而local配置文件用于配置本地开发时的的IP地址,所以此处肯定是需要填写真实的IP地址
- 还准备好了一个dockerfile文件,用于打包该java项目
- 可以使用maven来进行打包
可以看到打包完毕的jar包以及生产的Dockerfile文件
后续只要把这两个生产的文件拷贝到虚拟机内,就能完成项目构建了。
(2)虚拟机中完成构建
上传两个文件到虚拟机后执行docker build进行项目构建
可以看到构建好的hmall镜像
运行之前需要检查是否有其他容器占用了8080端口,因为它与java项目占用的端口冲突了,也就需要停止掉该dd容器,再去创建并运行hmall容器。
这样就可以在浏览器中正常访问到该java项目了
二、部署前端
为什么需要创建一个全新的容器,因为先前的Nginx容器只挂载了html目录没有挂载conf文件,所以是没有办法对Nginx的conf文件去做配置的。
(1)前端项目介绍
- 前端html页面
可以看到存在商城的常规页面以及后台管理页面,因此Nginx就需要对这两个目录分别去做代理。 - conf文件
在该文件中就配置了对这两个目录的代理
可以看到里面的location路径指的是文件挂载到容器内以后在虚拟机中所处的位置,以及两个目录分别对应的端口号(18080与18081)。
还可以看到这里指定了对后台接口的配置,也就是前端所有的请求都将要发到了后端的这个api路径,最终带到后台的8080端口。而因为Nginx与java应用都使用容器部署了,所以在路径之中要使用容器名来进行互连 ,在这里也就使用了java应用的容器名hamll来代替IP地址来实现反向代理。
如果在虚拟机中实际部署的容器名与配置文件中的不一致,那么就需要对文件进行修改。 - 挂载conf文件
在Nginx官方文档中查看如何配置conf文件
这里也告诉了我们宿主机配置文件及容器内配置文件的地址,按这里进行两文件关连即可。
(2)项目部署
- 上传Nginx的配置文件
- 删除原有Nginx容器
- 创建并运行Nginx容器
- 查看Nginx容器的运行情况,发现它能正常启动
可以成功在浏览器中访问到前端项目!!
在前端页面执行查询操作,调出java项目的logs日志后发现它弹出了相关操作的日志,说明前后端以及数据库这三个容器之间的互连没有任何问题。
整个服务的部署也就成功了!!
三、DockerCompose
(1)DockerCompose介绍
在前面的教程中可以感受到手动部署整个前后端项目的流程较为复杂,而且需要把整个项目拆成一个个部分来进行部署,这种分散部署没有体现出项目的整体性,而且运维操作起来比较困难。
这里就来使用DockerCompose工具来帮助解决这个问题。
一组相关联的应用容器指的是一个完整项目所拥有的前后端、数据库、各种中间件。
通过DockerCompose工具就可以实现这个项目相关容器的同一管理。
可以看到DockerCompose文件的简易模版:
- 一个项目对应一个yaml文件。
- 项目中的每一个部分在DockerCompose中都称之为一个服务,服务列表当中定义的就是一个一个容器,同时要去描述清楚每个容器运行时的一些参数信息。
而在以前我们主要通过docker run命令来部署容器,同时也在命令中描述了该容器的参数信息。与此类似的,在DockerCompose文件中也应该描述好这些信息,所以它们描述的信息实际上是差不多的,只是语法上有差异。
(2)DockerCompose文件的语法
两种文件的语法比较
- version代表当前DockerCompose文件的语法版本
- services代表容器列表
- container_name代表容器名
- ports代表端口映射
- environment代表环境变量
- volumes代表挂载的数据卷
- network代表网络
- image代表镜像名称
配置多个容器的语法展示:
(3)DockerCompose的使用
这些命令的作用范围是当前project内的容器;project名称默认为root,不加 -p 参数就会默认指定project名称为root;如果compose文件就在当前目录那么就也不需要加 -f 参数。
运行compose文件:
可以看到它先执行了build构建镜像操作,再来创建网络与容器。
然后就也可以查看到当前项目下所有的进程:
可以正常使用java项目!!
关闭所有容器、网络:
所有痕迹都清理干净了。
总结来说,DockerCompose最重要的就是来编写compose文件,只要这个文件编写好就可以极度简化Docker的部署流程,实现一键部署。除此以外DockerCompose还可以做集群部署,比如说需要一键把java项目部署到多台服务器上,不过还需要借助其他功能来实现这种多服务器的互连。