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

栏目: 编程工具 · 发布时间: 5年前

内容简介:历史系列:

1. 概述

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选项等。

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

1.1 - 数据卷

数据卷是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),可实现网络挂载等功能。

1.2 - 绑定挂载

绑定挂载在功能方面类似于 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,以设置多个容器挂载同一源路径时的文件可见性。

1.3 - tmpfs

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

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

2. 示例

系统与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 ~]#

3. 参考

https://docs.docker.com/storage/

https://docs.docker.com/storage/volumes/

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

https://docs.docker.com/storage/tmpfs/


以上所述就是小编给大家介绍的《docker CE on Linux示例浅析(二)数据存储与持久化 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Advanced Web Metrics with Google Analytics, 2nd Edition

Advanced Web Metrics with Google Analytics, 2nd Edition

Brian Clifton / Sybex / 2010-3-15 / USD 39.99

Valuable tips and tricks for using the latest version of Google Analytics Packed with insider tips and tricks, this how-to guide is fully revised to cover the latest version of Google Analytics and sh......一起来看看 《Advanced Web Metrics with Google Analytics, 2nd Edition》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具