Docker之Dockerfile案例演示

简介:   上篇文章我们给大家介绍了Dockerfile中的常用指令,本文我们通过具体的案例来说明这些指令。1.Base镜像


 上篇文章我们给大家介绍了Dockerfile中的常用指令,本文我们通过具体的案例来说明这些指令。

1.Base镜像

 Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的,如下

image.png

scratch相对于java中的Object

2.自定义镜像mycentos

 我们从官方pull下来的centos镜像是mini版的,所以不带有vim这些基础命令,那我们就来自定义一个镜像,功能比官方下载的强大点,同时运用下各个指令。

2.1 编写

 首先我们来编写对应的Dockerfile文件。内容如下

FROM centos
MAINTAINER bobo<dengpbs@163.com>
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 .

image.png

查看镜像

image.png

2.3 运行

 运行镜像文件。

docker run -it 新镜像名称:TAG

image.png

运行容器后,落脚点是 /usr/local 因为我们配置了WORKDIR

2.4 镜像历史

 查看一个镜像文件的变更历史可以使用如下命令:

docker history 镜像名

image.png

在本例中我们用到了 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

image.png

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

image.png

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

image.png

然而我们的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" ]

构建

image.png

正常run

image.png

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

image.png

通过这个例子 可以看到ENTRYPOINT不会覆盖,而是组合成了一个新的命令。

4.自定义Tomcat9

 最后我们通过自定义一个tomcat镜像来介绍下ADD和COPY这两个命令的区别。

4.1 创建个tomcat目录

image.png

4.2 添加一个文件

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

image.png

4.3 拷贝相关软件

 准备对应的jdk和tomcat的压缩文件。

image.png

4.4 创建Dockerfile文件

 创建对应的Dockerfile文件,如下:

FROM         centos
MAINTAINER    bobo<dengpbs@163.com>
#把宿主机当前上下文的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 .

image.pngimage.png

image.png

构建成功。

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

注意:我们在启动的时候指定了相关的 数据卷

image.png

4.7 验证

image.png

4.8 部署web项目

 既然我们已经部署好了我们自己的tomcat容器,而且也设置了对应的数据卷,那么我们来实际部署一个web案例来看看

4.8.1 web.xml文件

 我们在test目录下创建WEB-INF目录,然后创建web.xml文件,

image.png

<?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 重启容器访问即可

image.png

访问成功~说明搭建OK!


相关文章
|
16小时前
|
Linux 开发工具 Docker
Ubantu docker学习笔记(三)docker账号push及Dockerfile优化
Ubantu docker学习笔记(三)docker账号push及Dockerfile优化
|
8天前
|
数据库 Docker 容器
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
【5月更文挑战第8天】Dockerfile是构建Docker镜像的关键,它包含一系列指令,用于描述应用运行环境及所需软件包。通过自动化构建,能提高效率、保证可重复性并提升灵活性。确定基础镜像、安装依赖、设置环境后,执行Dockerfile生成镜像,用于应用程序部署。虽然需要熟悉Docker技术和应用细节,但其带来的益处使其成为现代软件开发和部署的重要工具。
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
|
8天前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
|
8天前
|
应用服务中间件 Shell nginx
[Docker] Dockerfile
[Docker] Dockerfile
|
8天前
|
JavaScript Java Docker
使用 Dockerfile 构建和定制 Docker 镜像
Dockerfile是构建Docker镜像的文本文件,包含一系列指令,如`FROM`, `WORKDIR`, `COPY`, `RUN`, `EXPOSE`和`CMD`。它用于自动化`docker build`命令来创建Image。使用Dockerfile可以基于官方镜像定制应用镜像,方便应用容器化和扩展。基本流程包括选择基础镜像、设置工作目录、安装依赖、暴露端口和定义启动命令。构建镜像使用`docker build`,运行容器用`docker run`。了解并熟练使用Dockerfile能提升容器化部署效率。
30 0
|
8天前
|
缓存 安全 Docker
《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)
《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)
55 0
|
8天前
|
Java Shell Linux
Docker常用命令以及Dockerfile制作
Docker常用命令以及Dockerfile制作
89 0
|
8天前
|
Docker 容器
Docker使用Dockerfile制作镜像
Docker使用Dockerfile制作镜像
24 0
|
8天前
|
应用服务中间件 Shell nginx
Docker进阶:深入了解 Dockerfile
Dockerfile 是定义 Docker 镜像内容和构建步骤的文本文件,用于定制化镜像构建,包括基础镜像选择、软件安装和环境变量设置等。其优点在于支持容器化趋势,简化快速部署和交付,保证环境一致性,实现资源隔离和安全性,以及促进持续集成与持续部署。Dockerfile 指令如 FROM(指定基础镜像)、RUN(执行命令)、CMD(容器启动命令)和 EXPOSE(声明端口)。编写规则包括使用大写指令、创建 .dockerignore 文件排除无关文件等。
101 0
|
8天前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。