在centos中使用docker部署war包项目(jsp篇)
前言:
长话短说,一时兴起,是本人第一篇文章,遇到的实际问题解决后产生的记录的想法,概述如有不全,望各位大佬多多指教!
一、环境的准备
我这里准备的是centos7的虚拟镜像环境(VMware)跟shell5的连接工具(用来传输文件),Navicat15(数据库可视化工具)。
链接:https://pan.baidu.com/s/1s6yRXsWtbvxsg164Cir-bg
提取码:6666
其他的我就不在这里写了,准备工作做好,下面稍微讲解一下docker
二、Docker优点
1.简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
2.避免选择恐惧症
如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3.节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
三、Docker结构
Docker daemon( Docker守护进程)
Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。
1.Client( Docker客户端)
Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。
2.Images( Docker镜像)
Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。
3.Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。
4.Registry
Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。
一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作 Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
四、Docker与虚拟机比较
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:
Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。
五、Docker安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。
Docker 要求 CentOS 系统的内核版本在 3.10以上 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
直接上大佬的详细链接:(我要讲的点在下面部署war包)
https://cloud.tencent.com/developer/article/1701451
六、Tomcat镜像的下载
- docker version //查看docker是否安装成功
-
systemctl start docker //开启docker服务
-
docker pull tomcat //默认拉取下载最新的镜像
-docker pull tomcat:8.5.38-jre8 //也可以指定特定的版本
下载完成之后查看镜像是否下载成功 -
docker images //查看所有安装的镜像
-
docker run -p 8080:8080 -d --name tomcat tomcat
-
-p 8080:8080 对应的是 宿主机端口:容器端口
-
–name tomcat1 命名为tomcat1
-
tomcat:8.5.38-jre8 使用的镜像文件名
-
docker ps //查看正在运行的容器
为空则代表没有正在运行的容器 -
docker ps -a //包括正在运行的跟未运行得到容器
-
docker start tomcat1 //通过容器名启动,也可以通过容器前面的id启动,方法就是把容器id替换掉容器名tomcat1
-docker ps
启动成功
也可以将此容器设置为开机自启动
启动时加–restart=always -
docker run -itd --name tocmat1 -p 8080:8080 --restart=always tomcat:8.5.38-jre8
-
注意:此种方法是重新创建一个新的tomcat容器,如果已存在同名容器则会报错,如果已经创建tomcat容器那就使用下面的方法
-
always //在容器已经stop掉或Docker stoped/restarted的时候才重启容器
如果已经启动的项目
- docker update --restart=always tomcat1 //最后的tomcat1是容器名,也可以用容器id替换
还有另外一种方法生成tomcat容器: - docker run -itd --name tomcat2 --restart=always -p 8081:8080 -v /root/homework/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5.38-jre8
- -v 挂载文件 将容器内部文件夹映射到自定义的文件中,如果没有回自动生成
- /root/homework/tomcat/webapps 是物理机的文件地址
- :/usr/local/tomcat/webapps 是tomcat2容器的内部文件位置
- 这里用8081:8080是因为宿主机的8080端口已经被我给容器tomcat1了,这里我没有删掉tomcat1,端口被占用看,所以只能给别的未被占用的端口,或者停止tomcat1容器的使用也是可以将tomcat2的8080端口映射到宿主机的8080端口
- 这里有个问题,就是将tomcat容器的webapps文件挂载到宿主机的时候,访问ip:端口是不会有显示,如果没挂载的话是有显示的,但是不影响war包的部署
- 挂载webapps文件的tomcat容器:
未挂载文件的tomcat容器:
七、MYSQL镜像的下载
-
docker mysql //默认拉取最新的镜像
-
我这里安装的5.7.19,根据自己需求来更改后面的版本号
-
docker run --name mysql:5.7.19 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql_5.7.19 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
-
–name 容器名字
-
-p 13306:3306 物理机端口:容器内部端口
-
-e 运行参数 初始化root用户的密码
-
-d 后台运行mysql:5.7.19下载的镜像名字加标签
-
–character-set-server=utf8mb4 : 设置 MySQL 服务器的默认编码为 utf8mb4
-
–collation-server=utf8mb4_unicode_ci : 设置 MySQL 服务器的默认排序规则为 utf8mb4_unicode_ci
-
docker ps //查看容器是否正常启动
-
docker update --restart=always mysql_5.7.19 //将mysql——5.7.19容器设置为自启动
八、war包部署
- 打开开发工具,我这里是eclipse,将可以成功运行的java项目打包成war(我这里是jsp项目)
- 这时我们可以看到刚刚选择存放的路径多了一个war包
- 使用数据库图形化工具Navicat连接数据库
- 导出此项目相关的数据库
- 之后就能到存放路径看到一个sql文件
- 新建一个mysql数据库连接
- 打开创建一个数据库,新建查询
-重新打开数据库连接可以看到数据库已经创建好
- 双击打开数据库之后右键运行SQL文件找到刚刚存放的sql文件
- 成功导入
- 刷新然后打开表就能看见数据
- 此时在docker的mysql容器中查看数据是否存在
- docker exec -it mysql_5.7.19 /bin/bash
- -i -t 等价于 -it 表示insert, 进入 ; /bin/bash 表示 shell 脚本交互界面
- mysql -uroot -proot // -p 后面的root是之前设置的root的密码
- show databases; //显示所有的数据库
- 选择某个数据库;显示当前数据库所有表
- 数据传输成功,现在开始上传war包
- 在xshell已经连接的命令窗口中输入sz然后回车,找到刚刚存放的war包传输
- 传输完成之后输入 ls查看当前目录文件
- 我这里用的容器是挂载了tomcat2的webapps文件到宿主文件的,所以我只用把war包复制到挂载的文件夹中
- cp PersonManager.war homework/tomcat/webapps/
- 进入挂载的文件夹中查看文件
- 重启tomcat2容器
-docker restart tomcat2 //tomcat2已经启动就用restart,没有启动就用start
- 去挂载的目录查看war是否被解析
这里已经被解析,我们到浏览器用ip:端口/项目名去访问**
!!!这里特别要注意的是Linux系统区分大小写,Windows系统不区分
**
这里我登录发现登不上去
- 但是我的账户跟密码都是对的,最后查阅资料,请教大神最后终于解决,这里大家要注意!!!
- 找到你项目连接数据库的配置文件,使用vi 或者 vim 空格 配置文件名称
- 前面的localhost应该是mysql容器的ip,端口是容器的端口3306,后面是数据库名要注意大小写,我的数据库中都是小写,这里要改成小写
- docker inspect mysql容器名 //先查看mysql容器的内部ip
- docker inspect mysql_5.7.19
- 正确配置为
- docker restart tomcat2 //重启tomcat容器
- 再去访问项目
登录成功!!