1.什么是dockerfile?

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

docker build命令用于从Dockerfile构建映像。

2. Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,#为 Dockerfile 中的注释。

dockerfile的指令:FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。RUN: 用来执行命令行命令。其基本格式:shell格式: RUN  <命令>  ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;exec格式: RUN  <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;COPY:  复制文件。 其基本格式:格式1:COPY <源路径>...<目标路径>格式2:COPY [“<源路径1>”,....."<目标路径>"]ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;CMD:容器启动命令。其基本格式:shell格式: CMD <命令>exec格式: CMD ["可执行文件", "参数1", "参数2"...]参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数ENTRYPOINT: 入口点。其基本格式分为exec和shell,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:  <ENTRYPOINT> "<CMD>"ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:格式1:ENV <key> <value>格式2:ENV <key1>=<value1> <key2>=<value>...ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:格式1: ARG <参数名> [=<默认值>]格式2: 该默认值可以在构建命令 docker build  中用 --build-arg <参数名>=<值> 来覆盖VOLUME: 定义匿名卷。 其基本格式:格式1: VOLUME ["<路径1>", "<路径2>"...]格式2: VOLUME <路径>EXPOSE:  暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:格式1: EXPOSE <端口1> [<端口2>...]WORKDIR: 指定工作目录。其基本格式:格式1: WORKDIR <工作目录路径>USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:格式1: USER <用户名>HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检

3. Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

3.1 常用指令

3.1.1 FROM

FROM:指定基础镜像,必须为第一个命令。
定制的镜像都是基于 FROM 的镜像,这里的 nginx就是定制需要的基础镜像。后续的操作都是基于 nginx。

格式:FROM <image>FROM <image>:<tag>#示例:FROM nginx:1.15-alpine。默认使用latest版本的基础镜像

3.1.2 MAINTAINER

维护者信息。

格式:MAINTAINER <name>
示例:MAINTAINER Jasper XuMAINTAINER sorex@163.comMAINTAINER Jasper Xu <sorex@163.com>

3.1.3 RUN

构建镜像时执行的命令

# RUN用于用于指定 docker build 过程中要运行的命令
# 有两种命令执行方式
# shell执行
RUN <command># exec执行
RUN ["executable", "param1", "param2"]# 示例
RUN ["./test.php", "dev", "offline"]
# 等价于
RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz

如上,以&& 符号连接命令,这样执行后,只会创建 1 层镜像。

3.1.4 CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同

  • CMD 在docker run 时运行,用于指定在容器启动时所要执行的命令
  • RUN 是在docker build时运行,用于指定镜像构建时所要执行的命令
# CMD 在docker run 时运行
# CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖
# CMD指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束
# 注意:如果 dockerfile 中如果存在多个CMD指令,仅最后一个生效# CMD写法和RUN一致,例如
CMD ["/usr/sbin/httpd","-c","/etc/httpd/conf/httpd.conf"]

一般用最简单的方式启动一个容器时使用docker run 会传递参数给docker指令

docker run -it image /bin/bash

后面的/bin/bash 其实是传递参数,告知容器启动时运行一个shell。这个过程可以用CMD 指令等效的替换

CMD ['/bin/bash']

因此在Dockerfile中存在这个CMD指令指定的命令时,启动容器就可以不进行参数传递。


如果dockerfile中已经指定了容器启动时运行的程序,同时在使用docker run 启动容器时使用了命令行参数,那么dockerfile 中的CMD 指令将无效

docker run -it image /bin/ps

发现启动容器后没有shell ,只是打印出了当前容器中的进程状态,cmd 指令效果被覆盖。

3.1.5 COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

COPY <src> <dest>
COPY ["<src>", "<dest>"]
# <src>:要复制的源文件或目录,支持使用通配符
# <dest>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建
# 建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径
# 注意:在路径中有空白字符时,通常使用第二种格式

文件复制准则

  • <src>必须是build上下文中的路径,不能是其父目录中的文件
  • 如果<src>是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
  • 如果指定了多个<src>,或在<src>中使用了通配符,则必须是一个目录,且必须以/结尾
  • 如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

3.1.6 ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD :在执行 <源文件> 为 tar 压缩文件的话,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
  • COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

3.1.7 WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

WORKDIR <工作目录路径>

3.1.8 ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

 ENV <key> <value>

3.1.9 EXPOSE

仅仅只是声明端口。
作用

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

3.1.9 VOLUME

在介绍VOLUME指令之前,我们来看下如下场景需求:

1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。

2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。

这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。

3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?

对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

VOLUME用于指定持久化目录

VOLUME ["/data1","/data2"]

和docker run -v创建的挂载点区别

  1. 通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。
  2. 通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。但是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.
我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息

"Mounts": [{"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21","Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data","Destination": "/data1","Driver": "local","Mode": "","RW": true},{"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36","Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data","Destination": "/data2","Driver": "local","Mode": "","RW": true}],

Dockerfile简介相关推荐

  1. Docker容器---dockerfile简介

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

  2. Dockerfile 简介

    1. Dockerfile 简介 Dockerfile是包含一些Linux命令的.名为Dockerfile的文件.Docker通过读取该文件中的命令来组建镜像.Dockerfile一般分为" ...

  3. 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介

    高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 D ...

  4. 【Docker】Dockerfile简介

    介绍 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本. 我们使用docker commit可以构造镜像,但是docker中的镜像随时变化,不能一 ...

  5. Docker核心技术之Dockerfile

    一.Dockerfile简介 Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个 ...

  6. docker之Dockerfile

    Dockerfile 简介 从之前 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所 添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个 ...

  7. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  8. DockerFile入门指南

    第一发布地址:http://hphblog.cn/2019/04/07/DockerFile/ 简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1:每 ...

  9. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

最新文章

  1. python编写圣诞树代码_python 实现圣诞树
  2. 关于perl中变量内插问题的讨论
  3. java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现
  4. 华为发布岳云鹏手机_华为P40系列发布,再谈手机隐私安全重要性
  5. 对原生AJAX和HTTP的理解
  6. 约瑟夫问题pascal程序
  7. 11年标致307多少钱_11优布劳幼兽红西柚精酿啤酒多少钱一瓶?
  8. 邱勇校长在2018级研究生开学典礼上的讲话 | 融合成就人生新的高度
  9. spring jpa mysql集群_微框架:Springboot+Jpa+mysql零基础上手班
  10. 【推荐实践】“全能选手”召回表征算法实践.pdf(附下载链接)
  11. 操作系统和嵌入式开发 你愿意参加吗?
  12. 软件测试报告的项目背景,软件测试报告范本
  13. Android应用签名
  14. java 象棋人机开源码,中国象棋人机博弈程序(扁平化棋局) C语言实现
  15. 先分号分隔 然后逗号分割c语言,分隔符的用法
  16. iframe标签控制视频大小及自动播放
  17. Python-OpenCV图像处理(二):模糊操作
  18. 创建一个员工信息管理界面,页面如下
  19. WAI-ARIA无障碍网页应用属性完全展示
  20. html5 canvas 博客,html5 Canvas

热门文章

  1. 公司财务会计制度范本
  2. 对称图像输出问题(for循环 ,取绝对值的利用)
  3. layui分页组件layPage动态调整总页数
  4. exports生效 nfs_nfs的配置文件/etc/exports
  5. 2022-2027年中国职业中介服务行业运行态势及未来发展趋势预测报告
  6. 性格色彩测试android程序开发之四--响应dialog事件的处理
  7. 【机器学习】先验概率与后验概率
  8. idea中提交时committed出现author 'xxx' is not 'Name ' and matches no existing author 的解决方法(小菜鸟入门小白教程)
  9. Python小菜鸟-----文本进度条的不同设计函数
  10. 【C++】标准库 std::clamp 使用方法