Dockerfile定制镜像

一、Dockerfile是什么? 

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

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

二、使用Dockerfile定制镜像      

1、创建Dockerfile文件

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

2、编写Dockerfile内容

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

3、构建镜像

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

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

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为基础镜像,意味着不以任何镜像为基础,所写指令将作为第一层开始存在。

FROM scratch

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

四、RUN指令

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

1、RUN指令格式

(1)shell格式

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

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的正确写法

FROM debian:stretch

RUN buildDeps='gcc libc6-dev make wget'  
        && apt-get update  
        && apt-get install -y $buildDeps  
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"  
        && mkdir -p /usr/src/redis  
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1  
        && make -C /usr/src/redis  
        && make -C /usr/src/redis install  
        && rm -rf /var/lib/apt/lists/*  
        && rm redis.tar.gz  
        && rm -r /usr/src/redis  
        && apt-get purge -y --auto-remove $buildDeps    

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

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

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

原文地址:https://www.cnblogs.com/xiugeng/p/10449884.html