Docker实践:如何编写自定义Tomcat镜像并发布?
用久了从DockerHub上白嫖来的镜像,不免想要开发一款自己的镜像供大家使用,或者满足自己的特殊需求。今天,我们就来根据官方CentOS镜像,一步步地将它改造成自定义的Tomcat镜像并发布到DockerHub,并重新pull到本地运行,以验证我们自定义镜像的效果。
作者环境:阿里云轻量 CentOS7.3
0.前言
在着手改造现有的CentOS之前,我们先要对Docker镜像的构成和来源有一个基本的认识。比如,当我们从官方pull一个镜像下来时,往往会发现它是被一层层下载下来的。事实上,每一个镜像的结构都是一层层组成的,类似于生活中的“千层饼”。因此我们自己创建镜像的时候,我们编写的Dockerfile文档中的一行行代码,都相当于在原来的基础镜像上新覆盖一层层的新内容。
基于以上的知识,我们对开发自定义的Docker镜像的步骤进行概述:
- 设计并编写Dockerfile。
- 基于Dockerfile文件进行build,创建自己的镜像到本地仓库。
- 发布前本地试运行。
- 提交到DockerHub。
- 从DockerHub上下载自己的镜像。
不多哔哔了,我们开始吧!
1. 编写Dockerfile
首先我们先建立一个新文件夹congzachariahtomcat,用于存放Dockerfile和Docker数据卷文件,以及构建镜像所需其它的一些资源。
mkdir /mydocker/congzachariahtomcat
cd congzachariahtomcat/
这一步因人而异。为了在CentOS的基础上建立属于自己的Tomcat镜像,我们需要jdk和一个新的tomcat。因此,我们需要提前下载好它们的压缩包。如图所示,作者已经提前下载好了它们。此外为了能够用上所有的Dockerfile保留字,我们还在里边新建了一个c.txt文本,用于接下来对于Docker改文件名的测试。
touch c.txt
现在我们的文件夹里一共有三个文件了。
接下来就是我们最最重要的编写Dockerfile文件的环节。作者列出了本次自定义Tomcat的Dockerfile源码,并附上了注释。
vim dockerfile
进入dockerfile后,我们按i进入插入模式,并粘贴以下源码。(以下的环境变量等请注意版本问题)
FROM centos
MAINTAINER congzachariah<congzheng1208@163.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u241-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.0.M18.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.0.M18
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.0.M18
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.0.M18/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.0.M18/bin/logs/catalina.out
按Esc键退出,并按Shift+;键进入底行模式,输入wq并回车,成功保存dockerfile。
2. build镜像到本地仓库
接下来的一步就是把dockerfile源码构建成一个镜像了,我们可以参考以下命令行的写法。
其中,-f 后边接dockerfile文件的绝对路径,-t 后边接新镜像的名字和版本号(注意不要遗漏最后的句号 “.”)
docker build -f /mydocker/congzachariahtomcat/dockerfile -t cztomcat:1.1 .
如果能够正常构建,画风应该是这样的。我们看到它在针对我们dockerfile文件中的保留字指令一行行地解析,就好像在千层饼的外边一层层地包裹。我们通过
docker images
命令来查看本地仓库的镜像,发现我们的镜像果然构建成功了!
3. 提交本地镜像至DockerHub
在提交之前,我们首先要注册一个DockerHub的账号,并开辟自己的一个仓库。我们创建了一个名为“cztomcat”的仓库,并把它和作者的Github连接到了一起。
接下来就是把我们在本地仓库的cztomcat镜像发布到DockerHub上的时候了。我们先登陆自己的DockerLub账号。
docker login
接着我们需要对镜像进行改名。这里要注意的一点是,我们必须要在改的名字前边加上我们的Dockerhub账号名。作者的DockerHub账号是congzachariah
,因此具体命令行如下:
docker tag f832b5ae7fd8 congzachariah/cztomcat:1.1
接下来就是把本地镜像pash到DockerHub上去。
docker push congzachariah/cztomcat:1.1
执行完这一步后,我们打开自己的DockerHub,会惊奇地发现已经提交成功了。
我们用docker search
命令也能够搜到自己刚才提交上去的镜像。
4. 从DockerHub上下载镜像
这一步不用多说,我们直接一行docker pull
搞定。这里要注意的一点是我们的镜像已经改过名了,因此我们需要写入我们的新名字congzachariah/cztomcat:1.1
。
docker pull congzachariah/cztomcat:1.1
我们来看一眼我们下载过来的镜像。
不难发现,除了改了个名字,这个新下载过来的镜像和我们本地仓库保存的旧镜像连IMAGE ID都相同。
5. 运行自己的镜像
我们通过以下的命令运行一下它。
docker run -d -p 9080:8080 --name myt9 -v /mydocker/congzachariahtomcat/test:/usr/local/apache-tomcat-9.0.0.M18/webapps/test -v /mydocker/congzachariahtomcat/tomcat9logs/:/usr/local/apache-tomcat-9.0.0.M18/logs --privileged=true f832b5ae7fd8
这一步因人而异。可能有同学对于这行的功能不太理解。
-p代表修改端口映射。
–name代表修改容器名称。
关于-v,前边的dockerfile文件中有提到过,我们新建了两个数据卷,因此这里run的时候我们加了两个-v命令,用于把宿主机的/mydocker/congzachariahtomcat/test
和docker容器中的/usr/local/apache-tomcat-9.0.0.M18/webapps/test
相对应起来,tomcat9logs
和logs
同理。这意味着我们以后想部署自己的web项目时,直接修改宿主机的/mydocker/congzachariahtomcat/test
,就可以把项目部署在Tomcat的Docker容器里了。
我们运行一下,发现容器已经跑起来了。我们在浏览器输入地址(http://ip:端口号),如果出现以下界面,代表我们已经成功地部署了我们自定义的Tomcat项目。
最后,我们以一张Docker命令图作为总结。
还没有评论,来说两句吧...