Docker 镜像分层及dockerfile 编写技巧

docker镜像分层

分层介绍

Dockerfile中的每个指令都会创建一个新的镜像层

镜像层将被缓存和复用

当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成
  • ·最底端是bootfs,并使用宿主机的bootfs
  • ·第二层是root文件系统rootfs,称为base image
  • ·然后再往上可以叠加其他的镜像文件
  • ·统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了 一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • ·一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • ·当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。

1.base image:基础镜像
2.image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)
3.container:容器层(读写)
4.docker-server 端
5.呈现给docker-client (视图)

镜像分层模型

dockerfile 编写

dockerfile操作指令

序号 指令 含义
1 FROM 镜像 指定新镜像所基于的镜像,第 条指必须为from指令,每创建一个镜像就需要一条from指令
2 MAINTAINER 名字 说明新镜像的维护人信息
3 RUN 命令 在所基于的镜像上执行命令,并提交到新的镜像中;docker内每执行一条命令都是run开头
4 CMD["要运行的程序","参数1","参数2"] 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行
5 EXPOSE 端口号 指定新镜像加载到Docker时要开启的端口
6 ENV 环境变量 变量值 设置一个环境变量的值,会被后面的run使用
7 ADD 源文件、目录 目标文件/目录 具体识别压缩格式并且自动解压,将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者一个URL
8 COPY 源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
9 VOLUME ["目录"] 在容器中创建一个挂载点
10 USER 用户名/UID 指定运行容器时的用户
11 WORKDIR 路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
12 ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
13 HEALTHCHECK 健康检查

ADD和copy区别

①Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的
              ②copy只能用于复制(节省资源)
              ③ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)
              ④COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
              ⑤满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

CMD和entrypoint区别

一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。

尝试编写dockerfile文件 部署nginx


mkdir nginx
cd nginx/
vim Dockerfile 

FROM centos:7      #基于基础镜像
MAINTAINER nginx   #用户信息
RUN yum -y update   #安装依赖关系
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx                     #创建用户
ADD nginx-1.12.0.tar.gz /usr/local/src                    #将源文件复制到目标文件,源文件要与
                                                            Dockerfile位于相同目录中,或者是
                                                             一个URL

VOLUME ["/usr/local/nginx/html"]                        #在容器中创建一个挂载点
WORKDIR /usr/local/src                                  #指定工作目录
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80                                                   #暴露端口
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx

docker运行nginx为什么要使用 daemon off

docker运行nginx为什么要使用 daemon off

到此这篇关于Docker 镜像分层及dockerfile 编写的文章就介绍到这了,更多相关Docker 镜像分层内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析Docker镜像分层的注意事项

    前言 我们平常在对程序进行Docker镜像打包的时候总会有些困惑,到底是将最终的镜像分层打包最后汇总成程序的镜像(也就是一层一层的 From )合适,还是说直接将程序从Source code就打包出最终的镜像更合适呢?其实这里面没有说那个是对或错的,要看程序包自身的情况做选择. Docker build的注意点 如果接触过Docker,Docker build大家都清楚怎么用了,但是有几个容易忽略的注意点: 1.Dockerfile开头的 From 和 MAINTAINER 其实都是一层镜像 2

  • Dockerfile构建自定义镜像的实现

    目录 前言 Dockerfile简介 Dockerfile构建镜像的流程 Dockerfile使用 前言 前面文章中使用docker运行容器使用的镜像都是从dockerhub上远程pull下来的,那么我们能不能构建自己的镜像呢?答案是肯定滴,可以通过Dockerfile构建自己的镜像,Dockerfile本身并不难,就是一堆命令,让小编觉得有难度的地方是如何使用Dockerfile的这些命令从更高一层的角度上更好的去构建自己的镜像,我们就一起来看看吧. Dockerfile简介 Dockerfi

  • Docker镜像分层的原理详解

    base镜像 base镜像有两层含义: 不依赖其他镜像,从scratch构建 其他镜像可以之为基础进行扩展 所以,base镜像一般都是各种Linux发行版本的Docker镜像,比如:Ubuntu,Debian或者CentOS等. base镜像提供的都是最小安装的Linux发行版本. 我们大部分镜像都将是基于base镜像构建的.所以,通常使用的是官方发布的base镜像.可以在docker hub里找到.比如centos:https://hub.docker.com/_/centos 我们可以自己构

  • Docker 镜像分层及dockerfile 编写技巧

    docker镜像分层 分层介绍 Dockerfile中的每个指令都会创建一个新的镜像层 镜像层将被缓存和复用 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件 Docker镜像原理 Docker镜像是由特殊的文件系统叠加而成 ·最底端是bootfs,并使用宿主机的bootfs ·第二层是r

  • 优化Docker镜像安全性的12个技巧总结

    目录 1前言 2避免泄露构建密钥 多阶段构建 BuildKit的密钥 题外话:不要推送在开发机上构建的镜像 3以非root用户身份运行 4使用最新的基础镜像构建和更新系统包 背景知识 6对你的镜像进行漏洞扫描 7扫描你的Dockerfile是否违反了最佳实践 8不要对DockerHub使用Docker内容信任 9扫描你自己的代码是否有安全问题 10使用docker-slim来删除不必要的文件 11使用最小的基础镜像 12使用受信任的基础镜像 背景知识 13测试你的镜像是否能在降低能力的情况下工作

  • 彻底搞懂Docker镜像分层的实现

    目录 创建测试镜像 查看镜像 使用dockerinspect 使用dockerhistory 镜像分层图 镜像分层的好处 镜像分层的实现 Copy-on-write策略 创建测试镜像 我们创建一个最简单的镜像: 1.构建测试镜像v1.0:docker build -t image_test:1.0 . FROM alpine:3.15.0 #除了继承基础镜像,啥也不做 2.构建测试镜像v2.0:docker build -t image_test:2.0 . FROM alpine:3.15.0

  • 从docker镜像里提取dockerfile的两种方法

    目录 前言 从镜像中提取dockerfile的两种方法 1.history参数 2.dfimage 补充:如何设置永久的别名 总结 前言 hello,大家好,今天在玩docker的时候发现了很好用的东西,他就是用来提取镜像中的dockerfile的.这个是前者留下来的镜像,但是dockerfile被删除了,现在想知道dockerfile里面是如何写的,然后去查了查就有了新的发现——通过镜像来提取dockerfile,接下来我就把方法分享给大家 从镜像中提取dockerfile的两种方法 1.hi

  • Docker 进阶之镜像分层方案详解

    目录 导读 入门图解 创建测试镜像 查看镜像 使用docker inspect 使用docker history 镜像分层图 镜像分层的好处 Docker镜像加载原理 rootfs Union mount image layer Docker 镜像下载 镜像存储 镜像在远端仓库存储 本地镜像存储 导读 可以想象,像 ubuntu等基础镜像,体积必然不小.那么,思考以下几个问题: 我们基于同一个镜像(ubuntu 18.4)启动了两个容器,会占用两倍磁盘空间吗? 我们在容器内修改或者新建了某个文件

  • 深入理解docker镜像的分层(小白必看)

    大家好,今天分享docker镜像的分层理解 我们拉取Redis 镜像 [root@localhost ~]# docker pull redis Using default tag: latest latest: Pulling from library/redis a2abf6c4d29d: Pull complete c7a4e4382001: Pull complete 4044b9ba67c9: Pull complete c8388a79482f: Pull complete 413c

  • 理解Docker(2):Docker 镜像详细介绍

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 对于每个软件,除了它自身的代码以外,它的运行还需要有一个运行环境和依赖.不管这个软件是象往常一样运行在物理机或者虚机之中,还是运行在现在的容器之中,这些都是不变的.在传统环境中,软件在运行之前也

  • Java应用打包成Docker镜像

    目录 怎么把Java应用打包成Docker镜像? Maven插件构建镜像 用Docker的多阶段构建打包镜像 怎么把Java应用打包成Docker镜像? 对熟悉Docker的同学这应该是一个很简单的问题,把项目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到镜像里,启动命令设置执行这个JAR文件即可. 比如一个使用Maven构建的Spring应用就可以用下面这个Dockerfile构建镜像. FROM openjdk:8-jre ADD target/*.jar /appl

随机推荐