Docker之Dockerfile案例演示
- 2019 年 12 月 30 日
- 筆記
上篇文章我们给大家介绍了Dockerfile中的常用指令,本文我们通过具体的案例来说明这些指令。
1.Base镜像
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的,如下

scratch
相对于java中的Object
2.自定义镜像mycentos
我们从官方pull下来的centos
镜像是mini版的,所以不带有vim
这些基础命令,那我们就来自定义一个镜像,功能比官方下载的强大点,同时运用下各个指令。
2.1 编写
首先我们来编写对应的Dockerfile文件。内容如下
FROM centos MAINTAINER bobo<[email protected]> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
2.2 构建
然后将脚本构建成对应的镜像文件。
docker build -f dockerfile名称 -t 新建的镜像名:TAG .

查看镜像

2.3 运行
运行镜像文件。
docker run -it 新镜像名称:TAG

运行容器后,落脚点是 /usr/local
因为我们配置了WORKDIR
2.4 镜像历史
查看一个镜像文件的变更历史可以使用如下命令:
docker history 镜像名

在本例中我们用到了 FROM
MAINTAINER
RUN
EXPOSE
ENV
WORKDIR
命令
3.CMD/ENTRYPOINT案例
接下来我们通过案例来看看CMD
和ENTRYPOINT
两个命令的区别,这两个命令的作用都是指定一个容器启动时要运行的命令
3.1 CMD
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换掉,我们通过tomcat的案例来介绍。 正常情况如下
docker run -it -p 8888:8080 tomcat

但是当我们在 执行命令后添加参数的话,如下

原因是我们先看Tomact对应的 Dockerfile文件

然而我们的run命令 把Dockerfile中的最后的CMD命令覆盖了~~
3.2 ENTRYPOINT
有别于CMD
命令,ENTRYPOINT
命令是在 docker run
之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的组合命令。我们通过curl
指令来介绍这个案例。 Dockerfile文件如下:
FROM centos RUN yum install -y curl ENTRYPOINT [ "curl", "-s", "http://www.baidu.com" ]
构建

正常run

加-i
参数 查看响应报文头

通过这个例子 可以看到ENTRYPOINT
不会覆盖,而是组合成了一个新的命令。
4.自定义Tomcat9
最后我们通过自定义一个tomcat
镜像来介绍下ADD
和COPY
这两个命令的区别。
4.1 创建个tomcat目录

4.2 添加一个文件
在当前目录下创建一个 hello.txt
文件,作用是COPY
到容器中

4.3 拷贝相关软件
准备对应的jdk
和tomcat
的压缩文件。

4.4 创建Dockerfile文件
创建对应的Dockerfile文件,如下:
FROM centos MAINTAINER bobo<[email protected]> #把宿主机当前上下文的hello.txt拷贝到容器/usr/local/路径下 COPY hello.txt /usr/local/helloincontainer.txt #把java与tomcat添加到容器中 ADD jdk-8u201-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.0.47.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_201 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.47 ENV CATALINA_BASE /usr/local/apache-tomcat-8.0.47 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-8.0.47/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-8.0.47/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-8.0.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out
4.5 构建
docker build -f dockerfile -t bobotomcat .



构建成功。
4.6 run
构建成功后,我们就可以运行了,命令如下:
docker run -d -p 9080:8080 --name mytomcat -v /mydocker/tomcat/test:/usr/local/apache-tomcat-8.0.47/webapps/test -v /mydocker/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.47/logs --privileged=true bobotomcat
注意:我们在启动的时候指定了相关的 数据卷

4.7 验证

4.8 部署web项目
既然我们已经部署好了我们自己的tomcat容器,而且也设置了对应的数据卷,那么我们来实际部署一个web案例来看看
4.8.1 web.xml文件
我们在test目录下创建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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>test</display-name> </web-app>
4.8.2 index.jsp文件
然后创建一个简单的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>Insert title here</title> </head> <body> -----------welcome------------ <%="i am in docker tomcat self "%> <br> <br> <% System.out.println("=============docker tomcat self");%> </body> </html>
4.8.3 重启容器访问即可

访问成功~说明搭建OK!