内容简介:历史系列:
1. 概述
github项目地址: https://github.com/superwujc
尊重原创,欢迎转载,注明出处: https://my.oschina.net/superwjc/blog/3043665
历史系列:
docker CE on Linux示例浅析(一)安装与基本运行
docker对容器采用分层式(layer)管理,运行中的容器包括若干位于底部的镜像层与一个位于顶部的容器层。镜像层在构建完成时确定,属性为只读,内容始终保持不变;容器层在容器启动时添加,属性为读写,内容随运行而变化。默认情况下,容器中发生的所有文件变更仅影响当前容器自身的可写层,且可写层中的数据会随容器的移除而永久丢失。
docker提供了以下3种方式,将宿主机上的文件/目录挂载到容器,而容器则将需要保留的数据写入到挂载点而非可写层,以实现容器数据的持久化与共享功能:
- 数据卷(data volume)
- 绑定挂载(bind mount)
- Linux特有的临时文件系统(tmpfs)
这3种挂载类型都在容器启动时指定,对应的命令为docker run。在早期的 docker 版本中,数据卷与绑定挂载由-v/--volume选项指定,tmpfs由--tmpfs选项指定;自17.06开始,3种类型可由统一的--mount选项指定。docker官方文档中推荐使用后者。
--mount选项的参数由一系列逗号分隔的无序键值对与标志组成,主要包括:
- 挂载类型,由type指定,值为volume/bind/tmpfs,分别对应于以上3种持久化方式。若未指定type,则默认为volume。
- 位于宿主机上的源路径,由source/src参数指定,值为文件名或目录名。
- 位于运行容器上的目标路径,由destination/dst/target指定,值为文件名/目录名。
- 只读属性,由ro/readonly标志指定,将源路径以只读方式挂载至目标路径。
- 其他特定于操作系统平台与文件系统类型的可配置挂载选项,如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/
以上所述就是小编给大家介绍的《docker CE on Linux示例浅析(二)数据存储与持久化 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法交易:制胜策略与原理
[美]欧内斯特·陈(Ernest P. Chan) / 高闻酉、黄蕊 / 机械工业出版社 / 49.00
本书是一本引人入胜、信息量大、覆盖各类交易策略的图书。无论个人投资者,还是机构投资者,都可以借鉴和使用其中的策略。本书中的策略大致可分为均值回归系统和动量系统两大类。书中不仅介绍了如何使用每种类别的交易策略,更解释了各种策略之所以有效的原因。本书始终以简单、线性的交易策略为重心,因为复杂的交易策略容易受到过度拟合及数据窥探的侵害。数学和软件是算法交易的两条腿。本书用到了一定程度的数学知识,使其对各......一起来看看 《算法交易:制胜策略与原理》 这本书的介绍吧!