在docker中用Tomcat运行web项目

本文旨在用最通俗的语言讲述最枯燥的基本知识java

上一篇文章《为何要用docker》已经讲述了什么是docker以及咱们要用docker的缘由,而且讲解了如何安装docker。这时候不少读者磨拳擦脚跃跃欲试但却发现安装好docker以后就无从下手了,那么,接下来,小编会从如下方面讲述docker的一些基础知识,固然,理论都是生硬的,因此小编选取了javaweb项目中最经常使用的一个软件--tomcat的安装和使用来引导学习一些docker相关的知识,借此让读者可以从实战的角度去理解docker为何会有这些基础知识以及如何使用这些基础知识。web

咱们知道,web开发和部署离不开tomcat,而在目前的实际状况是: 一个项目中,每一个开发者本机电脑都有本身的tomcat或者用idea的内置tomcat,当咱们开发完成提交测试时,测试服务器上也有一个tomcat;当项目上线时,线上服务器也有一个tomcat,所以就很容易出现一些奇奇怪怪的问题,好比在同事A电脑上能正常运行的,到同事B电脑上就出问题的;或者是在测试环境里一切正常,到了线上bug一堆。这时候docker就有了用武之地,项目负责人把docker的tomcat镜像作好了以后上传到镜像仓库,项目成员的电脑环境、测试环境、线上环境均拉取这个tomcat使用,就能保持在全部的环境下tomcat的版本、设置都是一致的,避免了一些非技术的问题。 那么,如今咱们就用docker来作一个tomcat的环境。docker

  1. 镜像的查找和拉取

首先,咱们须要去镜像仓库找到咱们要的镜像,查找镜像的语法是编程

docker search 镜像名称:镜像TAG
复制代码

所以,查找Tomcat镜像:浏览器

docker search tomcat
复制代码

有读者会疑问:什么是镜像TAG? 镜像的TAG值就是镜像的版本,就好比Tomcat有7.0、8.五、9.0等咱们经常使用的版本,那么相应的这些软件被作成docker镜像以后,官方也会根据软件自己的版本对应出docker镜像的版本。 下图为查找结果: tomcat

docker下查找Tomcat镜像
能够看到,有不少的Tomcat镜像,那么咱们应该怎么选用这些镜像呢?一般状况下,咱们都知道官方的东西基本上表明安全无公害,由于能够看到右边有official标识为OK的就是官方的镜像,所以咱们拉取第一个Tomcat就能够。 拉取镜像的语法是:

docker pull 镜像NAME:镜像TAG
复制代码

由于咱们要拉取Tomcat时,就能够这样写:安全

docker pull tomcat
复制代码

有人说你怎么没加上镜像TAG 在拉取镜像时,若是加上镜像TAG,就会去查找是否有相应版本的镜像,若是有则拉取,若是没有则不拉去。而没有加TAG时,就默认表明拉取的是该镜像的最新版本。服务器

假如须要拉取固定版本如拉取Tomcat8.5:微信

docker pull tomcat:8.5
复制代码

就会相应的拉取了该版本的Tomcat镜像。 拉取成功以后,咱们要查看咱们拉取的版本,能够用命名:app

docker images
复制代码

能够看到,镜像列表里已经有了咱们要拉取的Tomcat镜像

本机的镜像列表

  1. 镜像的使用

镜像拉取下来以后,就如咱们把从网上把下载到了本地电脑,可是没有任何生命的迹象,只有把它安装运行起来,才是一个活的容器,相应地,docker镜像只有在run起来的时候,才是一个有生命的容器。 建立和运行一个Tomcat容器只须要一行命令:

docker run  --name my_tomcat tomcat:8.5
复制代码

其中 --name是指给容器起的名字,后面的tomcat是指下载的惊喜的NAME。8.5是镜像TAG。 到这里,一个tomcat服务就安装而且启动好了,由于默认的Tomcat端口都是8080,所以一般状况下此时咱们用ip:8080就应该能够访问到Tomcat的标志性主页了。 可是!!! 事实并非如此 由于咱们是在docker下运行的容器,大家的脑海中能否还有docker的logo图? 大海就至关于咱们的服务器(宿主机),而在海中游走的鲸鱼就是docker服务,而鲸鱼上的每个集装箱都是一个容器,也就是说: 容器之间是互相隔离的,容器和宿主服务器也是互相隔离的。 所以咱们在docker中运行了一个Tomcat的服务器,虽然端口是8080, 可是~ 那是容器中的8080端口,所以咱们经过ip:8080访问到的其实只是宿主机上的8080端口,并非容器中的端口。 此时咱们只须要把容器中的端口映射到宿主机上相应的端口便可。 端口映射只须要在运行时加入指令 -p 映射的宿主机端口:容器运行端口 以下,把容器运行的8080端口映射到宿主机的8099端口: 名称设置为my_tomcat_1

docker run -p 8099:8080  --name my_tomcat_1 tomcat:8.5
复制代码

此时,你会发现,控制台打出了Tomcat启动的日志,启动完成后,咱们在浏览器上用ip:8099访问,就会发现,Tomcat主页就显示了,说明Tomcat已经正确地运行起来了。 而用命令也能够查看容器是否起来,咱们用docker ps 能查出本docker中运行的多有容器:

docker ps
复制代码

在Tomcat运行的状况下,当你用ctrl+c回到命令行输入docker ps时,发现并无找到my_tomcat_1这个Tomcat容器,而你从新用ip:8099发现Tomcat也不见了 噢 no! 什么缘由? 这是由于:在Linux下用指令的方式运行程序,若是没有加后台执行的指令,那么在切回到命令时,程序就被杀死了。 所以,此时是由于咱们运行Tomcat容器时,没有设置在后台运行,所以,须要在运行时,加上后台运行的指令,在docker中设置后台运行只须要在run命名中加入-d便可。 所以咱们从新运行Tomcat,名称设置为my_tomcat_2:

docker run -d -p 8099:8080  --name my_tomcat_2 tomcat:8.5
复制代码

运行完成后,此时咱们放心大胆的回到命名行。从新执行docker ps 看控制台的输出:

展现正在运行的全部容器
能够看到:my_tomcat_2已经在运行,IMAGE表明所用镜像以及镜像版本,PORTS显示的是0.0.0.0:8099->8080/tcp 。表明的是把本机的8080端口映射到宿主机上的8099端口中。

可是,有读者又有疑问了: ”Tomcat是运行了,那我怎么把个人项目丢进去docker的Tomcat中呢?我用FTP工具连接到服务器上也找不到Tomcat在哪里,怎么办?”

上面提到,docker中容器和宿主机是互相隔离的,所以容器是不会在宿主机中有明确的文件夹路径,因此找不到才是对的。 可是既然端口都能映射,为啥文件夹不能映射呢? 在docker中,能够用 -v 指令指定把容器中的某个文件夹挂载到宿主机中 它的语法为:

-v 宿主机目录:容器目录
复制代码

因此咱们能够在建立运行一个容器时,同时能够把指定的文件夹挂载到宿主机中 一般状况下,Tomcat运行程序的文件是在webapps下的,那么能够在运行时把这个文件夹挂载到宿主机某个路径上(如:/data目录中), 名称设置为my_tomcat_3,端口设置为8098,要把容器中的webapps文件夹挂载到宿主机中/data/my_tomcat_3/webapps文件夹:

docker run -d -p 8098:8080 -v /data/my_tomcat_3/webapps:/usr/local/tomcat/webapps  --name my_tomcat_3  tomcat:8.5
复制代码

此时咱们再用FTP工具连接到宿主机服务器上,进入data文件夹,就会发现:my_tomcat_3/webapps文件夹已经躺在里边了,可见已经挂载成功。

把文件夹挂载成功以后,此时咱们把web项目丢到宿主机中的webapps下,重启Tomcat容器后,再用ip:8099访问,就会展现咱们的web项目的内容了。 到这里,docker中用Tomcat运行web项目的工做已经完成。

可是,回过头来想一想,留下不少问题:

  1. docker run是建立而且运行容器,那我怎么控制容器的状态呢?好比启动和中止
  2. 为何我在docker run时一直在重命名Tomcat的名字my_tomcat_一、my_tomcat_二、my_tomcat_3..
  3. 拉取和运行了那么多镜像,占据不少磁盘空间,怎么处理?
  4. 运行后的Tomcat,怎么查看日志?
  5. 我想要修改一下Tomcat中的server.xml的设置,可是宿主机中有没有这个文件,难道我要挂载出来吗?

看完此文以后,你有什么问题吗?欢迎读者把问题后台留言给小编或者加小编的微信,下一篇文章,小编会针对上面的问题以及读者提出的问题,作一个完整的解答以及把如何作好的Tomcat上传到镜像仓库作一个演示,因此:

关!注!我!

下期小编甚至会把经常使用的一些docker命名整理出来,方便你们集中记忆和使用!


以为本文对你有帮助?请分享给更多人 关注「编程无界」,提高装逼技能

相关文章
相关标签/搜索