前言 文章中选用的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。

项目环境

  • Mysql

  • Tomcat

服务器环境

  • Linux centos7

环境安装

根据上面的项目环境以及服务器环境,我们需要在服务器上安装并运行以下服务:

安装Docker环境

因为我是在阿里云服务器上操作部署的,因此Docker环境是在centos系统环境下安装的。

  • 如果服务器上未安装Docker环境的话,可以参考下面的文章进行安装。

《在centos系统中安装Docker》

https://yuque.com/zhoubang/docker/rqspmt

  • 如果没有实际的服务器的话,如果本地电脑是win7系统,可以参考在win7环境下安装Docker环境

《在windows系统中安装Docker》

https://yuque.com/zhoubang/docker/window-docker-install

运行软件环境

启动运行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数据库)。

下载项目用例源代码到本地

项目用例的话,可直接使用我写的一个简易的项目测试用例。

https://gitee.com/zhoubang85/sea-docker-example

具体的项目下载以及导入到你本地的开发工具中,比如eclipse、idea等,这些我就不多做说明了,想必大家都会的。

将项目打成war包

具体的编译打包项目,我也不多做说明了,无非就是打成war包,和平时开发的流程是一样的。

【注意点】:

由于当前文档教程是对springmvc + maven 结构的项目进行Docker部署,所以,你编译打包的项目模块应该是“springmvc-maven”这个模块,不要打包错误了(最终上传的应该是 springmvc-maven.war 这个war包);

打包项目的时候,一定要将 jdbc.properties 文件中的mysql数据库配置,修改成真正可以访问到的mysql数据库连接。

为了方便,我将打好的war以附件的形式添加在此,方便各位直接下载使用,略过拉取项目源码的步骤,节省时间。

springmvc-maven-war.zip

说明】: 该war中连接的是我的 39.106.18.21的mysql数据库。 不保证该数据库会一直运行或者存在,如果出现连接超时或者异常,建议还是自己手动修改成自己的mysql数据库最好。

上传war包到服务器对应目录下

将“springmvc-maven”这个模块的target目录下的war文件上传至你的服务器某目录下。这里我就上传到我的服务器下的 /opt/projects/ 目录下,方便统一查看管理。

springmvc + maven 结构的项目 - 图1

在Docker中部署项目

在这一步开始之前,我确定你们已经安装好了Docker环境,以及成功运行mysql容器、tomcat容器,并且mysql以及tomcat可以正常访问和使用。

war包在tomcat容器中部署的3种方式

第三种是实际生产开发建议使用的方式,前面2种用于测试环境比较简单合适。

【方式一】:将war复制到tomcat容器中的webapps目录下

【注意】:请先运行一个tomcat容器。

我的服务器上已经下载好了一个tomcat镜像了,如下图: springmvc + maven 结构的项目 - 图2

然后,你就可以运行下面的命令,来启动一个tomcat容器

  1. docker run -p 8080:8080 --name springmvc-maven-web -d tomcat

如果宿主机出现8080端口冲突,请换一个端口即可。

运行上面的命令之后,可以查看已经启动的tomcat容器springmvc + maven 结构的项目 - 图3

其他的容器是我服务器以前启动运行的,可以不用理会。

访问这个tomcat服务(我的服务器域名是 www.2b2b92b.com): springmvc + maven 结构的项目 - 图4 可以看到,tomcat服务可以正常访问。

将war包复制到tomcat容器的对应tomcat的webapps目录下

在Linux命令行中执行以下命令:

  1. docker cp /opt/projects/springmvc-maven.war eb:/usr/local/tomcat/webapps

其中,命令后面的冒号的左边“eb”指的是tomcat容器的ID。

重启tomcat容器

  1. docker restart eb

其中的“eb”是tomcat容器的ID

访问springmvc-maven项目,浏览器输入请求地址:

  1. http://www.2b2b92b.com:8080/springmvc-maven/user/list

根据不同版本的mysql,访问地URL的时候,页面上可能会出现下面的错误:

  1. java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

原因,和新版本的mysql有关,新版mysql使用的是caching_sha2_password这种密码格式。 解决办法: 可以通过mysql客户端或者mysql容器中的命令行,来执行以下SQL即可解决:

  1. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

root用户的密码是123456

重新访问 http://www.2b2b92b.com:8080/springmvc-maven/user/list 即可正常返回数据,如下图: springmvc + maven 结构的项目 - 图5

至此,第一种部署war的方式已经完成!

【方式一】部署方式存在的缺点: 需要手动去复制war到对应的webapps目录下,很不方便。

【方式二】:将war包以挂载的方式启动tomcat容器

在Linux命令行下面,执行下面命令,以挂载的形式启动一个tomcat容器

  1. 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容器信息 springmvc + maven 结构的项目 - 图6 可以看到,目前总共有2个正在运行的tomcat容器。一个是【方式一】运行的tomcat容器,一个是当前【方式二】运行的tomcat容器。

方式二】部署项目的优点 1、不用手动去复制war到tomcat容器中的webapps目录下了。 2、当项目代码发生变化的时候,只需将打包好的war上传到 “/opt/projects/“ 目录下即可,tomcat容器不用重启,容器会检测到当前挂载的war包发生了变化,容器会自动重启并挂载最新的war到webapps目录下。

3、(其他的优点,这里不多做说明了)

【方式三】:使用Dockerfile构建新tomcat镜像

这种部署方式,在实际的生产开发环境下,是建议使用的一种方式。 编写Dockerfile 在 /opt/projects/ 目录下(war包所在的目录)新建Dockerfile文件,最终如下图所示:

springmvc + maven 结构的项目 - 图7 在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

  1. > > **【特别注意】:在实际编写Dockerfile文件的时候,一定要记得将Dockerfile文件内容的“#”注释内容删除掉。**
  2. > 最终保存的Dockerfile文件内容如下:
  3. > ![](https://cdn.yuque.com/yuque/0/2018/png/100526/1528288405118-db4ce64a-b9b5-4d58-a32f-2e47a353e2ff.png#width=519)
  4. >
  5. > **构建Dockerfile**
  6. > 在我们的 /opt/projects/ 目录下,执行下面命令,根据Dockerfile构建新镜像:
  7. > ```bash
  8. docker build -t springmvc-maven-web-dockerfile .

注意命令最后面有一个“.”,代表的是当前目录。同时为我们的新镜像命名为“springmvc-maven-web-dockerfile”

执行后效果

执行 docker images 命令查看所有的镜像列表

springmvc + maven 结构的项目 - 图8

你会发现,镜像列表中有一个新的镜像 “springmvc-maven-web-dockerfile”

运行新镜像 - springmvc-maven-web-dockerfile

  1. 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只是改变其中的端口号即可。

访问结果如下图: springmvc + maven 结构的项目 - 图9

【方式三】部署项目的优点

该方式通过Dockerfile文件的形式定义了一个新的镜像,然后我们直接通过run命令运行这个新镜像,就可以实现项目的部署和访问了。 与【方式二】对比,有了更加比较简单的部署启动的方式。无需通过“-v”指定挂载的目录了。命令看起来也比较简洁。

总结

到目前为止,我们的宿主机上已经运行了3个tomcat容器,如下图: springmvc + maven 结构的项目 - 图10 每个容器代表着上面的三种部署方式的其中一种,可以通过名称看到对应的关系;

【方式三】是实际生产开发建议使用的方式,而【方式一】和【方式二】适合测试环境。

如果有能力的话,建议使用【方式三】来实现项目的部署,无论是在项目开发、构建等过程中,通过Dockerfile来定义镜像,是很好的一种方式,项目实际部署起来也很方便。

更多的知识点,有兴趣的可以自行网上研究学习。Docker知识点太多了,我也不可能写的完的~

好了,都是辛勤劳力写出来的文档,如果觉得不错的话,可以收藏,也可以分享给你身边需要的朋友~ ^_^