如何Docker化一个Java web项目

qi.wei

发布于 2018.12.21 14:16 阅读 3322 评论 0

文章分为以下几部分:

       1. Docker是什么?

       2. Docker解决了什么问题?

       3. 用Docker运行一个程序的过程

       4. Docker化一个Java web应用

              4.1 安装Docker

              4.2 拉取Tomcat镜像到本地

              4.3 编写Dockerfile

              4.4 构建镜像

              4.5 运行镜像

              4.6 访问这个Docker化的Java web项目

 

 

 

Docker是什么?

 

      在Docker中文网上对Docker有这样一句解释:Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

 

      Docker源码托管在GitHub上。Docker跨平台,支持Windows、MacOS、Linux。Docker对Ubuntu支持的最好,因为Docker就是在Ubuntu系统下开发的。

 

 

 

Docker解决了什么问题?

 

      如果你从来没有接触过Docker,那么你可能读完上面对于Docker的描述你依旧不知道Docker是干嘛的。如果我说Docker解决了哪些问题,那你就应该明白Docker是干什么的了。

 

      你有没有遇到这几种情况:

 

      1. “项目在我的电脑上运行的好好的,怎么跑到别人的电脑上运行就净出问题?”

 

      Docker正是用来解决这个问题的。它解决了运行环境不一致所带来的问题。

 

      2. 服务器上可能运行着不止一个项目,但是当一个项目突然占用大量的CPU资源或者当一个项目突然不停得往硬盘里写数据可能要把整个硬盘都占满,像这样的情况,一个项目出问题必定也会牵连运行在服务器上的其他项目。

 

      Docker的隔离性很好的解决了这个问题,因为在Docker启动的时候就把最大使用多少CPU使用多少硬盘限定好了,如果超过了则直接杀掉。这样,一个项目出问题,只会影响这个项目本身,不会影响其他项目。

 

      3. 像双十一这种购物节日到的时候,电商网站一定会临时扩展很多服务器,但是如果每一台服务器都去搭建运行环境装各种各样的软件、服务等,并且还要调试,运行还可能会出一些问题等,这样就会极大的耗费时间和精力。

 

      有了Docker这一切都会变得相当美好,只需要在每台服务器上执行几条命令,就可以让程序跑起来,并且不会出现问题。所以,Docker让快速扩展、弹性伸缩变得更加简单。

 

 

 

用Docker运行一个程序的过程

 

      这里首先介绍三个概念:镜像、仓库、容器。

      镜像,就相当于集装箱。

      仓库,就相当于码头。

      容器,就是运行程序的地方。

      去仓库把镜像拿到本地,然后用一条命令把镜像运行起来。这就是用Docker运行一个程序的过程。

 

 

 

Docker化一个Java web应用

 

      环境:Ubuntu18.04 x64

      准备:准备一个Java web项目的war包,我这里用的是jpress.war包(jpress官网下载的)。

 

      1. 安装Docker

      安装的具体方法这里就不介绍了,很简单,网上有很多教程。

 

      2.拉取Tomcat镜像到本地

      拉取镜像,那就是要到仓库中去拉取喽,但是仓库在哪里呢?

      Docker官方提供了镜像仓库,但是国内访问这个仓库会很慢很慢,所以国内一些企业也有做的镜像中心。在这里我们使用网易蜂巢的镜像中心(https://www.163yun.com/product/repo)。

 

      在镜像中心搜索:Tomcat

      我们一般使用带鲸鱼图标的镜像,这是Docker官方提供的。

 

      点进去之后你会发现右上角有一个下载地址docker pull hub.c.163.com/library/tomcat:latest,复制它直接粘贴到Ubuntu的终端里,然后回车,这就成功拉取了Tomcat的镜像到本地。

这个时候,你可以通过docker images命令查看本地已经获取到的镜像。

 

3. 编写Dockerfile

      新建一个Dockerfile文件:vim Dockerfile

 

      然后开始编写

      我来解释一下:

      第一行:from hub.c.163.com/library/tomcat:latest 把Tomcat镜像作为基础镜像

      第二行:MAINTAINER weiqi 1322912570@qq.com 维护人员的信息

      第三行:COPY jpress.war /usr/local/tomcat/webapps 把war包放到Tomcat镜像的webapps下。

      这里很多同学就会有疑问了,/usr/local/tomcat/webapps这个路径是哪来的,随便指定的吗?当然不是,我们回到网易蜂巢Tomcat镜像的页面,上面对这个镜像做了很多解释说明。其中有这么一点:

      所以,由此可见镜像的路径是/usr/local/tomcat,所以我们要把war包copy到/usr/local/tomcat/webapps下。

      写完这三行保存退出就OK了,然后接下来要做的就是构建这个镜像了。

 

4. 构建镜像

      构建镜像的时候,Docker会自动识别我们刚才写的Dockerfile。构建只需要一条命令:docker build -t jpress:latest .

      我来解释一下这个命令:

      docker build就是构建镜像。

      -t jpress:latest是给镜像一个名字以及指定TAG,冒号前面就是名字,冒号之后就是TAG。

      注意最后还有一个点 .  这个点的意思是指定存放镜像的位置为当前路径。

 

5. 运行镜像

      运行镜像也是一条命令:docker run -d -p 8888:8080 jpress

      解释一下这条命令:

      docker run就是运行镜像

      -d是在后台运行

      -p是指定端口

      8888:8080冒号前面是自己电脑上指定用来访问项目的端口,冒号后是镜像里默认访问的端口,Tomcat是8080所以后面写8080,但是在浏览器里访问的时候。就要写localhost:8888了。

      最后的jpress是我们刚才创建的镜像名称。

      这样我们这个Java web项目的镜像就运行起来了。

 

6. 访问这个Docker化的Java web项目

      在浏览器中输入:localhost:8888

      可以看到Tomcat的页面已经可以成功访问。

 

      我们把jpress.war放到了Tomcat的webapps下了,那么我们访问http://localhost:8888/jpress试试:

      成功!

      至此,这个Java web项目就已经Docker化完成,接下来就可以像平常我们访问Java web项目那样进行访问了。