目录

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

docker存储驱动程序 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主机上分为两个代表不同层次的目录,并且对外统一呈现为单个目录

docker存储驱动程序 docker 驱动_运维_02

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

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

docker存储驱动程序 docker 驱动_docker_03

(四)、容器使用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卷与存储驱动

docker存储驱动程序 docker 驱动_docker_04

2.选择合适的挂载类型

docker存储驱动程序 docker 驱动_docker存储驱动程序_05

  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镜像

docker存储驱动程序 docker 驱动_运维_06

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

docker存储驱动程序 docker 驱动_docker存储驱动程序_07

示例四:参考docker官方镜像

docker存储驱动程序 docker 驱动_docker存储驱动程序_08