一、本文目的
- 本文我们考虑把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 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 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容器里
①安装必要环境
sudo apt-get -qqy install ruby make ruby-dev
sudo gem install --no-rdoc --no-ri tprov
- mmp,出错了,也不知道是啥原因,先不搞了,百度说是证书原因,等以后再玩的时候来更新(详情参阅《第一本Docker》P166)