Docker存储和dockerfile

文章讨论了Docker的不同存储驱动,如overlay2、aufs和devicemapper,强调了选择存储驱动要考虑工作负载、性能和稳定性。同时,介绍了Dockerfile的用途,包括FROM、RUN、CMD等指令,以及构建上下文和镜像构建过程。
摘要由CSDN通过智能技术生成

概述

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指令,并影响所有后续指令。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值