Docker 核心技术之Dockerfile
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的更多相关文章
- Docker 核心技术与实现原理
提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...
- Docker核心技术
Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...
- Docker(二):Dockerfile 使用介绍
上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...
- Docker系列07—Dockerfile 详解
本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...
- [转]Docker(三):Dockerfile 命令详解
本文转自:https://blog.csdn.net/ityouknow/article/details/79600406 上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dock ...
- Docker Compose vs. Dockerfile
Docker Compose vs. Dockerfile - which is better? - Stack Overflowhttps://stackoverflow.com/questions ...
- Docker(三):Dockerfile 命令详解
上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...
- Docker 入门指南——Dockerfile 指令
COPY 复制文件 格式: COPY [--chown=<user>:<group>] <源路径>... <目标路径> 源路径可以是多个,甚至可以使通配 ...
- docker build 指定dockerfile
1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地 ...
随机推荐
- 又拍云张聪:OpenResty 动态流控的几种姿势
2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...
- 装箱问题的CPLEX求解
装箱问题(Bin Packing Problem) 装箱问题即搬家公司问题.一个搬家公司有无限多的箱子,每个箱子的承重上限为W,当搬家公司进入一个房间时,所有物品都必须被装入箱子,每个物品的重量为wi ...
- 使用strace命令跟踪系统调用
一.是什么strace? strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由 ...
- 使用 FFT 分析周期性数据
可以使用傅里叶变换来分析数据中的变化,例如一个时间段内的自然事件. 天文学家使用苏黎世太阳黑子相对数将几乎 300 年的太阳黑子的数量和大小制成表格.对大约 1700 至 2000 年间的苏黎世数绘图 ...
- k8s集群监控(十一)--技术流ken
Weave Scope 在我之前的docker监控中<Docker容器监控(十)--技术流ken>就已经提到了weave scope. Weave Scope 是 Docker 和 K ...
- Autofac 和 Quartz.Net 自动注入的整合
一:问题场景 在一次项目开发中,项目中已使用了Autofac.在新需求中要用到Quatrz.Net.在任务中使用注入方法,确始终无法使用注入的方法,经过千百次的度娘,终于找到了解决办法!吐槽下度娘真心 ...
- SQL—访问操作(2)
上一篇介绍了数据访问操作的两种方法,接下来把剩下两个操作简单介绍一下: ExecuteNonQuery()的操作:对数据库进行增加.修改.删除 返回类型是 int 代表受影响的行数 返回的结果如果是 ...
- 将配置文件appsetting中的值转换为动态对象调用
该文可参考我的另一篇关联文章: https://www.cnblogs.com/lxhbky/p/6957825.html 配置如下: <!--邀请用户送优惠券规则{邀请人规则:[{邀请人: ...
- Django学习之六:Django 常用模块导入记忆
Django 常用模块导入记忆 django相关 1. urls相关操作 from django.urls import path, re_path, include from django.urls ...
- ASP.NET MVC 5 實作 GridView 分頁
本文用 ASP.NET MVC 5 實作一個 GridView,功能包括: 分頁(paging).關鍵字過濾(filtering).排序(sorting).AJAX 非同步執行,外觀上亦支援 Resp ...