Docker:13---构建服务之(构建一个Java Tomcat服务器)

一、本文目的

  • 本文我们考虑把Docker作为引用服务器和编译管道。本文做一个更加“企业化”且用于传统工作负载的服务:获取Tomcat服务器上的WAR文件,并运行一个Java引用程序,为了做到这一点,我们创建了两个Docker镜像:
    • 一个镜像从URL拉取指定的WAR文件并将其保存到卷中
    • 一个含有Tomcat服务器的镜像运行上面那个卷目录下的WAR文件

本文的代码、文件链接

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

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

①创建目录

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

cd tomcat

mkdir fetcher

ls

cd fetcher

②创建Dockerfile

  • 在fetcher目录下创建一个Dockerfile,内容如下:
    • FROM指令:基于ubuntu 16.04构建该镜像
    • LABEL指令:为容器添加元数据,此处为添加镜像的作者和地址(此处添加了我的博客地址)。LABEL指令详情请参阅:https://blog.csdn.net/qq_41453285/article/details/107389320
    • ENV指令:为了重新构建缓存,详情请参阅前文的“基于构建缓存的Dockerfile模板”专题:https://blog.csdn.net/qq_41453285/article/details/107389320
    • 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指令的介绍:https://blog.csdn.net/qq_41453285/article/details/107389320
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" ]

③构建镜像

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

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

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

④创建容器

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

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

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

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

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

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

①创建目录

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

mkdir tomcat8

ls

cd tomcat8

②创建Dockerfile

  • 在tomcat8目录下创建一个Dockerfile,内容如下:
    • FROM指令:基于ubuntu 16.04构建该镜像
    • LABEL指令:为容器添加元数据,此处为添加镜像的作者和地址(此处添加了我的博客地址)。LABEL指令详情请参阅:https://blog.csdn.net/qq_41453285/article/details/107389320
    • ENV指令:为了重新构建缓存,详情请参阅前文的“基于构建缓存的Dockerfile模板”专题:https://blog.csdn.net/qq_41453285/article/details/107389320
    • 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" ]

③构建镜像

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

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

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

④创建容器

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

⑤运行Tomcat服务器

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

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

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

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

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

①安装必要环境

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

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

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107616080
今日推荐