docker CE on Linux示例浅析(二)数据存储与持久化

服务器

浏览数:30

2020-6-8

AD:资源代下载服务

概述

github项目地址:https://github.com/superwujc

尊重原创,欢迎转载,注明出处:https://my.oschina.net/superwjc/blog/3043665

历史系列:

docker CE on Linux示例浅析(一)安装与基本运行

    docker对容器采用分层式(layer)管理,运行中的容器包括若干位于底部的镜像层与一个位于顶部的容器层。镜像层在构建完成时确定,属性为只读,内容始终保持不变;容器层在容器启动时添加,属性为读写,内容随运行而变化。默认情况下,容器中发生的所有文件变更仅影响当前容器自身的可写层,且可写层中的数据会随容器的移除而永久丢失。

    docker提供了以下3种方式,将宿主机上的文件/目录挂载到容器,而容器则将需要保留的数据写入到挂载点而非可写层,以实现容器数据的持久化与共享功能:

  1. 数据卷(data volume)
  2. 绑定挂载(bind mount)
  3. Linux特有的临时文件系统(tmpfs)

    这3种挂载类型都在容器启动时指定,对应的命令为docker run。在早期的docker版本中,数据卷与绑定挂载由-v/–volume选项指定,tmpfs由–tmpfs选项指定;自17.06开始,3种类型可由统一的–mount选项指定。docker官方文档中推荐使用后者。

    –mount选项的参数由一系列逗号分隔的无序键值对与标志组成,主要包括:

  1. 挂载类型,由type指定,值为volume/bind/tmpfs,分别对应于以上3种持久化方式。若未指定type,则默认为volume。
  2. 位于宿主机上的源路径,由source/src参数指定,值为文件名或目录名。
  3. 位于运行容器上的目标路径,由destination/dst/target指定,值为文件名/目录名。
  4. 只读属性,由ro/readonly标志指定,将源路径以只读方式挂载至目标路径。
  5. 其他特定于操作系统平台与文件系统类型的可配置挂载选项,如mac桌面版的consistency选项,数据卷方式的volume-opt选项,绑定挂载方式的bind-propagation选项,以及tmpfs方式的tmpfs-type与tmpfs-mode选项等。

    数据卷与绑定挂载的源路径在形式上为磁盘文件,可用于保留容器中的应用产生的数据;临时文件系统则为宿主机内存文件,可用于宿主机与容器之间交换临时敏感信息(如密码)。

数据卷

    数据卷是docker官方推荐使用的数据持久化方式,由docker主进程管理,对应的命令行接口为docker volume 子命令 [参数]

    数据卷是存储于宿主机上的目录,默认位于/var/lib/docker目录(该路径为可配置选项,由dockerd命令的–data-root选项或配置文件的data-root字段指定)下的volumes子目录中,每个卷对应一个唯一的目录名。宿主机可以通过访问该目录实现对数据卷的读写等操作。

    数据卷默认以读写模式挂载至容器目标路径,可通过–mount的ro/readonly标志指定以只读模式挂载。

    单个数据卷可以挂载至多个容器,单个容器可以挂载多个数据卷,多个挂载操作可以指定为不同的读写模式。

    若–mount的dst指定的目标挂载路径不存在,则将被自动创建。

    数据卷可以通过运行docker volume create [卷名] 命令手动创建,或随容器或服务的启动而自动创建。

    数据卷分为命名卷与匿名卷,命名卷的标识为显式指定,匿名卷的标识则由docker主进程分配:

  • 手动创建的数据卷的标识根据docker volume create命令的参数确定。若有参数,则手动创建命名卷;若无参数,则手动创建匿名卷。
  • 自动创建的数据卷的标识根据–mount的src参数确定。若有src参数且卷名不存在,则自动创建命名卷。若无src参数,或有src参数但未指定值,则自动创建匿名卷。
  • 匿名卷除无法指定只读挂载模式外,其他用法与命名卷相同。

    数据卷中,除当前目录(.)与上级目录(..)外,若另存在其他内容,则目标挂载路径下的所有内容(若有)都将被数据卷中的内容隐藏而不可见,且不可访问;若不存在其他内容,则目标挂载路径下的所有内容(若有)都将被复制到数据卷中,不论挂载方式是否为只读。

    数据卷另支持卷驱动(volume driver),可实现网络挂载等功能。

绑定挂载

    绑定挂载在功能方面类似于Linux内核提供的挂载功能,源挂载路径是位于宿主机上的文件/目录,通过绝对路径或相对路径进行引用;与之对比,数据卷是位于宿主机上的目录,通过命名或匿名的卷标识进行引用。

    绑定挂载依赖于宿主机上的目录树结构,因此源挂载路径必须存在(docker官方文档中对该点的描述疑似有误:The file or directory does not need to exist on the Docker host already. It is created on demand if it does not yet exist.),但目标路径不存在时将由docker主进程自动创建。

    无论源路径/目标路径是否为空,目标路径下的所有内容都会被源路径下的内容隐藏而不可见,且不可访问。

    绑定挂载同样支持设置读写模式,默认为可读与可写。

    单个源路径可以挂载至多个容器,单个容器可以挂载多个源路径,多个挂载操作可以指定为不同的读写模式。

    若–mount的dst指定的目标挂载路径不存在,则将被自动创建。

    绑定挂载支持以–mount的bind-propagation参数配置挂载行为,包括shared/slave/private/rshared/rslave/rprivate,默认值为rprivate。对于数据卷,该属性始终为默认值rprivate,且不可配置。

    绑定挂载支持在–mount中指定selinux标志z/Z,以设置多个容器挂载同一源路径时的文件可见性。

tmpfs

    tmpfs挂载是Linux系统特有的方式,仅可用于宿主机与虚拟机之间交换临时信息,无法用于容器之间的数据共享。

    tmpfs挂载支持以–mount的tmpfs-size/tmpfs-mode参数分别设置文件长度限制与访问权限。

示例

    系统与docker版本信息:

[root@localhost ~]# uname -r
3.10.0-957.10.1.el7.x86_64
[root@localhost ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.6.1810 (Core)
Release:	7.6.1810
Codename:	Core
[root@localhost ~]#
[root@localhost ~]# docker version
Client:
 Version:           18.09.5
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        e8ff056
 Built:             Thu Apr 11 04:43:34 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.5
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       e8ff056
  Built:            Thu Apr 11 04:13:40 2019
  OS/Arch:          linux/amd64
  Experimental:     false
[root@localhost ~]#

    从docker hub上拉取一份最新版centos系统官方镜像,示例中所有的容器均为该镜像的实例。

[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:latest
[root@localhost ~]#
[root@localhost ~]# docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9f38484d220f        6 weeks ago         202MB
[root@localhost ~]#

    手动创建命名卷v_0,并分别挂载至c_0容器的/mnt目录(读写模式)与c_1容器的/mnt_non_exists目录(只读模式)。不存在的目标挂载路径被自动创建,数据卷中发生的文件变更(本例中为创建临时文件)对宿主机与容器均可见,但容器无法对只读模式挂载的数据卷执行写入操作。 

-d/–detach:后台模式运行容器。
-i/–interactive:保持容器终端的交互式状态。
-t/–tty:为容器分配伪终端,用于输入与输出。

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
[root@localhost ~]# ll /var/lib/docker/volumes/
total 24
-rw------- 1 root root 32768 Apr 28 20:15 metadata.db
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker volume create v_0
v_0
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               v_0
[root@localhost ~]# ll /var/lib/docker/volumes/
total 24
-rw------- 1 root root 32768 Apr 28 20:15 metadata.db
drwxr-xr-x 3 root root    19 Apr 28 20:15 v_0
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name=c_0 --mount type=volume,src=v_0,dst=/mnt centos
f2bb88693faf6b716f879de0bc4ad99f9e0588dd3736dee0535d66ba314fcecb
[root@localhost ~]# docker run -dit --name c_1 --mount src=v_0,dst=/mnt_non_exists,ro centos
67d6a2473c2fafe6a19deaf281c51718f489dc386d1c6bd6c62c817e1aa06004
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
67d6a2473c2f        centos              "/bin/bash"         6 seconds ago       Up 6 seconds                            c_1
f2bb88693faf        centos              "/bin/bash"         35 seconds ago      Up 35 seconds                           c_0
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_0 mktemp -p /mnt tmplog.XXXXXX
/mnt/tmplog.MZ7IJ6
[root@localhost ~]# docker exec -it c_0 ls -l /mnt
total 0
-rw------- 1 root root 0 Apr 28 20:19 tmplog.MZ7IJ6
[root@localhost ~]# docker exec -it c_1 ls -l /mnt_non_exists
total 0
-rw------- 1 root root 0 Apr 28 20:19 tmplog.MZ7IJ6
[root@localhost ~]#
[root@localhost ~]# ll /var/lib/docker/volumes/v_0/_data/
total 0
-rw------- 1 root root 0 Apr 28 20:19 tmplog.MZ7IJ6
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo 'This is a test file' > /var/lib/docker/volumes/v_0/_data/tmplog.MZ7IJ6
[root@localhost ~]# docker exec -it c_0 cat /mnt/tmplog.MZ7IJ6
This is a test file
[root@localhost ~]# docker exec -it c_0 bash -c 'echo "Append a line" >> /mnt/tmplog.MZ7IJ6'
[root@localhost ~]# docker exec -it c_1 cat /mnt_non_exists/tmplog.MZ7IJ6
This is a test file
Append a line
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_1 bash -c 'echo "Append another line" >> /mnt_non_exists/tmplog.MZ7IJ6'
bash: /mnt_non_exists/tmplog.MZ7IJ6: Read-only file system
[root@localhost ~]#

    查看数据卷以及相应的挂载信息:

docker inspect 容器标识

docker volume inspect 卷标识

docker container inspect 容器标识

    Mounts块中列出挂载类型,源路径,目标路径,访问权限等信息。

[root@localhost ~]#
[root@localhost ~]# docker container inspect c_0 | sed -n '/Mounts/, /]/p'
            "Mounts": [
                {
                    "Type": "volume",
                    "Source": "v_0",
                    "Target": "/mnt"
                }
            ],
        "Mounts": [
            {
                "Type": "volume",
                "Name": "v_0",
                "Source": "/var/lib/docker/volumes/v_0/_data",
                "Destination": "/mnt",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@localhost ~]#

    将命名卷v_0挂载至c_2容器的/var/log目录。由于v_0非空(上一步骤中已创建文件),因此c_2容器/var/log中的内容被数据卷中的内容隐藏。 

[root@localhost ~]# docker exec -it c_0 ls -l /var/log
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name c_2 --mount src=v_0,dst=/var/log centos
961b45e6a784cca57c391401af89c90ca0c0b06b210909641c0f0f54eda834f8
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
961b45e6a784        centos              "/bin/bash"         5 seconds ago       Up 4 seconds                            c_2
67d6a2473c2f        centos              "/bin/bash"         15 minutes ago      Up 15 minutes                           c_1
f2bb88693faf        centos              "/bin/bash"         15 minutes ago      Up 15 minutes                           c_0
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_2 ls -l /var/log
total 4
-rw------- 1 root root 34 Apr 28 20:23 tmplog.MZ7IJ6
[root@localhost ~]#

    将数据卷v_0中的文件删除,然后以只读模式挂载至c_3容器的/var/log目录。由于v_0卷中除了当前目录(.)与上级目录(..)之外没有其他内容,因此c_3容器的/var/log下的所有文件与子目录被复制到v_0卷中,不受只读模式的限制,且所有挂载该卷的容器对文件变更均可见。

[root@localhost ~]# rm -rf /var/lib/docker/volumes/v_0/_data/*
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name c_3 --mount src=v_0,dst=/var/log,ro centos
20c2c796b48855caa937be7dca3a64328b53072cbea22c9e44b3dc917b1a7de0
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
20c2c796b488        centos              "/bin/bash"         5 seconds ago       Up 3 seconds                            c_3
961b45e6a784        centos              "/bin/bash"         6 minutes ago       Up 6 minutes                            c_2
67d6a2473c2f        centos              "/bin/bash"         21 minutes ago      Up 21 minutes                           c_1
f2bb88693faf        centos              "/bin/bash"         22 minutes ago      Up 22 minutes                           c_0
[root@localhost ~]#
[root@localhost ~]# ll /var/lib/docker/volumes/v_0/_data/
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_0 ls -l /mnt
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_1 ls -l /mnt_non_exists
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_2 ls -l /var/log
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_3 ls -l /var/log
total 32
-rw------- 1 root utmp     0 Mar  5 17:35 btmp
-rw-r--r-- 1 root root   193 Mar  5 17:35 grubby_prune_debug
-rw-r--r-- 1 root root 23944 Mar  5 17:35 lastlog
-rw------- 1 root root     0 Mar  5 17:34 tallylog
-rw-rw-r-- 1 root utmp     0 Mar  5 17:35 wtmp
-rw------- 1 root root  1365 Mar  5 17:36 yum.log
[root@localhost ~]#

    启动c_4容器并挂载自动创建的匿名卷,若指定只读模式挂载,则启动失败,报错信息“must not set ReadOnly mode when using anonymous volumes.

[root@localhost ~]# docker run -dit --name c_4 --mount dst=/mnt,ro centos
docker: Error response from daemon: invalid mount config for type "volume": must not set ReadOnly mode when using anonymous volumes.
See 'docker run --help'.
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name c_4 --mount dst=/mnt centos
0eed5a4c3fdc29578f7af0637f02cc243705845a26407f15a93d361d95ad2838
[root@localhost ~]#
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00
local               v_0
[root@localhost ~]#
[root@localhost ~]# docker container inspect c_4 | sed -n '/Mounts/, /]/p'
            "Mounts": [
                {
                    "Type": "volume",
                    "Target": "/mnt"
                }
            ],
        "Mounts": [
            {
                "Type": "volume",
                "Name": "715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00",
                "Source": "/var/lib/docker/volumes/715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00/_data",
                "Destination": "/mnt",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@localhost ~]#
[root@localhost ~]# mktemp -p /var/lib/docker/volumes/715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00/_data/ testfile.XXXXXX
/var/lib/docker/volumes/715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00/_data/testfile.MmZO3i
[root@localhost ~]#
[root@localhost ~]# docker exec -it c_4 ls -l /mnt
total 0
-rw------- 1 root root 0 Apr 28 20:48 testfile.MmZO3i
[root@localhost ~]#

    数据卷若被容器占用,则无法被移除,即使该容器处于未运行状态。

docker volume rm 卷标识:移除指定的未被容器挂载的卷

docker volume prune:移除所有未被容器挂载的卷

[root@localhost ~]# docker volume rm v_0
Error response from daemon: remove v_0: volume is in use - [67d6a2473c2fafe6a19deaf281c51718f489dc386d1c6bd6c62c817e1aa06004, 961b45e6a784cca57c391401af89c90ca0c0b06b210909641c0f0f54eda834f8, 20c2c796b48855caa937be7dca3a64328b53072cbea22c9e44b3dc917b1a7de0, f2bb88693faf6b716f879de0bc4ad99f9e0588dd3736dee0535d66ba314fcecb]
[root@localhost ~]#
[root@localhost ~]# docker volume rm -f v_0
Error response from daemon: remove v_0: volume is in use - [f2bb88693faf6b716f879de0bc4ad99f9e0588dd3736dee0535d66ba314fcecb, 67d6a2473c2fafe6a19deaf281c51718f489dc386d1c6bd6c62c817e1aa06004, 961b45e6a784cca57c391401af89c90ca0c0b06b210909641c0f0f54eda834f8, 20c2c796b48855caa937be7dca3a64328b53072cbea22c9e44b3dc917b1a7de0]
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0eed5a4c3fdc        centos              "/bin/bash"         7 minutes ago       Up 7 minutes                            c_4
20c2c796b488        centos              "/bin/bash"         15 minutes ago      Up 15 minutes                           c_3
961b45e6a784        centos              "/bin/bash"         21 minutes ago      Up 21 minutes                           c_2
67d6a2473c2f        centos              "/bin/bash"         36 minutes ago      Up 36 minutes                           c_1
f2bb88693faf        centos              "/bin/bash"         37 minutes ago      Up 37 minutes                           c_0
[root@localhost ~]#
[root@localhost ~]# docker container stop $(docker container ls -qa)
0eed5a4c3fdc
20c2c796b488
961b45e6a784
67d6a2473c2f
f2bb88693faf
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
0eed5a4c3fdc        centos              "/bin/bash"         7 minutes ago       Exited (137) 9 seconds ago                       c_4
20c2c796b488        centos              "/bin/bash"         15 minutes ago      Exited (137) 9 seconds ago                       c_3
961b45e6a784        centos              "/bin/bash"         21 minutes ago      Exited (137) 9 seconds ago                       c_2
67d6a2473c2f        centos              "/bin/bash"         37 minutes ago      Exited (137) 9 seconds ago                       c_1
f2bb88693faf        centos              "/bin/bash"         37 minutes ago      Exited (137) 9 seconds ago                       c_0
[root@localhost ~]#
[root@localhost ~]# docker volume rm v_0
Error response from daemon: remove v_0: volume is in use - [67d6a2473c2fafe6a19deaf281c51718f489dc386d1c6bd6c62c817e1aa06004, 961b45e6a784cca57c391401af89c90ca0c0b06b210909641c0f0f54eda834f8, 20c2c796b48855caa937be7dca3a64328b53072cbea22c9e44b3dc917b1a7de0, f2bb88693faf6b716f879de0bc4ad99f9e0588dd3736dee0535d66ba314fcecb]
[root@localhost ~]#
[root@localhost ~]# docker volume rm -f v_0
Error response from daemon: remove v_0: volume is in use - [f2bb88693faf6b716f879de0bc4ad99f9e0588dd3736dee0535d66ba314fcecb, 67d6a2473c2fafe6a19deaf281c51718f489dc386d1c6bd6c62c817e1aa06004, 961b45e6a784cca57c391401af89c90ca0c0b06b210909641c0f0f54eda834f8, 20c2c796b48855caa937be7dca3a64328b53072cbea22c9e44b3dc917b1a7de0]
[root@localhost ~]#
[root@localhost ~]# docker container rm $(docker container ls -qa)
0eed5a4c3fdc
20c2c796b488
961b45e6a784
67d6a2473c2f
f2bb88693faf
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]#
[root@localhost ~]# docker volume rm v_0
v_0
[root@localhost ~]#
[root@localhost ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
715442e844ae80494b29e956ff3b2db1eecd49f39c5bf89cad2f462fb5d96d00

Total reclaimed space: 0B
[root@localhost ~]#
[root@localhost ~]# ll /var/lib/docker/volumes/
total 24
-rw------- 1 root root 32768 Apr 28 20:56 metadata.db
[root@localhost ~]#
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
[root@localhost ~]#

    启动c_b容器并挂载一个不存在的本地源路径/mnt_non_exists,报错信息“bind source path does not exist

[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]#
[root@localhost ~]# ll /mnt_non_exists
ls: cannot access /mnt_non_exists: No such file or directory
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name c_b --mount type=bind,src=/mnt_non_exists,dst=/mnt centos
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /mnt_non_exists.
See 'docker run --help'.
[root@localhost ~]#
[root@localhost ~]# mkdir /mnt_non_exists
[root@localhost ~]#
[root@localhost ~]# docker run -dit --name c_b --mount type=bind,src=/mnt_non_exists,dst=/mnt centos
0d58626c0527ec1e7872967e2479fedef1825a47a45ad29b428b42f52c159a10
[root@localhost ~]#
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0d58626c0527        centos              "/bin/bash"         48 seconds ago      Up 47 seconds                           c_b
[root@localhost ~]#
[root@localhost ~]# docker container inspect c_b | sed -n '/Mounts/, /]/p'
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/mnt_non_exists",
                    "Target": "/mnt"
                }
            ],
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/mnt_non_exists",
                "Destination": "/mnt",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
[root@localhost ~]#

参考

https://docs.docker.com/storage/
https://docs.docker.com/storage/volumes/
https://docs.docker.com/storage/bind-mounts/
https://docs.docker.com/storage/tmpfs/

作者:摘下-满天星