docker镜像分层

目录

1.dockerfile

1.创建容器的方式

2.dockerfile结构

3.dockerfile操作指令

4.dockerfile镜像分层

5.dockerfile分层原理

1.docker镜像分层(基于AUFS构建)

2.涉及技术


1.dockerfile

1.创建容器的方式

  • 基于已有的模板文件进行创建

    • 容器导出,导入

  • 基于已有的镜像创建

  • dockerfile

2.dockerfile结构

dockerfile是由一组指令组成的文件

编写自定义镜像

  • 基础镜像信息

    • linux的发行版 centos ubantu debian SUSE alpine

  • 维护者信息

  • 镜像操作指令

  • 容器启动时执行指令

dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#"号开头的注释

容器启动时所执行的默认的指令/程序是cmd

所以dockerfile的最后一条命令是cmd或者entrypoint 

3.dockerfile操作指令

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

docker镜像分层_第1张图片

4.dockerfile镜像分层

docker镜像分层_第2张图片

docker镜像分层_第3张图片

容器层可读可写是为了给客户端操作

dockerfile中的每个指令都会创建一个新的镜像层
镜像层被缓存和复用
当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
镜像层会被缓存和复用——有一个缓冲
​
aufs——联合挂载
​
用overlay2将小镜像组合挂载到容器层

5.dockerfile分层原理

1.docker镜像分层(基于AUFS构建)

Docker境像位于bootfs之上

每一层镜像的下一层成为父镜像

第一层镜像成为base image(操作系统环境镜像)

容器层(可读可写),在最顶层( writable)

容器层以下都是readonly

container读写层 

images(只读)

base image

bootfs + rootfs + aufs/overlay2 + LXC (kernel)

fs——文件系统

1.LXC容器技术和docker容器的区别

LXC起源于cgroup和namespaces,使得进程之间相互隔离,即进程虚拟化。

LXD/LXC是一个系统容器。Docker是一个应用程序容器

LXC不能跨机器上进行移植,而Docker可以跨机器甚至跨平台移植。

容器是一种特殊的虚拟化 

早期docker没有虚拟化的功能,LXC帮助docker实现虚拟化和容器化的工具
​
早期的docker和LXC是紧耦合。限制docker有了虚拟化的功能后和LXC就不是紧耦合的关系了。

img

2.涉及技术

1.rootfs和bootfs

docker镜像分层_第4张图片

①bootfs (boot file system)内核空间
主要包含bootloader和kernel

bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,#在Docker镜像的最底层是bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

在linux操作系统中(不同版本的linux发行版本),linux加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作

②rootfs ( root file system)内核空间
在bootfs之上 (base images,例如centos 、 ubuntu)

包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc 等标准目录和文件

rootfs就是各种不同的操作系统发行版,比如ubuntu,Centos 

##bootfs + rootfs : 作用是加载、引导内核程序+挂载使用linux操作系统(centos ubantu)等等一些关键的目录文件

对于一个精简的os,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs 就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

镜像的最底层就是bootfs

bootfs加载引导内核

boot内核加载器会不一致,不同的centos加载和引导内核的加载器会不一样,但是会共用一个rootfs,rootfs内核空间,包含/dev /proc /etc /bin。rootfs就是不同版本的操作系统发行版

个性化是rootfs,统一化是bootfs

虚拟机是bootfs+rootfs
​
容器是共享bootfs只要个性化的rootfs就行——容器轻量级,快的原因

2.AUFS和overlay/overlay2

AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层

而docker使用了overlay/overlay2存储驱动来支持分层结构 OverlayFs将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

docker镜像分层_第5张图片

3.overlayFS存储引擎

docker镜像分层_第6张图片

overlay2把多个小镜像挂载到同一个位置

  • rootfs基础镜像

  • LowerDir下层信息——可读(镜像层)

  • UpperDir上层目录——可写(容器层)

  • workDir——运行的工作目录(copy-on-write写时复制)——准备容器环境

  • MergedDir——视图层 (容器视图) 展示

4.docker镜像层次结构小结

  • base image :基础镜像

  • image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)

  • container:容器层(读写)

  • docker-server端

  • 呈现给docker-client(视图)

你可能感兴趣的:(Linux,docker,docker,linux,运维,容器)