Dockerfile 简介

什么是Dockerfile

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件

利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(定制镜像)

Dockerfile 示例与使用

Dockerfile使用命令 – docker build

作用:

  • 根据dockerfile创建镜像

命令格式:

  • docker build [OPTIONS] PATH | URL | -

命令参数:

  • PATH Dockerfile所在路径(文件夹路径),文件名必须是Dockerfile
  • URL Dockerfile所在URL地址
  • OPTIONS:
  • -t, --tag list 为镜像设置名称和tag
  • -f, --file string 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

案例演示

mkdir Dockerfile-dir
cd Dockerfile-dir/
vi Dockerfile 

输入以下内容

# 注释
FROM centos
RUN echo '这是一个测试的docker file'

执行 docker file 目录

docker build /root/Dockerfile-dir

可以在上面看到新创建的镜像没有 名称和 TAG 信息 , 使用 -t 参数指定

docker build /root/Dockerfile-dir -t test:v1.0

docker build 默认指定docker file 所在的目录,它会自动的寻找其下面的Dockerfile文件,那么我们在其目录下dockerfile不是以 Dockerfile命名的话,就会报错

可以使用 -f 参数解决这个问题

docker build . -f /root/Dockerfile-dir/test_docker_file -t test2:v1.0

对一个 docker  文件多次 build 可以发现以下规律

cat Dockerfile

docker build . -t test

 可以发现多次 build 一个docker file 使用过的命令不在执行

在 docker file 中新增一条命令

 vi Dockerfile
# 注释
FROM centos
RUN echo '这是一个测试的docker file'
RUN echo '这是一个在后面添加'

再次 build

docker build . -t test  

 可以发现,在后面新增的执行,以前旧的使用的是缓存不执行

在 docker file 前面添加一条命令

# 注释
FROM centos
RUN echo '这是一个在前面添加'
RUN echo '这是一个测试的docker file'
RUN echo '这是一个在后面添加'

再次build

docker build . -t test

可以发现所有命令都执行

由此可以得出这样的一个结论,在一个步奏修改了内容,前面的不变,后面的都会被执行  

通过查看镜像的历史记录可以知道,执行一条命令都会在原有的基础上增加一层,所以在写docker file 的时候要尽量在后面添加东西,这样就不会把前面的层重新构建

doker file 底层就是调用 docker commit 把容器变成一个镜像

Dockerfile 特征

查看官方的 Dockerfile:https://github.com/docker-library/docs

Dockerfile 构建特征(二)

Dockerfile必须具备一个FROM命令来进行构建

每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交后,产生新的镜像层)

通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID

Dockerfile 命令概述(一)

查看完整介绍

https://docs.docker.com/engine/reference/builder/#usage  

FROM: 指定基础镜像

RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build

CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。

ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。

:为镜像添加对应的数据。

MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。

EXPOSE:设置对外暴露的端口。

ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效

ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失

ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件

COPY:将本地文件或目录拷贝到镜像的文件系统中。

VOLUME:添加数据卷

USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令

WORKDIR:设置工作目录

Dockerfile 命令概述(二)

ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令

STOPSIGNAL:设置容器退出时发出的关闭信号。

HEALTHCHECK:设置容器状态检查。

SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

备忘:

  • Docker 容器与镜像之间的关系(尤其commit命令的作用和效果)
  • Dockerfile 的书写规则和使用规则
  • 查看官方的 Dockerfile:https://github.com/docker-library/docs  (看看官方的案例)

Docker 核心技术之Dockerfile的更多相关文章

  1. Docker 核心技术与实现原理

    提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...

  2. Docker核心技术

    Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...

  3. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  4. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  5. [转]Docker(三):Dockerfile 命令详解

    本文转自:https://blog.csdn.net/ityouknow/article/details/79600406 上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dock ...

  6. Docker Compose vs. Dockerfile

    Docker Compose vs. Dockerfile - which is better? - Stack Overflowhttps://stackoverflow.com/questions ...

  7. Docker(三):Dockerfile 命令详解

    上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...

  8. Docker 入门指南——Dockerfile 指令

    COPY 复制文件 格式: COPY [--chown=<user>:<group>] <源路径>... <目标路径> 源路径可以是多个,甚至可以使通配 ...

  9. docker build 指定dockerfile

    1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地 ...

随机推荐

  1. 网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议

    [前五篇]系列文章传送门: 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - DNS 协议:网络世界的地址簿 网络协议 17 - HTTPDNS:私人定制的 DNS 服务 网络协议 ...

  2. 解决关于:Oracle数据库 插入数据中文乱码 显示问号???

    问题: oracle数据库,通过接口插入的中文数据乱码,中文变成了问号??? 解决方案: 计算机=>属性=>高级系统设置=>环境变量=>新建 变量名:NLS_LANG 值:SI ...

  3. vimium使用

    vimium使用 chrome下面的vimium插件已经慕名已久,迟迟没有做尝试,今天在家有空就熟悉了一下vimium,感觉还是棒棒的.记录一下一些使用心得. 常用按钮 j 向上滚动 k 向下滚动 d ...

  4. Devexpress 常用的功能

    一 .GridControl的删除操作 private void rILinkEditInfoDel_Click(object sender, EventArgs e) { if (XtraMessa ...

  5. 发现了一个App拉新工具:免填邀请码

    去年公司开始着手开发一个App项目,从调研到开发完成,前前后后历时快半年(没少加班),目前产品已经上架了各个应用市场,名字就不提了,省得说我打广告.今年开年说要开始做冷启动了,大家都知道,这才是最苦逼 ...

  6. jquery快速入门(五)

    jQuery - AJAX AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,AJAX 通过后台加载数据,并在网页上进行显示,实现了对部分网页的更新. AJAX就是异步 JavaScri ...

  7. 从PRISM开始学WPF(三)Prism-Region-更新至Prism7.1

    [7.1update]在开始前,我们先看下版本7.1中在本实例中的改动. 首先,项目文件中没有了Bootstrapper.cs,在上一篇的末尾,我们说过了,在7.1中,不见推荐使用Bootstrapp ...

  8. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  9. Android项目实战登录&注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  10. mssql sqlserver 对不同群组对象进行聚合计算的方法分享

    摘要: 下文讲述通过一条sql语句,采用over关键字同时对不同类型进行分组的方法,如下所示: 实验环境:sql server 2008 R2 当有一张明细表,我们需同时按照不同的规则,计算平均.计数 ...