学习docker基础——docker存储驱动、docker开发镜像基础

本文详细介绍了Docker的存储驱动,包括overlay2的使用要求、配置方法以及其工作机制。强调了在CentOS和RHEL上使用overlay2的注意事项,并概述了如何迁移Docker根目录。此外,还讨论了Docker的挂载类型选择和Dockerfile在开发镜像中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、docker存储驱动及其选择

二、使用overlay2存储驱动

三、迁移docker根目录

四、docker存储的挂载类型

五、开发docker镜像


一、docker存储驱动及其选择

(一)概述

        1.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版本、操作系统内核和发行版本的限制。

二、使用overlay2存储驱动

(一)、使用overlay2存储驱动的要求

        1.docker版本要求

        Docker EE 17.06.02-ee5或更高版本支持overlay2存储驱动。

        虽然Docker CE版本支持overlay存储驱动,但是建议使用overlay2存储驱动。

        2.Linux内核版本要求

        4.0或更高版本的Linux内核。

        RHEL或CentOS可使用3.10.0-514或更高版本的内核。

        如果使用更低版本的内核,则可使用overlay存储驱动,但不推荐这样做。

        3.底层文件系统要求

        ext4。

        xfs,但仅限于启用d_type的情形。

(二)、配置docker使用overlay2存储驱动

        1.docker安装默认使用overlay2存储驱动的情形

           从Ubuntu 14.04版本开始支持overlay2存储驱动

            从CentOS 7.4版本开始,安装过程中建立的xfs文件系统开始支持d_type,安装Docker默认使用的就是overlay2存储驱动。

        2.将存储驱动变更为overlay2

                停止docker:systemctl stop docker

                将/var/lib/docker的内容复制到一个临时位置:cp -au /var/lib/docker /var/lib/docker.bk

                如果要使用一个独立于/var/lib/所用的底层文件系统,先格式化该文件系统,然后将它挂载到/var/lib/docker。确保将该挂载设置添加到/etc/fstab,使之保存下来。

                编辑/etc/docker/daemon.json文件,添加以下内容:"storage-driver": "overlay2"

                启动Docker:systemctl start docker

                使用docker info 命令验证Docker守护进程是否正在使用overlay2存储驱动。

        3.在CentOS 7版本操作系统上使用overlay2存储驱动

        安装一台运行CentOS 7.0版本操作系统的计算机,并在其中安装Docker CE,默认使用的是 devicemapper存储驱动,将存储驱动变更为overlay2。

        解决xfs文件系统的d_type支持问题:升级Linux内核至4.0或更高的版本,以支持overlay2存储驱动。备份/var/lib/docker,通常将/var/lib/docker的内容复制到一个临时位置。

        如果Docker正在运行,则先要停止Docker运行。以下针对低于CentOS 7.4版本的情形

        CentOS 7.4版本以下的操作系统版本安装时创建的xfs文件系统没有启用d_type支持,解决的办法是另外准备一块磁盘或磁盘分区,重新格式化为支持d_type的xfs格式,将该分区重新挂载到/var/lib/docker目录。

        编辑/etc/docker/daemon.json文件,添加以下内容:"storage-driver": "overlay2"

        重启Docker。

        使用docker info 命令验证Docker守护进程是否正在使用overlay2存储驱动。

(三)、overlay2存储驱动的工作机制

        1.overlayFS的镜像分层与共享

        OverlayFS在单个Linux主机上分为两个代表不同层次的目录,并且对外统一呈现为单个目录

        overlay2存储驱动与overlay存储驱动最本质的区别是镜像层之间共享数据的方法不同,overlay2存储驱动通过每层的lower文件,而overlay存储驱动通过硬链接

        验证分析overlay2存储驱动所实现的磁盘上的镜像层

(四)、容器使用overlay2存储驱动的读写机制

        1.读取文件

        文件同时存在于容器层和镜像层:将读取镜像层中的文件版本。

        文件已存在于容器层:如果该文件已存在于容器层中,而不在镜像层中,则直接从容器中读取。

        文件不存在于容器层:如果该文件并不在容器层中,则从镜像层中读取。

三、迁移docker根目录

    1. Docker根目录就是Docker中存放镜像和容器的目录,默认是/var/lib/docker。
    2. 解决Docker根目录所在的磁盘空间饱和问题通常采用Docker根目录迁移,这适合不同的Docker存储驱动。
    3. 停止Docker。
    4. 在一个可用空间足够大的磁盘或逻辑卷中创建新的Docker存储目录。
    5. 迁移/var/lib/docker目录下面的文件到 /home/docker/lib目录。
    6. 编辑Docker服务单元文件/usr/lib/systemd/system/docker.service,在[Service]节中的ExecStart定义语句末尾增加选项--graph=/home/docker/lib。
    7. 重新加载systemd单元文件。
    8. 重新启动Docker。
    9. 执行docker info命令查看当前Docker的信息。

四、docker存储的挂载类型

  1.docker卷与存储驱动

2.选择合适的挂载类型

  1. docker run命令的存储配置基本用法
    1. 通常使用docker run或docker create命令的相关选项来设置容器的卷或绑定挂载。
    2. -v(--volume)选项用于独立容器,而--mount选项用于集群服务。
    3. 对于tmpfs挂载,可以使用--tmpfs选项。
    4. 在Docker 17.06或更高版本中,建议对于所有的容器或服务,绑定挂载、卷或tmpfs挂载都使用--mount选项。
    5. --mount与-v两者最大的不同在于-v的用法是将所有选项组合在一个字段中,而--mount的用法是将它们分开。

五、开发docker镜像

一、了解dockerfile

1.Dockerfile是由一系列指令和参数构成的脚本文件,每一条指令构建一层。

2.镜像的定制实际上就是定制每一层所要添加的配置和文件。

3.Dockerfile的格式:

        # Comment

        INSTRUCTION arguments

4.INSTRUCTION表示指令,不区分大小写,建议大写。arguments表示指令的参数。

5.Dockerfile文件必须以FROM指令开头,定义构建镜像的基础镜像。

6.以“#”符号开头的行都将被视为注释。

7.Docker可使用解析器指令escape设置转义字符。

二、dockerfile常用指令

1.FROM——设置基础镜像

FROM指令的用法有以下3种格式:

        FROM <image> [AS <name>]

        FROM <image>[:<tag>] [AS <name>]

        FROM <image>[@<digest>] [AS <name>]

2.RUN指令——运行命令

RUN指令的用法有以下两种格式:

        RUN <command>

        RUN ["executable", "param1", "param2"]

3.CMD指令——指定容器启动时默认执行的命令

CMD指令的用法有以下3种格式:

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD command param1 param2

4.LABEL指令——向镜像添加标记(元数据)

LABEL指令的语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

5.EXPOSE指令——声明容器运行时侦听的网络端口

EXPOSE指令的语法格式如下:

EXPOSE <port> [<port>...]

6.ENV指令——指定环境变量

ENV指令的用法有以下两种格式:

ENV <key> <value>

ENV <key>=<value> ...

7.COPY指令——将源文件复制到容器

COPY指令的用法有以下两种格式:

COPY [--chown=<user>:<group>] <src>... <dest>

COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

8.ADD指令——将源文件复制到容器

ADD指令的用法有以下两种格式:

ADD [--chown=<user>:<group>] <src>... <dest>

ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

9.ENTRYPOINT指令——配置容器的默认入口

ENTRYPOINT指令的用法有以下两种格式:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2

10.VOLUME指令——创建挂载点

VOLUME指令的语法格式如下:

VOLUME ["/data"]

11.WORKDIR指令——配置工作目录

WORKDIR指令的语法格式如下:

WORKDIR /path/to/workdir

12.USER指令——设置运行镜像时使用的用户名

USER指令的用法有以下两种格式:

USER <user>[:<group>] or

USER <UID>[:<GID>]

13.ARG指令——定义变量

ARG指令的语法格式如下:

ARG <name>[=<default value>]

14.SHELL指令——指定命令的shell格式

SHELL指令的语法格式如下:

SHELL ["executable", "parameters"]

三、dockerflie示例

  示例一:基本的nginx镜像

示例二:基于VNC的Firefox镜像

示例三:一个Dockerfile定义多个镜像

示例四:参考docker官方镜像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值