1、什么是Dockerfile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。

通过架构图可以看出通过DockerFile可以直接构建镜像

 2、Dockerfile解析过程

3、Dockerfile内容基础知识

1.每条保留字指令都必须为大写,且后面都要跟至少一个参数。2.指令按照从上到下,顺序执行。3.#表示注释。4.每条指令都会创建一个新的镜像层,并对镜像进行提交。

4、Dockerfile的保留命令

官方说明:Dockerfile reference | Docker Documentation

FROM 命令

基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

语法:

FROM  <image>FROM  <image>[:<tag>]     使用版本不写为latestFROM  <image>[@<digest>]  使用摘要

MAINTAINER 命令

镜像维护者的姓名和邮箱地址[废弃]

语法:

MAINTAINER <name>

RUN 命令

RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

语法:

RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)RUN echo hello​RUN ["executable", "param1", "param2"] (exec form)RUN ["/bin/bash", "-c", "echo hello"]

 EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口

语法:

EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcpEXPOSE 80/udp

CMD 命令

用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

语法:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)CMD ["param1","param2"] (as default parameters to ENTRYPOINT)CMD command param1 param2 (shell form)

WORKDIR 命令

用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

语法:

WORKDIR /path/to/workdir​WORKDIR /aWORKDIR bWORKDIR c`注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`

 ENV 命令

用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

语法:

ENV <key> <value>ENV <key>=<value> ...

ADD 命令

用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

语法:

ADD hom* /mydir/       通配符添加多个文件ADD hom?.txt /mydir/   通配符添加ADD test.txt relativeDir/  可以指定相对路径ADD test.txt /absoluteDir/ 也可以指定绝对路径ADD url 

COPY 命令

用来将context目录中指定文件复制到镜像的指定目录中

语法:

COPY src destCOPY ["<src>",... "<dest>"]

VOLUME 命令

用来定义容器运行时可以挂在到宿主机的目录

语法:

VOLUME ["/data"]

15.4.11 ENTRYPOINT命令

用来指定容器启动时执行命令和CMD类似

语法:

  ["executable", "param1", "param2"]ENTRYPOINT command param1 param2

ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。 CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

Dockerfile构建过程解析

1.Docker从基础镜像运行一个容器2.执行一条命令并对容器进行修改3.执行类似docker commit的操作提交一个新的镜像层4.docker再基于刚提交的镜像运行一个新容器5.执行dockerfile中的下一条指令直到所有指令都执行完毕

小总结

1.从应用软件的角度来看,Dockerfile、docker镜像、docker容器分别代表软件的三个不同阶段  Dockerfile 是软件的原材料    docker镜像  是软件的交付品  docker容器  可以认为是软件的运行状态2.Dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。

1.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、进程服务和内核进程(当应用就进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等2.docker镜像,在用Dockerfile定义一个文件之后,docker build 时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务3.docker容器,容器是直接提供服务的

Dockerfile案例

Base镜像(scratch):Docker Hub中99%的镜像都是由base镜像中安装和配置需要的软件构建出来的。

自定义镜像myCentos

1. 先了解Docker Hub上的Centos是什么情况。

DockerHub上的centos镜像默认落脚点是/,默认不支持vim。那么现在我们想自定义一个centos,改变其默认落脚点,让其支持vim。

2. 编写Dockerfile

#基于Centos基础镜像构建FROM centos#镜像维护者的姓名和邮箱地址MAINTAINER ZCN<15236674712@163.com>#设置一个变量ENV MYPATH /tmp#设置落脚点WORKDIR $MYPATH#安装vim编辑器RUN yum -y install vim#对外暴露端口号EXPOSE 80#执行指令输出落脚点CMD echo $MYPATH#执行指令输出信息CMD echo "build-------success"#执行指令CMD /bin/bash

3. 构建镜像

$ docker build -f /myDocker/dockerfile -t zcn/mycentos .

4. 运行容器

$ docker run -it -P zcn/mycentos

自定义镜像myTomcat

1. 先创建/mydocekrfile/tomcat这个目录

将tomcat和jdk8的tar包放进此目录下。然后创建一个dockerfile文件。​- apache-tomcat-8.5.46.tar.gz- jdk-8u171-linux-x64.tar.gz

2. 编写Dockerfile

FROM centosMAINTAINER ZCN<15236674712@163.com>#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下COPY ./c.txt /usr/local/cincontainer.txt#把tomcat和jdk的tar包拷贝到容器中ADD ./apache-tomcat-9.0.22.tar.gz /usr/local/ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/#安装vim编辑器Run yum -y install vim#设置登录落脚点/usr/localENV MYPATH /usr/local/WORKDIR $MYPATH#配置java和tomcat的环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#容器运行时监听的端口EXPOSE 8080#启动时运行tomcat# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh"]# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

java项目创建镜像 jar包

FROM centosMAINTAINER ZCN<15236674712@163.com>#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下#把jdk的tar包拷贝到容器中ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/#设置登录落脚点/usr/localENV MYPATH /usr/local/WORKDIR $MYPATH#配置java和tomcat的环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH $PATH:$JAVA_HOME/binCOPY ./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar yingx_zhangcn184s-0.0.1-SNAPSHOT.jarEXPOSE 9292ENTRYPOINT ["java","-jar","./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar"]

3. 构建镜像

$ docker build -t zcn/mytomcat .这里没写-f是因为如果在当前目录下并且file文件名为正统的dockerfile 那么-f可以省略不写。

4. 运行容器

$ docker run -d -p 8888:8080 --name mytomcat -v /zcn/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /zcn/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs --privileged=true zcn/tomcat

解释:创建数据卷,让容器中的webapps目录中的项目目录和主机中test目录做一个映射

Docker之Dockerfile原理相关推荐

  1. Docker容器的原理与实践(上)

    本文来自网易云社区. 虚拟化 是一种资源管理技术,将计算机的各种资源予以抽象.转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源. Hypervisor 一种运 ...

  2. Docker : Dockerfile 定制镜像

    使用 Dockerfile 定制镜像 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程.   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们 ...

  3. Docker 精通之 Dockerfile

    Docker 精通系列 Docker 精通之入门 Docker 精通之微服务 Docker 精通之常用命令 Docker 精通之 Dockerfile 1.基本说明 Dockfile 是一个用于编写 ...

  4. Docker容器---dockerfile简介

    Docker容器---dockerfile简介 一.dockerfile概念 1.dockerfile介绍 2.基于dockerfile创建 3.docker镜像加载原理 二.镜像的创建 1.基于现有 ...

  5. 七、Docker:DockerFile

    其他文章: 一.Docker:概述 二.Docker:安装 三.Docker:命令 四.Docker:可视化管理 五.Docker:镜像(image) 六.Docker:数据卷 七.Docker:Do ...

  6. [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor

    目录 1.镜像(images) 1.1.Dockerfile:是制作镜像的文件 2.镜像结构原理 2.1.base 镜像 2.1.1.rootfs和bootfs 2.1.2.base 镜像提供的是最小 ...

  7. 图片详解docker命令和原理

    10张图带你深入理解Docker容器和镜像 [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. [Kubernetes ...

  8. (转)Docker镜像结构原理

    以下内容转载自 https://blog.51cto.com/liuleis/2070461 第八篇:Docker镜像结构原理 base 镜像 base 镜像有两层含义: 不依赖其他镜像,从 scra ...

  9. docker的镜像原理

    docker的镜像原理 一.镜像是什么 二.docker镜像加载原理 1.UnionFS(联合文件系统) 2.docker镜像加载原理 三.分层理解 1.分层的镜像 四.commit镜像(分层原理的例 ...

  10. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

最新文章

  1. 为什么说康托尔知道聚宝盆的秘密?
  2. 在你的代码中使用自定义异常类
  3. Buuctf(pwn) jarvisoj_tell_me_something 栈溢出
  4. DELPHI 指针使用用的一篇好文 收藏
  5. 为您的Office文档加把锁-ADRMS的安装
  6. ZkServer服务启动的逻辑-NIOServerCnxnFactory.start
  7. 看我如何作死 | 网络延迟、网络丢包、网络中断一个都没落下过
  8. 【MFC系列3】永远点不到的按钮
  9. 机器学习与计算机视觉(sklearn快速上手)
  10. java.exe 不是有效的win32_WinXP提示不是有效的Win32应用程序怎么办?
  11. Perceptron实践
  12. 毕设题目:Matlab心电信号
  13. Linux设置时间和硬件时间
  14. WPF UI 框架 收集
  15. 土方工程量计算表格excel_市政道路土方excel计算表(含公式)
  16. 基于VC 6.0实现简单的微信打飞机
  17. Apple自动化利器AppleScript
  18. 读书笔记10 《蔡康永的说话之道1》 蔡康永
  19. 海康威视rtsp转rtmp
  20. 【api】添加了权限管理的一部分

热门文章

  1. 7-2 单位年会聚餐时的座次C位
  2. 某医院门诊预约系统/医院预约挂号系统
  3. 企查查、天眼查、启信宝的产品调研分析
  4. 2021年N1叉车司机新版试题及N1叉车司机证考试
  5. 【WiFi】WiFi安全类型
  6. 阿迪达斯智能运营中心在苏州工业园区开工建设;信达生物任命生物医药科学家刘勇军为集团总裁 | 美通企业日报...
  7. 暗色调,调出紫红色的暗调晨曦照片效果(转)
  8. python windows下载哪个_初识Python(windows)——下载、安装、使用
  9. Echarts的x,y网格线样式
  10. linux下运行testng,TestNG执行程序