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. springboot+aop切点记录请求和响应信息

    本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如 ...

  2. Python基础(os模块)

    os模块用于操作系统级别的操作: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当 ...

  3. C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化

    1.显示释放资源需继承接口IDisposable 什么是资源:C#中每一个类型都代表一种资源,而资源又分为以下两类. 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 ...

  4. 『练手』003 Laura.SqlForever如何扩展 兼容更多数据库引擎

     003 Laura.SqlForever如何扩展 兼容更多数据库引擎 数据库引擎插件 在 界面上的体现 导航窗体 的 工具栏 中的 引擎下拉列表        导航窗体 的 树形控件 中的 引擎主节 ...

  5. html 和css 效果--整理集合篇

    一.如何用一张图片做背景图,并且图片自适应div的大小 background: url("../stu_wengu.png") center center no-repeat; b ...

  6. 一套代码小程序&Web&Native运行的探索04——数据更新

    接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  7. AspNetCore 基于AOP实现Polly的使用

    前言   说起AOP,其实我们在做MVC/API 的时候应该没少接触,比如说各种的Fitter 就是典型的AOP了. 本来在使用Polly的时候我最初的打算是使用过滤器来实现的,后来发现实现起来相当的 ...

  8. Asp.Net Core在CentOS部署与注意

    部署具体步骤参考:将ASP.NET Core应用程序部署至生产环境中(CentOS7) 1.wwwroot是放静态文件的,Startup的配置里面要app.UseStaticFiles(); 2.在不 ...

  9. Java开发笔记(八十一)如何使用系统自带的注解

    之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...

  10. vue-router 通过路由来实现切换头部标题

    在做单页面应用程序时,一般页面布局头尾两块都是固定在布局页面,中间为是路由入口.这时访问页面时头部标题不会变,该问题的解决方案如下: 通过采用组件内路由卫士(beforeRouterEnter.bef ...