Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

一、官方镜像

学习docker镜像的制作之前,先去看看官方的镜像是怎么制作的,查看官方dockerfile的方式如下所示

  1. 进入官方镜像仓库,搜索镜像,如下图所示

  2. 找到镜像后,查看的相应的版本信息并进入到github

  3. 进入github后,即可看到官方的Dockerfile,通过Dockerfile文件后,可以清晰的看到镜像的制作过程

二、Dockerfile构建过程

  1. 基础知识:
  • 每个关键字(指令)都必须是大写字母
  • 执行流程是从上到下顺序执行
  • "#" 表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交

  1. 步骤
  • Dockerfile:构建文件,定义了一切的步骤,源代码
  • Dockerimages:通告Dockerfile构建生成的镜像,最终发布运行的产品
  • Docker容器:容器就是镜像运行起来提供服务

三、命令

FROM                      # 基础镜像,一切从这开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作命令
VOLUME # 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
EXPOSE # 指定暴露端口
CMD # 指定容器启动的时候运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令可以追加命令
ONBUILD # 当构建一个被继承的 dockerfile ,这个时候就会运行ONBUILD的指令,触发指令
COPY # 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
ENV # 构建的时候设置环境变量
ARG # 构建参数,与 ENV 作用一致。不过作用域不一样。
USER # 用于指定执行后续命令的用户和用户组
HEALTHCHECK # 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
LABEL # LABEL 指令用来给镜像添加一些元数据(metadata)

具体的命令使用请看考菜鸟教程的命令介绍

四、Dockerfile编写

这里我们编写自己的Tomcat镜像进行测试

  1. 准备镜像文件,这里需要Tomcat和jdk的压缩包
  • Tomcat下载,首先进入Tomcat官网,找到自己需要的安装包进行下载,如下图所示



  • jdk下载,首先进入jdk官网,找到自己需要的安装包进行下载,如下图所示

  • 将压缩包拷贝到linu系统下

  1. 编写Dockerfile文件,文件命名为Dockerfile,build会自动寻找这个文件,否则编译时需要使用-f指定
  FROM ubuntu:16.04
MAINTAINER jiaozhu<3333333333@qq.com> # 名字 COPY readme.txt /usr/local/readme.txt #复制文件 ADD jdk-8u311-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.56-src.tar.gz /usr/local/ #复制解压 RUN apt-get update --fix-missing && apt-get install -y vim --fix-missing ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录 ENV JAVA_HOME /usr/local/jdk1.8.0_311 #设置环境变量
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar #设置环境变量 分隔符是:
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56-src #设置环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.56-src #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 #设置暴露的端口 CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56//bin/logs/catalina.out # 设置默认命令



注意 这里的Dockerfile中不能进行注释否则编译会出错

  1. 编译
  docker build -t diytomcat:1.0 .



安装完成后即可看到生成的镜像

  1. 问题



    解决办法
# 原始命令
RUN apt-get install -y vim # 修改方法
RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/#' /etc/apt/sources.list;
RUN apt-get update && apt-get install -y vim
#或者这个都可以
RUN apt-get update --fix-missing && apt-get install -y vim --fix-missing

五、运行测试

  1. 启动Tomcat
   docker run -d -p 8088:8080 --name diytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /home/tomcat/tomcatlog/:/usr/local/apache-tomcat-9.0.56/logs/ diytomcat:1.0

  1. 测试是否启动成功



  2. 进入容器,查看设置是否成功

  3. 发布自己的应用

  • 编写hello.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
</body>
</html>
  • 将文件放在webapps/test中



  • 打开浏览器访问http://192.168.2.239:8088/test/hello.html

参考文献

Docker:https://www.cnblogs.com/j-chao/p/13212436.html

Docker Dockerfile:https://www.runoob.com/docker/docker-dockerfile.html

Docker build出现“The command :https://blog.csdn.net/weixin_41693877/article/details/108504527

Docker制作Tomcat镜像:https://blog.csdn.net/weixin_43397326/article/details/83306562

Docker 之 Dockerfile的更多相关文章

  1. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

  2. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  3. docker:Dockerfile构建LNMP平台

    docker:Dockerfile构建LNMP平台   1.dockerfile介绍  Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...

  4. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  5. Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?

    老生常谈,再再再……普及一下: Docker:最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker. Dockerfile: ...

  6. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  7. (转)Docker 基础 : Dockerfile

    全文来自 Docker 基础 : Dockerfile Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像.我们会先介绍 Dockerfile 的 ...

  8. 【docker】Dockerfile

    [docker]Dockerfile 转载: ============================================================= =============== ...

  9. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  10. docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像

    docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...

随机推荐

  1. C# AES CBC模式 加密和解密

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...

  2. KingbaseES 最老事务阻止vacuum freeze

    前言 最近生产环境发生几次由于长事务导致表.库年龄没法回收的情况.我们要规避这种情况的发生,不要等发生了再去强制中断会话连接.当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为froze ...

  3. KingbaseES KWR中等待事件分析案例

    背景 昨天有现场同事碰到了一个现象,一条简单的update语句运行缓慢.单独运行没有问题,在特定时间运行就会非常缓慢,怀疑是业务系统特殊逻辑导致数据库有阻塞引发的update语句慢的现象.故此现场同事 ...

  4. #构造,二分#[AGC006B] [AGC006D] Median Pyramid

    Easy Hard 分析(Easy) 若\(X=1\)或\(X=2n-1\)无解,否则在正中间构造\(X-1,X,X+1\), 其余位置升序铺入剩余数, 若\(X-1\)左侧数大于\(X-1\)那么\ ...

  5. 探索生成式AI的未来:Chat与Agent的较量与融合

    近年来,生成式人工智能(AI)不仅在技术界引起了广泛关注,更成为了推动多个行业革新的关键力量.这种技术之所以备受瞩目,不仅在于其独特的创造性和高效性,还在于它对未来商业模式和社会结构可能产生的深远影响 ...

  6. .Net 代码分析工具对比 visual studio 2022 current

    目录 原因 背景知识 名词解释 分析器 分析器在IDE里 目标 查找思路及过程 CodeMaid Roslyn StyleCop.Analyzer StyleCop? StyleCop.Analyze ...

  7. 玩转HarmonyOS专项测试,轻松上架“五星”高品质应用

      作者:David,华为测试服务专家 随着信息技术的高速发展,移动应用与人们生活日益紧密,面向各类场景的应用层出不穷,什么样的应用更受用户青睐呢?在满足用户功能需求之上,一个好的应用要能运行稳定.流 ...

  8. HarmonyOS网络管理开发—HTTP与WebSocket

      一.  网络管理开发概述 网络管理模块主要提供以下功能: ● HTTP数据请求:通过HTTP发起一个数据请求. ● WebSocket连接:使用WebSocket建立服务器与客户端的双向连接. ● ...

  9. ArkUI新能力,助力应用开发更便捷

    原文链接:https://mp.weixin.qq.com/s/TAuq1WC6435ebn6L61rZAA,点击链接查看更多技术内容:    ArkUI是一套构建分布式应用的声明式UI开发框架.它具 ...

  10. Node. js 有哪些全局对象?

    一.是什么 在浏览器 JavaScript 中,通常window 是全局对象, 而 Nodejs中的全局对象是 global 在NodeJS里,是不可能在最外层定义一个变量,因为所有的用户代码都是当前 ...