概述:
Docker存储驱动及其选择
联合文件系统(UnionFS)是一种为Linux、FreeBSD和NetBSD操作系统设计的,将其他文件系统合并到一个联合挂载点的文件系统。
Docker引擎可以使用联合文件系统的多种变体
AUFS
OverlayFS
Btrfs
BFS
DeviceMapper
联合文件系统实际上是由存储驱动实现的,相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
选择Docker存储驱动的总体原则
在最常用的场合使用具有最佳整体性能和稳定性的存储驱动。
如果内核支持多个存储驱动,则Docker会提供要使用的存储驱动的优先级列表。
优先使用Linux发行版默认的存储驱动。
一些存储驱动要求使用特定格式的底层文件系统,这可能会限制选择。
选择存储驱动还要取决于工作负载的特征和所需的稳定性级别。
主流的Docker存储驱动
对于所有当前支持的Linux发行版,overlay2存储驱动是首选。 CentOS和RHEL的最新版本现在已经支持overlay2存储驱动,并将overlay2作为推荐的存储驱动。
对于Docker 18.06或更早的版本,aufs存储驱动是首选。
devicemapper存储驱动用于生产环境时需要配置为direct-lvm模式。
btrfs和zfs存储驱动对底层文件系统(backing filesystem)有用。
vfs存储驱动用于测试,适合那些没有“写时拷贝”的文件系统。
存储驱动的选择可能受到Docker版本、操作系统内核和发行版本的限制。
选择存储驱动需考虑的其他事项
适合工作负载
aufs、overlay和overlay2存储驱动的所有操作都在文件级而不是块级,能更有效地使用内存,但容器的可写层可能在写入繁重的工作负载中变得相当大。
块级存储驱动(如devicemapper、btrfs和zfs存储驱动)在写入繁重的工作负载时表现得更好。
写入大量的小数据,或有很多层的容器,或深层文件系统,overlay存储驱动比overlay2存储驱动性能更好。
btrfs和zfs存储驱动需要更多内存。
zfs存储驱动是高密度工作负载(如PaaS)的理想选择。
共享存储系统
多数情况下Docker可以在SAN、NAS、硬件RAID或其他共享存储系统上工作,但Docker并没有与它们紧密集成。
每个Docker存储驱动都基于Linux文件系统或卷管理器。
稳定性
overlay2、aufs、overlay和devicemapper存储驱动的稳定性更高。
测试工作负载
在不同的存储驱动上运行工作负载时,可以测试Docker的性能。
使用docker info命令查看Docker当前使用的存储驱动,从输出的结果中查找“Storage Driver”部分:
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
可以根据需要更改现有的存储驱动。建议在改变存储驱动之前使用docker save命令导出已创建的镜像,或将它们推送到Docker Hub或其他镜像注册中心,以免今后重建它们。
更改存储驱动会使得现有的容器和镜像不可访问。
dockerfire相关概述和命令
dockerfile:
dockerfile是由一系列指令和参数构成的脚本文件,每一条指令构建一层。
镜像的定制实际上是定制每一层所要添加的配置和文件/
dockerfile的格式:
#Comment
INSTRUCTION arguments
INSTRUCTION 表示指令,不区分大小写,但是建议大写,arguments表示指令的参数。
dockerfile文件必须以FROM指令开头,定义构建镜像的基础镜像。
以“#” 开头的行都视为注释。
docker可使用解析器指令escape设置转移符。
什么是构建上下文:
上下文是由路径(本地文件系统上的目录)或一个URL(git仓库的位置)定义的一组文件。
构建上下文以递归的方式处理,本地路径包括其中的任何子目录。URL包括仓库及其子模块。
使用当前目录作为上下文的简单构建命令:
docker build.
镜像构建过程:
构建过程中一开始将整个上下文递归地发送给守护进程。
docker守护进程逐一运行docker中地指令,每条指令被独立执行并创建一个新镜像。
只要可能,docker将重用过程中的中间镜像(缓存),以加速构建过程。
dockerfile常用指令:
FROM指令:设置基础镜像:3种格式
FROM <image> [AS <name>]
FROM <image> [:<tag>] [AS <name>]
FROM <image> [@<digest>] [AS <name>]
FORM指令为后续指令设置基础镜像,可以在同一个dockerfile文件中多次出现,以创建多个镜像层。
image参数指定任何有效的镜像,特别是可以从公有仓库拉取的镜像
RUN指令-运行命令:
2种格式
RUN <command>
RUN ["executable","param1","param2"]
第一种是shell格式,命令唉shell环境中运行
第二种是exec格式,不会启动shell环境。
RUN指令将当前镜像顶部的新层中执行命令,并提交结果。
exec格式可以避免shell字符转换
shell格式中的默认shell可以使用SHELL命令更改。
CMD指令-指定容器启动时默认执行的命令:
3种格式
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
第一种是首选的exec格式。
第二种提供给ENTRYPOINT指令的默认参数。
第三种是shell格式
LABEL指令-向镜像添加标记(元数据)
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
每个标记(元数据)以键值对的形式表示。要在其中包含空格,应使用引号和反斜杠。
一个镜像可以有多个标记。可以将多个标记合并到单个LABEL指令中以减少层数。
基础镜像或父镜像中包含的标记会被镜像继承。
EXPOSE指令-声明容器运行时侦听的网络端口
格式:EXPOSE <port> [<port> ...]
EXPOSE 指令通知Docker容器在运行时侦听指定的网络端口。
EXPOSE指令不会发布端口,只是起到声明作用。
ENV指定-指定环境变量
ENV指令两种格式:
ENV <key> <value>
ENV <key>=<value> ...
ENV指令以键值对的形式定义环境变量。
第1种格式将单个变量设置为一个值。
第2种格式允许一次设置多个变量,可以使用等号(=),而第1种形式不使用
COPY指令-将源文件复制到容器
COPY指令的用法有以下两种格式:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
--chown选项只能用于构建Linux容器,不能在Windows容器上工作。
COPY指令将指定的源路径(由<src>参数指定)的文件或目录复制到容器文件系统中指定的目的路径(由 <dest>参数指定)。
可以指定多个源路径,但文件和目录的路径将被视为相对于构建上下文的源路径。
目的路径是绝对路径,或者是相对于工作目录(由WORKDIR指令指定)路径。
ADD指令-将文件复制到容器
ADD指令的用法有以下两种格式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
它与COPY指令的功能基本相同,不同之处有两点:
源可以使用URL指定。
归档文件在复制过程中能够被自动解压缩。
如果源是具有可识别的压缩格式的本地Tar归档文件,则将其解包为目录。来自远程URL的资源不会被解压缩。
ENTRYPOINT指令——配置容器的默认入口:
ENTRYPOINT指令的用法有以下两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
第1种是首选的exec格式。
第2种是shell格式。
ENTRYPOINT指令用于配置容器运行的可执行文件。
在Dockerfile中只有最后一个ENTRYPOINT指令会起作用。
VOLUME指令——创建挂载点
VOLUME指令的语法格式如下:
VOLUME ["/data"]
VOLUME指令创建具有指定名称的挂载点,并将其标记为从本机主机或其他容器保留外部挂载的卷。
WORKDIR指令——配置工作目录
WORKDIR指令的语法格式如下:
WORKDIR /path/to/workdir
WORKDIR指令为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。
可以在一个Dockerfile文件中多次使用该指令。
USER指令——设置运行镜像时使用的用户名
USER指令的用法有以下两种格式:
USER <user>[:<group>] or
USER <UID>[:<GID>]
USER指令设置运行镜像时使用的用户名(或UID)和可选的用户组(或GID)。
用户没有主要组时,镜像(或下一条指令)将以root组的身份运行。
ARG指令——定义变量
ARG指令的语法格式如下:
ARG <name>[=<default value>]
ARG指令定义一个变量(可称为构建时变量。
一个Dockerfile文件可以包括一个或多个ARG指令。
SHELL指令——指定命令的shell格式
SHELL指令的语法格式如下:
SHELL ["executable", "parameters"]
SHELL指令用于指定命令的shell格式以覆盖默认的shell。
SHELL指令可以多次出现。每个SHELL指令覆盖所有先前的SHELL指令,并影响所有后续指令。