一、Dockerfile是什么?

  镜像定制实质就是定制每一层所添加的配置、文件。

  Dockerfile就是一个脚本来构建和定制镜像,把每一层的修改、安装、构建、操作都写入脚本。以此来解决体积、镜像构建透明等问题。
  Dockerfile是一个文本文件,包含一条条指令(Instruction),每一条指令构建一层,每一条指令的内容,就是描述该层应当如何构建。

二、使用Dockerfile定制镜像

1、创建Dockerfile文件

  1. [root@kwephicprc03547 home]# mkdir docker_nginx # 创建空白目录
  2. [root@kwephicprc03547 home]# cd docker_nginx/
  3. [root@kwephicprc03547 docker_nginx]# touch Dockerfile # 创建命名为Dockerfile的文件

2、编写Dockerfile内容

  1. FROM nginx
  2. RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

3、构建镜像

  1. [root@kwephicprc03547 docker_nginx]# pwd
  2. /home/docker_nginx # 在Dockerfile文件所在目录执行
  3. [root@kwephicprc03547 docker_nginx]# docker build -t nginx:v3 .
  4. Sending build context to Docker daemon .048kB
  5. Step / : FROM nginx ---> 9235bd14ba8c
  6. Step / : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ---> Running in 147db19a597e # 启动了一个容器,并执行所要求的命令
  7. Removing intermediate container 147db19a597e # 删除容器
  8. ---> f100fe2e6ea9 # 提交了这一层
  9. f100fe2e6ea9Successfully built f100fe2e6ea9
  10. Successfully tagged nginx:v3

  docker build命令进行镜像构建,格式为:

  1. docker build [选项] <上下文路径/URL/->

-t:指定了最终镜像的名称 nginx:v3。

三、FROM指令

  定制镜像一定是以某个镜像为基础,基于它进行定制。
  FROM就是指定基础镜像,Dockerfile中FROM是必备指令,且必须是第一个指令。

1、官方镜像

  Docker Hub有非常多的高质量官方镜像,主要分为三类:
  1)服务类镜像:可以直接拿来使用,如nginx、redis、http等。
  2)开发语言镜像:方便开发、构建、运行各种语言应用,如node、python等。
  3)操作系统镜像:更为基础更方便扩展,如centos、ubuntu等。

2、scratch镜像

  scratch是docker中的一个特殊镜像。这个镜像是虚拟的概念,并不实际存在,表示一个空白的镜像

  如果以scratch为基础镜像,意味着不以任何镜像为基础,所写指令将作为第一层开始存在。

  1. FROM scratch

  使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。

四、RUN指令

  RUN 指令是用来执行命令行命令的。Run指令在定制镜像时是最常用的指令之一。

1、RUN指令格式

(1)shell格式

  RUN <命令>,就像直接在命令行输入命令一样。

  1. RUN echo '<h1>Hello,Docker!</h1>' > /usr/share/nginx/html/index.html

(2)exec格式

  RUN ["可执行文件", "参数1", "参数2"],更类似函数调用的格式。

(3)层数限制和指令写法

  Union FS有最大层数限制,如AUFS之前最大不得超过42层,现在是不得超过127层。

  每一条RUN行为都将新建一层,执行命令后,commit这一层的修改,构成新的镜像。

2、Dockerfile的正确写法

  1. FROM debian:stretch
  2.  
  3. RUN buildDeps='gcc libc6-dev make wget' \
  4. && apt-get update \
  5. && apt-get install -y $buildDeps \
  6. && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  7. && mkdir -p /usr/src/redis \
  8. && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components= \
  9. && make -C /usr/src/redis \
  10. && make -C /usr/src/redis install \
  11. && rm -rf /var/lib/apt/lists/* \
  12. && rm redis.tar.gz \
  13. && rm -r /usr/src/redis \
  14. && apt-get purge -y --auto-remove $buildDeps

  所有这些命令的目的只有一个:编译安装redis。因此只需要建立一层即可。使用 && 将各个所需命令串联起来。  

  Dockerfile支持在行尾添加 \ 来实现命令换行;也支持行首 # 来实现注释。

  上面的Dockerfile中还进行了rm 操作,这是在进行清理工作(删除编译构建所需软件;清理下载、展开的文件;清理apt缓存文件),这一点非常重要。镜像构建时,必须保证每一层只添加真正需要添加的东西,任何无关的东西都应该被清理掉。

Dockerfile定制镜像的更多相关文章

  1. 利用dockerfile定制镜像

    利用dockerfile定制镜像 镜像的定制就是定制每一层所添加的配置.文件.如果可以吧每一层修改.安装.构建.操作的命令都写入到一个脚本,用脚本来构建.定制镜像,这个脚本就是dockerfile. ...

  2. 微服务架构 ------ Dockerfile定制镜像

    Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情.  Docker容器 = new Docker镜像  镜像相当于类,容器相当 ...

  3. Docker 学习笔记(二):Dockerfile 定制镜像

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

  4. Docker Dockerfile 定制镜像

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

  5. Docker用Dockerfile定制镜像

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

  6. Docker Dockerfile 定制镜像(转)

    转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...

  7. 使用Dockerfile定制镜像

    Dockerfile是一个文本文件,其中包含额一条一条的指令,每一条指令构建一层,因此每一条指令的作用就是描述这一层应当如何的构建. 以构建nginx镜像为例,使用Dockerfile构建的步骤如下: ...

  8. Dockerfile 定制镜像

    从上一篇文章中我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置.文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观,如果我们可以把每一层修改.安装.构建.操作的 ...

  9. 利用 Dockerfile 定制镜像

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

随机推荐

  1. 傻瓜式学Python3——列表

    前言: 好久不见,突然发觉好久没写博客了,最近迷上了 Python 无法自拔,了解了一下,Python 简单易学,尤其是接触过java的人,入门 Python 更是门槛极低,本着学习记录的原则,边学习 ...

  2. js,timeout,promise执行顺序

    总结 macro-task包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering. micro-task包括 ...

  3. 01迷宫 BFS

    题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...

  4. Android的崩溃类型总结

    看了篇腾讯的沙龙分享,觉得很不错,在这里分享给大家 crash的大致划分:

  5. GIF图制作

    一.安装image 首先在cmd中敲入代码pip install imageio,以便制作动图 二.安装完之后便可读取gif了 在idle中输入代码 import imageio savename = ...

  6. float 浮动 文档流和文字流区别

    关于float属性的脱离文档流的问题 使用float浮动后,元素虽然会脱离文档流,但还处在文本流的位置当中,所以就不会出现重叠的效果吗? 下面我自己试了一下,给两个DIV分别设置了样式,而只给第一个D ...

  7. this和target目标对象的区别

    在事件函数中 event.target和this是一样的效果吗? this是调用方法的对象, evemt.target事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. ...

  8. unity+Helios制作360°全景VR视频

    unity版本  unity2017.2.0 Helios版本:Helios 1.3.6 ffmpeg:ffmpeg-20180909-404d21f-win64-static(地址:https:// ...

  9. 原子操作类AtomicInteger详解

    为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的.num++解析为num=num+1,明显,这个操作不 ...

  10. 解决执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error

    最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...