0
点赞
收藏
分享

微信扫一扫

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器


一、本文目的

  • 本文我们考虑把Docker作为引用服务器和编译管道。本文做一个更加“企业化”且用于传统工作负载的服务:获取Tomcat服务器上的WAR文件,并运行一个Java引用程序,为了做到这一点,我们创建了两个Docker镜像:

  • 一个镜像从URL拉取指定的WAR文件并将其保存到卷中
  • 一个含有Tomcat服务器的镜像运行上面那个卷目录下的WAR文件

本文的代码、文件链接


  • 下载方式1:公众号【多栖技术控小董】回复【3676】获取免费下载链接。
  • 下载方式2:Github链接

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器

二、构建获取WAR文件的容器

  • 下面我们创建一个容器,该容器挂载到宿主机的一个目录下,并且该容器从指定的URL中下载WAR文件放到卷目录下

①创建目录

  • 首先创建一个tomcat目录,作为本文所有测试环境的根目录。然后在tomcat目录中建立一个fetcher目录,用来表示获取WAR文件的目录
mkdir tomcat

cd tomcat

mkdir fetcher

ls

cd fetcher

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat_02

②创建Dockerfile

  • 在fetcher目录下创建一个Dockerfile,内容如下:

  • FROM指令:基于ubuntu 16.04构建该镜像
  • LABEL指令:为容器添加元数据,此处为添加镜像的作者和地址(此处添加了我的博客地址)。LABEL指令详情请参阅:
  • ENV指令:为了重新构建缓存,详情请参阅前文的“基于构建缓存的Dockerfile模板”专题
  • 2条RUN指令:更新软件包、安装wget工具
  • VOLUME指令:

  • 基于该镜像创建的容器的卷,也是基于该镜像创建的容器的工作目录
  • 下面我们会把下载的WAR的文件放在这个目录下,然后下面包含Tomcat服务器的容器就可以到这个目录下取文件并执行

  • WORKDIR指令:将/var/lib/tomcat8/webapp/设置为工作目录,下面的ENTRYPOINT指令用到的工作目录就是这个,也就是其将wget下载的内容下载到这个目录下了
  • ENTRYPOINT指令、CMD指令:

  • 这两条指令合并在一起来执行一条命令
  • 如果基于该镜像运行的容器在运行时,在“docker run”最后指定了URL,那么该容器就会使用wget去下载URL指定的文件,从而忽略CMD选项
  • 如果基于该镜像运行的容器在运行时,在“docker run”最后没有指定命令选项,那么该容器就会调用“wget --help”命令打印wget的帮助文档
  • 详情请参阅Dockerfile中ENTRYPOINT指令的介绍


FROM ubuntu:16.04
LABEL maintainer="https://blog.csdn.net/qq_41453285/"
ENV REFRESHED_AT 2020-07-27

RUN apt-get -qq update
RUN apt-get -qq install wget

VOLUME [ "/var/lib/tomcat8/webapps/" ]
WORKDIR /var/lib/tomcat8/webapps/

ENTRYPOINT [ "wget" ]
CMD [ "--help" ]

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_03

③构建镜像

  • 现在fetcher目录下有一个Dockerfile文件

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_04

  • 第一步:基于上面的Dockerfile文件,我们创建一个镜像,镜像名为“dongshao/fetcher”
sudo docker build -t dongshao/fetcher .

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_05

  • 第二步:查看创建的镜像
sudo docker images

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_06

④创建容器


  • 上面我们创建了镜像,现在可以基于该镜像来构建容器了
  • 第一步:输入下面的命令创建容器

  • -t:告诉Docker为要创建的容器分配一个伪tty终端。这样新创建的容器就可以提供一个交互式shell
  • -i:保证容器STDIN是开启的
  • --name:该容器的命令,取名为sample
  • dongshao/fetcher:运行该容器的镜像
  • 后面的URL:在容器运行时,该容器会运行dongshao/fetcher的Dockerfile中指定的ENTRYPOINT指令,见上面的Dockerfile的ENTRYPOINT指令为wget,因此会拼接wget和​​https://tomcat.apache.org/tomcat-8.0-doc/appdev/sample/sample.war​​。从而下载这个文件到容器中
  • 又因为上面镜像的Dockerfile的WORKDIR指令将工作目录设置为/var/lib/tomcat8/webapp/,因此下载的文件会存放在容器的/var/lib/tomcat8/webapp/目录下


sudo docker run -t -i --name sample dongshao/fetcher https://tomcat.apache.org/tomcat-8.0-doc/appdev/sample/sample.war

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat_07


  • 上面的容器运行时从指定的URL中下载了sample.war文件,并且放在了/var/lib/tomcat8/webapp/目录下,又因为/var/lib/tomcat8/webapp/目录下是一个卷,因此会挂载到宿主机中
  • 第二步:宿主机中所有容器的卷都存放在/var/lib/docker/volumes/目录下

sudo ls -l /var/lib/docker/volumes/

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_08

  • 第三步:但是我们不知道我们上面那个容器使用的是哪个目录,可以输入下面的命令查看容器的卷目录信息
sudo docker inspect -f "{{ range.Mounts}} {{ . }} {{ end }}" sample

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_Docker教程_09

  • 第四步:从上面的结果我们看到该容器的目录为0f15606bad9162f64e392bb20b3302f2c2ad890617777e2d9ae2ba9aa0c807bd,然后我们查看0f15606bad9162f64e392bb20b3302f2c2ad890617777e2d9ae2ba9aa0c807bd/_data就可以查看该容器的卷目录中存放的内容了
sudo ls -l /var/lib/docker/volumes/0f15606bad9162f64e392bb20b3302f2c2ad890617777e2d9ae2ba9aa0c807bd/_data

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_Docker教程_10

三、构建包含Tomcat服务的容器

  • 上面我们已经构建了一个容器,并且下载了WAR文件到宿主机的一个卷目录中。现在我们可以构建一个包含Tomcat应用服务器的容器,然后运行该容器,使其来运行这个WAR文件

①创建目录

  • 在tomcat目录下创建一个tomcat8目录,用来作为创建包含tomcat8服务的镜像的工作目录
cd ..

mkdir tomcat8

ls

cd tomcat8

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat_11

②创建Dockerfile

  • 在tomcat8目录下创建一个Dockerfile,内容如下:

  • FROM指令:基于ubuntu 16.04构建该镜像
  • LABEL指令:为容器添加元数据,此处为添加镜像的作者和地址(此处添加了我的博客地址)。LABEL指令详情请参阅​
  • ENV指令:为了重新构建缓存,详情请参阅前文的“基于构建缓存的Dockerfile模板”专题
  • 2条RUN指令:更新软件包、安装JDK和Tomcat服务器
  • 5条ENV指令:指定了一些启动Tomcat需要的环境变量
  • RUN指令:创建一个临时目录
  • VOLUME指令:基于该镜像创建的容器的卷
  • EXPOSE指令:如果哪个容器基于该镜像运行,那么就公开该容器的8080端口
  • ENTRYPOINT指令:容器基于该镜像运行时,会自动启动Tomcat服务器

FROM ubuntu:16.04
LABEL maintainer="https://blog.csdn.net/qq_41453285/"
ENV REFRESHED_AT 2020-07-27

RUN apt-get -qq update
RUN apt-get -qq install tomcat8 default-jdk

ENV CATALINA_HOME /usr/share/tomcat8
ENV CATALINA_BASE /var/lib/tomcat8
ENV CATALINA_PID /var/run/tomcat8.pid
ENV CATALINA_SH /usr/share/tomcat8/bin/catalina.sh
ENV CATALINA_TMPDIR /tmp/tomcat8-tomcat8-tmp

RUN mkdir -p $CATALINA_TMPDIR

VOLUME [ "/var/lib/tomcat8/webapps/" ]

EXPOSE 8080

ENTRYPOINT [ "/usr/share/tomcat8/bin/catalina.sh", "run" ]

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_12

③构建镜像

  • 现在tomcat8目录下有一个Dockerfile文件

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_13

  • 第一步:基于上面的Dockerfile文件,我们创建一个镜像,镜像名为“dongshao/tomcat8”
sudo docker build -t dongshao/tomcat8 .

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat_14

  • 第二步:查看创建的镜像
sudo docker images

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat_15

④创建容器


  • 上面我们创建了镜像,现在可以基于该镜像来构建容器了
  • 第一步:输入下面的命令创建容器,相关选项如下:

  • --name:该容器的名字,此处取名为sample_app
  • --volumes-from:

  • 该选项为把指定容器里的所有卷都加入到新创建的容器里,此处我们把上面创建的sample容器的卷都加入到这个新创建的容器中
  • 因此我们这个新创建的容器就可以去访问sample卷里面的内容了(WAR文件)

  • -d:将该容器以守护进程的方式在宿主机中运行
  • -P:该选项可以用来对外公开在Dockerfile中通过EXPOSE指令公开的所有端口。上面我们"dongshao/tomcat8"镜像的Dockerfile中公开了8080端口,此处我们就使用该选项将容器的8080端口映射到宿主机的任意端口上
  • 最后一个选项:上面创建的镜像


sudo docker run --name sample_app --volumes-from sample -d -P dongshao/tomcat8

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_16

⑤运行Tomcat服务器

  • 上面我们的包含Tomcat服务器的容器挂载了sample容器的目录,因此其可以访问到sample容器的/var/lib/tomcat8/webapp/目录,又因为sample容器下载了.war文件到/var/lib/tomcat8/webapp/目录下,因此我们的Tomcat容器也可以访问这个.war文件,运行Tomcat服务器之后,sample.war文件解压出一个sample目录,里面都是网页的原地阿妈

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_Docker教程_17

  • 第一步:先查看运行Tomcat服务器的容器的8080端口映射到了宿主机的哪个端口上
sudo docker port sample_app

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_18

  • 第二步:输入下面的命令去访问Tomcat服务器,URL前面是该容器的Tomcat地址(访问/var/lib/tomcat8/webapp/目录),然后再加上/sample(就会访问到/var/lib/tomcat8/webapp/sample目录),然后默认访问sample目录下的index.html文件,因此运行成功

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_19

四、基于Tomcat应用服务器的构建服务


  • 现在有了自服务Web服务的基础模块,让我们来看看怎么基于这些基础模块做扩展。为了做到这一点,我们已经构建好了一个简单的基于Sinatra的Web应用,这个应用可以通过网页自动展示Tomcat引用。这个应用叫做TProv
  • 然后我们使用这个程序来演示如何扩展之前的示例。首先,要保证已经安装了Ruby,。TProv引用会直接安装在宿主机上,因为这个引用会直接和Docker守护进程交互。这也正是要安装Ruby的地方
  • 备注:也可以把TProc引用安装在Docker容器里

①安装必要环境

  • 安装Ruby
sudo apt-get -qqy install ruby make ruby-dev

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_docker_20

  • 安装TProv应用
sudo gem install --no-rdoc --no-ri tprov
  • mmp,出错了,也不知道是啥原因,先不搞了,百度说是证书原因,等以后再玩的时候来更新(详情参阅《第一本Docker》P166)

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_21

  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

玩转Docker实战篇!使用Docker构建一个Java Tomcat服务器_tomcat服务器_22


举报

相关推荐

0 条评论