Docker容器数据管理概览:
其中卷(Volume)和绑定挂载文件(Bind Mount)是持久化的,临时文件挂载(Tmpfs Mount)是非持久化的;
默认情况下,在容器内创建的所有文件都存储在容器读写层
上,这意味着:
存储驱动程序使用Linux内核提供联合文件系统( Union Filesystem);
与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能;
Docker提供了两个选项:卷(Volume)和绑定挂载文件(Bind Mounts),来将文件存储在主机中,以便容器停止后文件也可以持久存储;
绑定挂载文件(Bind Mount)可以存储在主机系统上的任何位置,甚至可能是重要的系统文件或目录;
Docker主机或Docker容器上的非Docker进程可以随时对其进行修改;
最初
-vor
,--volume
标志用于独立容器,而--mount
标志用于集群服务;
但是,从Docker 17.06开始,可以使用--mount
独立容器;
--mount
是更明确和冗长的,最大的区别是该-v
语法将所有选项合并在一个字段中,而--mount
语法将它们分开;
使用-v
或--volume
命令,以冒号(:)分隔,这些字段必须以正确的顺序排列;
--mount
:由多个键值对组成,这些键值对之间用逗号分隔,每个键值对都由一个元组组成;
=
type
:可以是bind
,volume
或tmpfs
,本段此类型始终为bind
;
source
:这是Docker守护程序主机上文件或目录的路径;
destination|dst|target
:可以指定为source
或src
的destination
作为其值,其中的文件或目录被安装在容器的路径;
readonly
:会使绑定安装以只读方式安装到容器中;
bind-propagation
:将更改绑定传播,可以是rprivate
,private
,rshared
,shared
,rslave
,slave
;
consistency
:如果存在,可以是一种consistent
,delegated
或cached
,此设置仅适用于Mac的Docker桌面,其他平台上将被忽略;
创建一个index.html
,将其路径挂在到nginx容器中,运行容器,访问index:
/Users/admin/localData
和index.html
,查看 index.html
中内容为:Hello Weisonbind-mount-nginx
,暴露端口10086
映射其80
端口,将容器/usr/share/nginx/html
路径挂载至宿主机/Users/admin/localData
bind-mount-nginx
内,打开/usr/share/nginx/html
,查看index.html
,其内容与宿主机index.html
内容一致localhost:10086
查看 index.html
执行
docker inspect bind-mount-nginx
可以看到有关容器数据挂载相关的信息:
启动容器时,在挂载选项
-v
后再接上:ro
可声明为只读挂载
在保证安全性的前提下,有几种常见场景非常适合使用这种挂载方式:
tmpfs挂载仅存储在主机系统的内存中,且永远不会写入主机系统的文件系统中,特征就是临时性挂载,只能在Linux上使用;
与挂载宿主操作系统目录或文件不同,挂载临时文件目录要通过 --tmpfs 这个选项来完成。由于内存的具体位置不需要我们来指定,这个选项里我们只需要传递挂载到容器内的目录即可。
–tmpfs:挂载tmpfs挂载而不允许您指定任何可配置的选项,并且只能与独立容器一起使用;
tmpfs-size
:tmpfs安装的大小(以字节为单位),默认情况下不受限制;
tmpfs-mode
:tmpfs的文件模式(八进制),例如700或0770。默认为1777或可全局写入;
–mount:独立容器和群集服务都可使用,语法比–tmpfs更详细
type
:可以是bind
,volume
或tmpfs
,本段此类型始终为tmpfs
;
destination|dst|target
:指定路径被安装在容器中;
执行命令:
#--mount
docker run -d -it --name tmpfs-mount-nginx --mount type=tmpfs,destination=/app nginx
#--tmpfs
docker run -d -it --name tmpfs-tmpfs-nginx --tmpfs /app nginx
以下场景非常适合使用这种挂载方式:
卷(Volume):从宿主操作系统中挂载目录到容器内,这个挂载的目录由 Docker 进行管理(/var/lib/docker/volumes/在Linux上);
我们只需要指定容器内的目录,不需要关心具体挂载到了宿主操作系统中的哪里;
非Docker进程不应修改文件系统的这一部分,所以卷是在Docker中持久保存数据的最佳方法;
卷通常是更好的选择,因为卷不会增加使用卷的容器的大小,并且卷的内容存在于给定容器的生命周期之外
与绑定安装相比,卷具有几个优点:
与绑定安装相比,卷更易于备份或迁移。
您可以使用Docker CLI命令或Docker API管理卷。
卷在Linux和Windows容器上均可工作。
可以在多个容器之间更安全地共享卷。
卷驱动程序使您可以将卷存储在远程主机或云提供程序上,以加密卷内容或添加其他功能。
可以通过容器预先填充新卷的内容。
使用-v
或--volume
命令,以冒号(:)分隔,这些字段必须以正确的顺序排列;
--mount
:由多个键值对组成,这些键值对之间用逗号分隔,每个键值对都由一个元组组成;
=
type
:可以是bind
,volume
或tmpfs
,本段此类型始终为volume
;
source
:这是Docker守护程序主机上文件或目录的路径;
destination|dst|target
:可以指定为source
或src
的destination
作为其值,其中的文件或目录被安装在容器的路径;
readonly
:会使绑定安装以只读方式安装到容器中;
bind-propagation
:将更改绑定传播,可以是rprivate
,private
,rshared
,shared
,rslave
,slave
;
consistency
:如果存在,可以是一种consistent
,delegated
或cached
,此设置仅适用于Mac的Docker桌面,其他平台上将被忽略;
使用docker volume create
命令显式创建卷,或者在容器或服务创建期间创建卷,可以命名为或匿名:
使用docker volume rm删除卷,可以使用删除未使用的卷docker volume prune:
已两种方式使用数据卷:
#--mount
docker run -d --name volume-mount-nginx --mount source=local-volume,target=/app nginx
#-v
docker run -d --name volume-v-nginx -v local-volume:/app nginx
#查看容器卷信息
docker inspect volume-mount-nginx
https://docs.docker.com/storage/volumes/
参考:
[ 1 ]. https://docs.docker.com/storage/
[ 2 ]. https://juejin.im/book/5b7ba116e51d4556f30b476c