docker:dockerfile使用介绍(代码片段)

shanheyongmu shanheyongmu     2022-12-25     777

关键词:

上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像、容器和 Dockerfile 。我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微服务实践中,Dockerfile 也是重点关注的内容,今天我们就来一起学习它。

首先通过一张图来了解 Docker 镜像、容器和 Dockerfile 三者之间的关系。

技术分享图片

Dockerfile 概念

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

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

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

Dockerfile 文件格式

通过上图可以看出使用 Dockerfile 定义镜像,运行镜像启动容器。

Dockerfile文件格式如下:

##  Dockerfile文件格式

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
 
# 1、第一行必须指定 基础镜像信息
FROM ubuntu
 
# 2、维护者信息
MAINTAINER docker_user [email protected]
 
# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "
daemon off;" >> /etc/nginx/nginx.conf
 
# 4、容器启动执行指令
CMD /usr/sbin/nginx

Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。

构建镜像

docker build 命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,所以构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。

将当前目录做为构建上下文时,可以像下面这样使用docker build命令构建镜像:

docker build .
Sending build context to Docker daemon  6.51 MB
...

说明:构建会在 Docker 后台守护进程(daemon)中执行,而不是CLI中。构建前,构建进程会将全部内容(递归)发送到守护进程。大多情况下,应该将一个空目录作为构建上下文环境,并将 Dockerfile 文件放在该目录下。

在构建上下文中使用的 Dockerfile 文件,是一个构建指令文件。为了提高构建性能,可以通过.dockerignore文件排除上下文目录下不需要的文件和目录。

在 Docker 构建镜像的第一步,docker CLI 会先在上下文目录中寻找.dockerignore文件,根据.dockerignore 文件排除上下文目录中的部分文件和目录,然后把剩下的文件和目录传递给 Docker 服务。

Dockerfile 一般位于构建上下文的根目录下,也可以通过-f指定该文件的位置:

docker build -f /path/to/a/Dockerfile .

构建时,还可以通过-t参数指定构建成镜像的仓库、标签。

镜像标签

docker build -t nginx/v3 .

如果存在多个仓库下,或使用多个镜像标签,就可以使用多个-t参数:

docker build -t nginx/v3:1.0.2 -t nginx/v3:latest .

在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:

docker build -t nginx/v3 . 
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

缓存

Docker 守护进程会一条一条的执行 Dockerfile 中的指令,而且会在每一步提交并生成一个新镜像,最后会输出最终镜像的ID。生成完成后,Docker 守护进程会自动清理你发送的上下文。
Dockerfile文件中的每条指令会被独立执行,并会创建一个新镜像,RUN cd /tmp等命令不会对下条指令产生影响。
Docker 会重用已生成的中间镜像,以加速docker build的构建速度。以下是一个使用了缓存镜像的执行过程:

$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
 ---> 31f630c65071
Step 2/4 : MAINTAINER [email protected]
 ---> Using cache
 ---> 2a1c91448f5f
Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/
 ---> Using cache
 ---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed ‘s/.*_PORT_([0-9]*)_TCP=tcp://(.*):(.*)/socat -t 100000000 TCP4-LISTEN:1,fork,reuseaddr TCP4:2:3 &/‘ && echo wait) | sh
 ---> Using cache
 ---> 7ea8aef582cc
Successfully built 7ea8aef582cc

构建缓存仅会使用本地父生成链上的镜像,如果不想使用本地缓存的镜像,也可以通过--cache-from指定缓存。指定后将不再使用本地生成的镜像链,而是从镜像仓库中下载。

寻找缓存的逻辑

Docker 寻找缓存的逻辑其实就是树型结构根据 Dockerfile 指令遍历子节点的过程。下图可以说明这个逻辑。

  FROM base_image:version           Dockerfile:
           +----------+                FROM base_image:version
           |base image|                RUN cmd1  --> use cache because we found base image
           +-----X----+                RUN cmd11 --> use cache because we found cmd1
                /                /          RUN cmd1     RUN cmd2           Dockerfile:
       +------+     +------+           FROM base_image:version
       |image1|     |image2|           RUN cmd2  --> use cache because we found base image
       +---X--+     +------+           RUN cmd21 --> not use cache because there‘s no child node
          /                                         running cmd21, so we build a new image here
         /   RUN cmd11     RUN cmd12
+-------+     +-------+
|image11|     |image12|
+-------+     +-------+

大部分指令可以根据上述逻辑去寻找缓存,除了 ADD 和 COPY 。这两个指令会复制文件内容到镜像内,除了指令相同以外,Docker 还会检查每个文件内容校验(不包括最后修改时间和最后访问时间),如果校验不一致,则不会使用缓存。

除了这两个命令,Docker 并不会去检查容器内的文件内容,比如 RUN apt-get -y update,每次执行时文件可能都不一样,但是 Docker 认为命令一致,会继续使用缓存。这样一来,以后构建时都不会再重新运行apt-get -y update

如果 Docker 没有找到当前指令的缓存,则会构建一个新的镜像,并且之后的所有指令都不会再去寻找缓存。

简单示例

接下来用一个简单的示例来感受一下 Dockerfile 是如何用来构建镜像启动容器。我们以定制 nginx 镜像为例,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

mkdir mynginx
cd mynginx
vi Dockerfile

构建一个 Dockerfile 文件内容为:

FROM nginx
RUN echo ‘<h1>Hello, Docker!</h1>‘ > /usr/share/nginx/html/index.html
vi Dockerfile  (这里切记要删除很多教程里都有导致执行不了

 



docker:dockerfile介绍及简单示例(代码片段)

Dockerfile概念  Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参... 查看详情

docker:dockerfile命令介绍

...onospace}p{margin-bottom:0.25cm;line-height:120%}a:link{}前一章介绍了Dockerfile创建镜像的方法,Dockerfile文件都是一些指令,因此要掌握Dockerfile就必须了解这些指令。这一章就介绍下Dockerfile的指令。From:功能为指定基础镜像,并 查看详情

docker---dockerfile学习(代码片段)

DockerFile学习DockerFile是什么whatisDockerFile构建三步骤DockerFile构建过程解析DockerFile内容基础知识Docker执行Dockerfile的大致流程小总结DockerFile的体系结构保留字指令小总结案例自定义镜像mycentos编写注意:dockerbuild命令最后有一个.,.代表... 查看详情

docker教程-10-dockercompose使用入门(代码片段)

...了解Compose1.1 Compose介绍1.2Compose和Docker兼容性1.3 docker、dockerfile与docker-compose区别2、安装compose(需先安装docker)2.1 安装环境查看2.2 安装compose方式一:从github上下载docker-compose二进制文件安装方式二:python-pip方式安装doc 查看详情

docker:dockerfile详解与实例(代码片段)

基本结构Dockerfile由一行行命令语句组成,并且支持已#开头的注释行。一般而言,Dockerfile的内容分为四个部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令、 Dockerfile完整demo#Thisdockerfiledemoforprojectbuildtod... 查看详情

docker教程-10-dockercompose使用入门(代码片段)

...了解Compose1.1 Compose介绍1.2Compose和Docker兼容性1.3 docker、dockerfile与docker-compose区别2、安装compose(需先安装docker)2.1 安装环境查看2.2 安装compose方式一:从github上下载docker-compose二进制文件安装方式二:python-pip方式安装docker-... 查看详情

docker---dockerfile编写nginx(代码片段)

...层原理1、初级了解镜像2、如何堆叠镜像2、涉及技术二、Dockerfile编写1、dockerfile操作指令2、编写dockerfile文件--部署nginx3、DOCKERFILE优化方案三、小结:一、镜像分层原理1、初级了解镜像镜像包含以下: 查看详情

docker:dockerfile自定义镜像(代码片段)

文章目录1.Dockerfile自定义镜像1.1.镜像结构1.2.Dockerfile语法1.3.案例:构建Java项目1.3.1.基于Ubuntu构建Java项目1.3.2.基于java8构建Java项目1.4.小结1.Dockerfile自定义镜像常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须... 查看详情

docker-4dockerfile的使用

DockerfileFROM   基础镜像MAINTAINER 维护这信息RUN   运行什么命令,在命令前面加上RUNADD   往里面加点文件,copy文件,会自动解压WORKDIR  当前的工作目录VOLUME  目录挂载EXPOSE &nbs 查看详情

docker------dockerfile镜像创建(代码片段)

目录一.SSH镜像二.Systemctl镜像三.nginx镜像四.tomcat镜像五.mysql镜像一.SSH镜像mkdir/opt/sshdcd/opt/sshdvimDockerfile#第一行必须指明基于的基础镜像FROMcentos:7#作者信息MAINTAINERthisissshimage#镜像的操作指令RUNyum-yupdateRUNyum-yinstallopenssh*net- 查看详情

docker1指令,docker-compose,dockerfile(代码片段)

文章目录1.pull/image,run/ps(进程),exec/commit2.save/load3.docker-compose3.1link3.2docker-compose.yml4.Dockerfile4.1ENV4.2LABEL1.pull/image,run/ps(进程), 查看详情

docker--------dockerfile实战

1.背景  Dockerfile是为快速构建dockerimage[镜像]而设计的,当你使用dockerbuild命令的时候,docker会读取当前目录下的命名为Dockerfile(首字母大小写均可)的纯文本文件并执行里面的指令构建出一个dockerimage。这比SaltStack的配置管理... 查看详情

docker2--dockerfile(代码片段)

编写dockerfileDockerfile内容1个run为1层文件层,注意清理不必要的安装包。FromnginxRUNecho‘hello123‘>/usr/share/nginx/html/index.html&&echo‘123‘#&&apt-getinstall-y$buildDeps#&&apt-getpurge-y--auto-re 查看详情

[docker]dockerfile创建容器移动状态exited(代码片段)

为什么会出现Exited(0)docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器pid挂了,那么docker容器便会直接退出。#末尾加入使得nginx在前台运行CMD["/usr/sbin/nginx","-g... 查看详情

docker——dockerfile的理解&案例实操(代码片段)

文章目录:1.Dockerfile是什么?2.Dockerfile体系结构3.案例实操3.1案例一(FROM、MAINTAINER、RUN、EXPOSE、WORKDIR、ENV、CMD)3.2案例二(CMD、ENTRYPOINT)3.3案例三(ONBUILD)3.4案例四( 查看详情

docker——dockerfile的理解&案例实操(代码片段)

文章目录:1.Dockerfile是什么?2.Dockerfile体系结构3.案例实操3.1案例一(FROM、MAINTAINER、RUN、EXPOSE、WORKDIR、ENV、CMD)3.2案例二(CMD、ENTRYPOINT)3.3案例三(ONBUILD)3.4案例四( 查看详情

docker1指令,docker-compose,dockerfile(代码片段)

文章目录1.pull/image,run/ps(进程),exec/commit2.save/load:dockersave+镜像id,不是容器id3.docker-compose:组织一个多容器项目:宿主机(eth0网卡)安装docker会生成一张do 查看详情

docker------dockerfile镜像创建(代码片段)

...像四.tomcat镜像五.mysql镜像一.SSH镜像mkdir/opt/sshdcd/opt/sshdvimDockerfile#第一行必须指明基于的基础镜像FROMcentos:7#作者信息MAINTAINERthisissshimage#镜像的操作指令RUNyum-yupdateRUNyum-yinstallopenssh*net-toolslsoftelnetpasswdRUNecho'abc1234'|passwd--stdinr... 查看详情