Docker 中国官方镜像加速 http://www.docker-cn.com/registry-mirror
前言 Tomcat镜像中已经包含jdk环境依赖,所以我们可以不用去启动java容器,直接运行tomcat容器就可以正常访问tomcat服务的,当然,你启动了java容器,也不会有什么影响,因为容器之间是隔离的。
查询Tomcat镜像列表
docker search tomcat
运行结果如下图:
一般情况下,都会选择下载stars数量最多的那个镜像,排在第一位的,一般都是官方提供的镜像。
下载Tomcat镜像
执行命令下载tomcat镜像:
docker pull tomcat
运行Tomcat镜像
docker run -p 8081:8080 tomcat
运行效果如下图:
访问tomcat:
当前docker服务运行在我的阿里云服务器上的,公网IP是39.106.18.21,所以打开浏览器输入:39.106.18.21:8081 效果如下:
是不是很简单,一个tomcat就这样启动完成了!不得不说docker的强大!
有没有觉得上面的启动方式存在什么问题?如果在命令行界面中按下 Ctrl+C快捷键,会有什么效果?
没错,当前的tomcat容器会停止运行,服务无法访问!
有什么办法可以让tomcat容器一直运行呢?
解决办法其实很简单,答案就再在 docker run 命令里面设置一个 -d 的参数即可,如下:
看到没有,和上面的启动tomcat的效果不同,控制台并未输出tomcat启动的日志信息,这时候我们打开浏览器,重新访问一下: 39.106.18.21:8081 效果如下:
通过上面两次docker run 启动tomcat的效果对比,我想大家也应该看得出区别了。所以,如果想让应用在后台一直运行的话,通过在 docker run 命令中使用“-d”参数来让容器处于后台运行。
查看运行中的Tomcat容器
通过下面命令,来查看当前服务器上运行的docker容器列表:
docker ps
如下图所示:
从图中可以看到tomcat容器的一些信息,在最后一列的“NAMES”显示的tomcat名称是“quirky_mayer”,这是因为你在docker run的时候,没有指定“—name”别名,docker会给你自动生成一个别名,一般情况下,我们还是建议使用—name来设置别名以及版本,方便实际使用容易区分。
然后tomcat容器的“PORTS”这一列,可以看到8081 > 8080 的信息,我们知道tomcat是运行在容器里面的,而tomcat默认的端口是8080,也就是说tomcat所在容器的对外端口是8080,我们如果想通过浏览器等访问到tomcat,就需要指定一个宿主机的端口与这个tomcat容器端口进行映射,也就是8081这个宿主机的端口。我们实际在浏览器访问的时候,就是通过8081来访问的,不能使用8080访问。端口号的话你也可以自定义的。
停止Tomcat容器
我们在jdk的文章中已经提及到停止容器的命令。
首先我们还是要查看一下目前正在运行状态的tomcat容器的信息(ID或者别名):
docker ps
如下图:
我们可以看到tomcat容器的ID以及别名的信息,这里我就直接使用ID进行容器的操作了。
通过docker stop实现容器停止关闭:
docker stop 22
运行结果如图:
回车之后,控制台输出“22”,表示已经成功停止了容器ID以“22”开头的tomcat容器。
这时候在去查看一下当前处于运行状态的容器列表:
可以看到,tomcat容器已经被关闭了。
或许你会有疑问
- 【问题】:
之前启动了tomcat容器,最后又把它关闭了,那我如果想再运行这个tomcat服务,怎么办?难道是要重新执行docker run这个命令来运行一个tomcat容器吗?
【解答】:
我们要知道docker run这个命令的作用,其实是运行一个全新的容器。你执行一次docker run命令,就会生成一个新的容器,通过一个图来看一下具体情况:
从图中可以看到,出现了很多tomcat的容器,而且“STATUS”状态为“Exited”。什么意思呢?因为我在操作的过程中,总共执行了5次docker run命令(这里忽略docker rm删除的容器),启动了5个全新的容器,每个容器之间是隔离的。同时,我又对每个tomcat容器执行了docker stop关闭命令,所以状态都是“Exited”。
所以,你每次启动的容器,docker都会给你保留下来,并不是说你执行了docker stop命令,容器就会被删除掉,答案是不会删除掉,只是标记一下容器的STATUS为Exited状态,处于未运行状态。
所以,如果想重新运行关闭状态下的容器,请使用docker start命令,比如我这里随便启动一个tomcat容器:
docker start 22
这时候通过docker ps查看处于运行状态的容器列表: 说明tomcat容器已经启动成功了! 我们再通过docker ps -a查看所有的容器列表(包括未运行的容器),主要看一下tomcat容器的数量是否和上面的5个一致,并未重新运行一个全新的容器: 可以看到,tomcat容器的数量并未发生变化,其中的一个tomcat容器处于运行状态,剩余4个都是Exited停止状态。
- 【问题】:
如果上图中代表当前服务器上的容器情况,如果这时候我执行以下命令,你觉得会出现什么问题?
docker run -d -p 8082:8080 --name quirky_mayer tomcat
命令的含义应该都明白吧。启动一个新的tomcat容器,映射的宿主机端口号是8082(因为之前已经启动了一个8081的容器,宿主机的端口号不能冲突),给该tomcat容器起了一个别名“quirky_mayer”,注意观察一下上图的tomcat容器的别名信息哦~
【解答】
运行结果如下图: 其实错误信息很明显了,就是容器的别名“quirky_mayer”已经存在了,别的tomcat容器的别名也存在一个是“quirky_mayer”的。 这个别名校验是否重复,是针对所有容器而言的,并非是只判断运行状态的容器,那些Exited状态的容器也会进行校验。 因此,我们在使用—name指定别名的时候,不要出现重复。