Docker系列(十八)——Dockerfile实战三Dockerfile指令的综合实战

版权声明:本文为博主原创文章,如果觉得写的不错需要转载,在转载时请注明博文出处! https://blog.csdn.net/Hello_World_QWP/article/details/84580662

                               《 Dockerfile实战三Dockerfile指令的综合实战 》

前言:

在上一篇文章 《 Dockerfile实战二之CMD与ENTRYPOINT 》中,对CMD和ENTRYPOINT进行了深入的认识,本篇将完成一个综合的示例,通过本篇的综合示例,将覆盖所有 DockerFile 指令,并学会各个指令的使用。

Dockerfile实战三Dockerfile指令的综合实战


1、本篇将更具实际需求应用到 Dockerfile 系列指令,并构建一个完整的web应用运行时运行环境,在实操之前先来认识哈 Dockerfile 的常用指令:

ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
CMD 指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
EXPOSE 当前容器对外暴露出的端口
ENV 用来在构建镜像过程中设置环境变量
ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
RUN 容器构建时需要运行的命令
VOLUME 容器数据卷,用于数据保存和持久化工作
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落入的基本目录

2、新建一个tomcat目录,由于存放编写的Dockerfile脚本儿文件,和所需的软件包,输入命令 “ mkdir -p /opt/docker/tomcat ”,并在该命令下模拟一个数据文件 tomcat_data.db,
输入命令 “ echo "There are some data of the web container " > tomcat_data.db,如下图:

3、下载web项目运行时环境所需要的安装包,jdk 使用 jdk-8u151-linux-x64.tar.gz,tomcat 使用 apache-tomcat-9.0.12.tar.gz(文件已上传到CSDN,欢迎下载!),下载完成后上传到该目录下,如下图:

4、新建Dockerfile脚本儿文件,输入命令 “ vi dockerfilebytomcat ” ,并键入如下内容

# 要使用的base基础镜像
FROM centos
# 作者
MAINTAINER alibaba_huazai<[email protected]>
# 将模拟数据拷贝到容器/opt/data路径下
COPY tomcat_data.db /opt/b2c_data.db
# 将java与tomcat添加到容器中
ADD jdk-8u151-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.12.tar.gz /usr/local/
# 安装netstat,用于检测端口监听情况
RUN yum -y install net-tools
# 设置登录时落入目录
ENV CDPATH /usr/local
WORKDIR $CDPATH

# 配置java环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 配置tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.12
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.12
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 暴露容器运行时的端口,以正常提供服务
EXPOSE  8080

# 启动Tomcat,并打印日志信息
CMD echo "building---------------------------sucessfully"
CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out

如下图:

*注:关于启动Tomcat服务器,还可以使用如下方式:

# 使用 ENTRYPOINT 指令启动
ENTRYPOINT ["/opt/tomcat/tomcat/bin/startup.sh" ]
# 使用 CMD 的另一种启动方式
CMD ["/opt/tomcat/tomcat/bin/catalina.sh","run"]

5、构建并生成一个新的镜像文件,输入命令 “ docker build -f /opt/docker/tomcat/dockerfilebytomcat -t huazai/web/runtime/tomcat:v1.0 . ” 进行构建(在构建的过程中会出现一些警告,不用理会!),构建成功后会获得一个全新的镜像文件,如下图:

6、运行web环境,
输入命令 “ docker run -it -d -p 8082:8080 --name tomcat01 -v /opt/tomcat/b2c:/usr/local/apache-tomcat-9.0.12/webapps/b2c -v /opt/tomcat/b2c/logs/:/usr/local/apache-tomcat-9.0.12/logs --privileged=true 镜像ID ”,启动成功后,如下图:

*注:在挂载目录后多加一个 --privileged=true 参数,主要为了避免 Docker 挂载宿主机目录时,Docker访问出现 cannot open directory .: Permission denied 的问题。

7、测试tomcat是否能正常访问
任意开启一个浏览器,在地址栏输入 “ IP地址:服务器端口号 ”,访问查看,如果能正常访问,则说明正常的,如下图:


8、测试项目能否正常的发布,结合前述的容器卷将测试的web服务发布到 b2c 目录中,

第一步:在b2c目录中新建 WEB-INF 目录,并新增配置文件 web.xml ,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>b2c</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

第二步:新增一个测试的首页,并命名为 index.jsp ,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>b2c project</title>
</head>
<body style="text-align: center;">
	<div
		style="margin: 0 auto; width: 600px; height: 400px; border: 2px solid #F00">
		<h1>Welcome to browse this b2c project ! ! !</h1>
		<br> <br>
		<h3>
			Please refresh this page ,<br /> And then look at the logs!
		</h3>
		<%
			Long tempDate = System.currentTimeMillis();
		%>
		<input type="text" value="<%=tempDate%>" />
		<%
			System.out.println("=============================: " + tempDate);
		%>
	</div>
</body>
</html>

项目发布完成后,通过容器卷的特点,会传递共享到对应的容器卷目录下,新增完成后,宿主机目录接口如下图:

第三步:浏览项目,在浏览器地址栏输入“ IP:端口/项目访问路径” ,每次刷新页面,后台都会模拟产生一条日志信息,如下图:

第四步:查看日志信息,进入到挂载的日志目录下,输入命令 “ tail -f catalina.out ” ,如下图:

结束语

好了,关于Dockerfile的相关内容就告一段落了,其中完成了从理论到初步认识,从初步认识到综合实战,基本上覆盖了Dockerfile的所有指令的应用及作用,下面将完成几个常用的实例安装教程。


 好了,关于 Docker系列(十八)——Dockerfile实战三Dockerfile指令的综合实战 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者: 华    仔
联系作者: [email protected]
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/84580662
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!

猜你喜欢

转载自blog.csdn.net/Hello_World_QWP/article/details/84580662
今日推荐