前言 文章中选用的springmvc + maven的项目,来源于我的开源中国的测试用例。 https://gitee.com/zhoubang85/sea-docker-example
请选用“springmvc-maven”模块。
为了更加贴近实际的项目模块结构 + 部署流程,所以测试用例中也会引入其他的服务依赖,比如mysql、tomcat等。
同时,也会针对不同的部署方式进行讲解。让大家了解更多的知识点。当然,我一个人的学习范围,不能概括多数人的技术水平,如有遗漏或者不对的地方,还请在文章最下方留言说明,不胜感激!
简单对比一下传统部署war包 与 在Docker中部署war的异同点
目的是让各位对Docker部署有一个比较感官的了解。
使用传统方式部署 | 使用Docker部署 | |
---|---|---|
步骤1 | 在本地编译项目并打成war包 | 在本地编译项目并打成war包 |
步骤2 | 上传至服务器上tomcat的webapps目录 | 上传至服务器某目录下> war包是无法直接上传至tomcat容器中的webapps目录下面的 |
|
| 步骤3 | 执行.sh脚本启动tomcat服务 | 部署war到Docker中的常见方式:
- 首先启动tomcat容器,然后通过cp命令复制war到tomcat容器的webapps目录下(测试环境使用)
- 通过数据挂载的形式启动tomcat容器(测试环境使用)
- 通过Dockerfile来构建新镜像并启动新镜像(生产环境建议使用)
|
| 步骤4 | 浏览器访问项目 | 浏览器访问项目 |
—— 根据上面的简单描述,可以看到,Docker部署项目与传统部署的流程步骤还是有区别的。
—— 对于第一步项目编译打包的话,都是在本地操作的,这个都是一样的,平时怎么打包的就怎么打包
—— Docker支持多种部署方式,所以很灵活、方便扩展维护(具体的部署流程步骤,在文章最下面有详细讲解)。
—— 上面的表格描述,不考虑自动化部署Jenkins;当然Docker本身也是支持使用Jenkins自动化部署的。
前期环境准备
为了更加贴近实际的项目开发部署流程,测试用例项目中会集成Mysql数据库,web容器采用Tomcat。
项目环境
环境安装
根据上面的项目环境以及服务器环境,我们需要在服务器上安装并运行以下服务:
安装Docker环境
因为我是在阿里云服务器上操作部署的,因此Docker环境是在centos系统环境下安装的。
- 如果服务器上未安装Docker环境的话,可以参考下面的文章进行安装。
《在centos系统中安装Docker》
https://yuque.com/zhoubang/docker/rqspmt
- 如果没有实际的服务器的话,如果本地电脑是win7系统,可以参考在win7环境下安装Docker环境
《在windows系统中安装Docker》
运行软件环境
启动运行Mysql以及Tomcat的Docker容器。具体安装以及启动的步骤,不清楚的朋友,可以查看之前写的章节。
- 《在Docker中安装tomcat》
https://yuque.com/zhoubang/docker/docker-tomcat-install
- 《在Docker中安装mysql》
https://yuque.com/zhoubang/docker/docker-mysql-install
因为tomcat镜像中已经引入jdk的镜像依赖了,所以我们无需安装jdk镜像,不用启动jdk的容器。
测试用例中,使用到了mysql数据库,默认情况下连接的是我的阿里云服务器上的mysql容器中的数据库。 不保证我的阿里云服务器上的mysql数据库会一直正常运行,所以,你可以自行修改jdbc连接,更换为自己的mysql数据库即可(注意的是,容器必须可以访问到mysql数据库)。
下载项目用例源代码到本地
项目用例的话,可直接使用我写的一个简易的项目测试用例。
具体的项目下载以及导入到你本地的开发工具中,比如eclipse、idea等,这些我就不多做说明了,想必大家都会的。
将项目打成war包
具体的编译打包项目,我也不多做说明了,无非就是打成war包,和平时开发的流程是一样的。
【注意点】:
由于当前文档教程是对springmvc + maven 结构的项目进行Docker部署,所以,你编译打包的项目模块应该是“springmvc-maven”这个模块,不要打包错误了(最终上传的应该是 springmvc-maven.war 这个war包);
打包项目的时候,一定要将 jdbc.properties 文件中的mysql数据库配置,修改成真正可以访问到的mysql数据库连接。
为了方便,我将打好的war以附件的形式添加在此,方便各位直接下载使用,略过拉取项目源码的步骤,节省时间。
【说明】: 该war中连接的是我的 39.106.18.21的mysql数据库。 不保证该数据库会一直运行或者存在,如果出现连接超时或者异常,建议还是自己手动修改成自己的mysql数据库最好。
上传war包到服务器对应目录下
将“springmvc-maven”这个模块的target目录下的war文件上传至你的服务器某目录下。这里我就上传到我的服务器下的 /opt/projects/ 目录下,方便统一查看管理。
在Docker中部署项目
在这一步开始之前,我确定你们已经安装好了Docker环境,以及成功运行mysql容器、tomcat容器,并且mysql以及tomcat可以正常访问和使用。
war包在tomcat容器中部署的3种方式
第三种是实际生产开发建议使用的方式,前面2种用于测试环境比较简单合适。
【方式一】:将war复制到tomcat容器中的webapps目录下
【注意】:请先运行一个tomcat容器。
我的服务器上已经下载好了一个tomcat镜像了,如下图:
然后,你就可以运行下面的命令,来启动一个tomcat容器:
docker run -p 8080:8080 --name springmvc-maven-web -d tomcat
如果宿主机出现8080端口冲突,请换一个端口即可。
运行上面的命令之后,可以查看已经启动的tomcat容器:
其他的容器是我服务器以前启动运行的,可以不用理会。
访问这个tomcat服务(我的服务器域名是 www.2b2b92b.com): 可以看到,tomcat服务可以正常访问。
将war包复制到tomcat容器的对应tomcat的webapps目录下
重启tomcat容器
在Linux命令行中执行以下命令:
docker cp /opt/projects/springmvc-maven.war eb:/usr/local/tomcat/webapps
其中,命令后面的冒号的左边“eb”指的是tomcat容器的ID。
docker restart eb
其中的“eb”是tomcat容器的ID
访问springmvc-maven项目,浏览器输入请求地址: 根据不同版本的mysql,访问地URL的时候,页面上可能会出现下面的错误:
http://www.2b2b92b.com:8080/springmvc-maven/user/list
java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.
原因,和新版本的mysql有关,新版mysql使用的是caching_sha2_password这种密码格式。 解决办法: 可以通过mysql客户端或者mysql容器中的命令行,来执行以下SQL即可解决:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
重新访问 http://www.2b2b92b.com:8080/springmvc-maven/user/list 即可正常返回数据,如下图:
root用户的密码是123456
至此,第一种部署war的方式已经完成!
【方式一】部署方式存在的缺点: 需要手动去复制war到对应的webapps目录下,很不方便。
【方式二】:将war包以挂载的方式启动tomcat容器
在Linux命令行下面,执行下面命令,以挂载的形式启动一个tomcat容器:
docker run -p 8081:8080 --name springmvc-maven-web-volume -v /opt/projects/springmvc-maven.war:/usr/local/tomcat/webapps/springmvc-maven.war -d tomcat
因为在【方式一】中我们已经启动了一个tomcat容器了,且映射的宿主机端口是8080,所以在【方式二】中就需要更换端口号,让宿主机中的端口号不能出现冲突。 同时容器的别名也需要更换,【方式一】中设定的容器名称是“springmvc-maven-web”,那在这个【方式二】中,我们把容器名称设置为“springmvc-maven-web-volume”。
访问项目 浏览器输入 http://www.2b2b92b.com:8081/springmvc-maven/user/list 即可看到返回的数据。 请求的URL地址,只需更换端口号即可。
查看正在运行的tomcat容器信息 可以看到,目前总共有2个正在运行的tomcat容器。一个是【方式一】运行的tomcat容器,一个是当前【方式二】运行的tomcat容器。
【方式二】部署项目的优点 1、不用手动去复制war到tomcat容器中的webapps目录下了。 2、当项目代码发生变化的时候,只需将打包好的war上传到 “/opt/projects/“ 目录下即可,tomcat容器不用重启,容器会检测到当前挂载的war包发生了变化,容器会自动重启并挂载最新的war到webapps目录下。
3、(其他的优点,这里不多做说明了)
【方式三】:使用Dockerfile构建新tomcat镜像
这种部署方式,在实际的生产开发环境下,是建议使用的一种方式。 编写Dockerfile 在 /opt/projects/ 目录下(war包所在的目录)新建Dockerfile文件,最终如下图所示:
在Dockerfile文件中添加以下内容:
FROM tomcat #基础镜像
MAINTAINER "zhoubang <842324724@qq.com>" # 作者
ENV DIR_WEBAPP /usr/local/tomcat/webapps/ # 定义变量,后续会使用;该路径是tomcat容器中的webapps默认的路径
ADD springmvc-maven.war $DIR_WEBAPP/springmvc-maven.war # 将war添加到tomcat容器中的webapps目录下
RUN unzip $DIR_WEBAPP/springmvc-maven.war -d $DIR_WEBAPP # 解压war到DIR_WEBAPP参数对应的目录下
CMD ["catalina.sh", "run"] # 执行启动脚本,运行tomcat
【特别注意】:在实际编写Dockerfile文件的时候,一定要记得将Dockerfile文件内容的“#”注释内容删除掉。
最终保存的Dockerfile文件内容如下:
构建Dockerfile 在我们的 /opt/projects/ 目录下,执行下面命令,根据Dockerfile构建新镜像:
docker build -t springmvc-maven-web-dockerfile .
注意命令最后面有一个“.”,代表的是当前目录。同时为我们的新镜像命名为“springmvc-maven-web-dockerfile”
执行后效果
运行新镜像 - springmvc-maven-web-dockerfile
执行 docker images 命令查看所有的镜像列表
你会发现,镜像列表中有一个新的镜像 “springmvc-maven-web-dockerfile”
docker run -p 8082:8080 --name springmvc-maven-web-dockerfile -d springmvc-maven-web-dockerfile
同样的,端口号不能出现冲突,这里指定的端口号是8082,容器名称这里命名为“springmvc-maven-web-dockerfile”。
访问项目 浏览器中输入 http://www.2b2b92b.com:8082/springmvc-maven/user/list 即可看到返回的数据。 请求的URL只是改变其中的端口号即可。
访问结果如下图:
【方式三】部署项目的优点
该方式通过Dockerfile文件的形式定义了一个新的镜像,然后我们直接通过run命令运行这个新镜像,就可以实现项目的部署和访问了。 与【方式二】对比,有了更加比较简单的部署启动的方式。无需通过“-v”指定挂载的目录了。命令看起来也比较简洁。
总结
到目前为止,我们的宿主机上已经运行了3个tomcat容器,如下图: 每个容器代表着上面的三种部署方式的其中一种,可以通过名称看到对应的关系;
【方式三】是实际生产开发建议使用的方式,而【方式一】和【方式二】适合测试环境。
如果有能力的话,建议使用【方式三】来实现项目的部署,无论是在项目开发、构建等过程中,通过Dockerfile来定义镜像,是很好的一种方式,项目实际部署起来也很方便。
更多的知识点,有兴趣的可以自行网上研究学习。Docker知识点太多了,我也不可能写的完的~
好了,都是辛勤劳力写出来的文档,如果觉得不错的话,可以收藏,也可以分享给你身边需要的朋友~ ^_^
转载 https://www.yuque.com/zhoubang/docker/docker-deploy-springmvc-maven#m7z3xc