如何从容器中列出Docker挂载的卷

问题描述 投票:12回答:4

我想列出已装入卷的所有容器目录。

即能够得到我得到的类似信息

docker inspect --format "{{ .Volumes }}" <self>

但是从容器内部并没有安装docker

我试过cat /proc/mounts,但我找不到合适的过滤器。

docker mount inspect
4个回答
2
投票

如果您的Docker主机是OS X,则安装的卷将是osxfs(或fuse.osxfs)类型。你可以跑一个

mount | grep osxfs | awk '{print $3}'

并获取所有已安装卷的列表。

如果您的Docker主机是Linux(至少是Ubuntu 14+,可能是其他主机),则卷看起来都在/dev上,但不在容器的/dev文件系统中的设备上。卷将与/etc/resolv.conf/etc/hostname/etc/hosts并列。如果你启动mount | grep ^/dev,然后过滤掉ls /dev/*中的任何文件,然后过滤掉上面列出的三个文件,你应该留下主机卷。

mount | grep ^/dev/ | grep -v /etc | awk '{print $3}'

我的猜测是从Linux到Linux的细节可能有所不同。不理想,但至少有可能搞清楚。


1
投票

正如您可以从许多评论中读到的那样,容器最初只是一个受限制的,保留的资源部分,完全与您机器的其余部分隔离开来。它不知道是一个Docker,并且在容器内部的一切行为都好像它是一个单独的机器。有点像矩阵,我想;)

您可以访问主机的内核及其资源,但又被限制为仅过滤掉的集合。这是通过Unix / Linux内核附带的令人敬畏的“cgroups”功能完成的。

现在好消息:您可以通过多种方式向Docker提供信息,但这是您必须自己提供和构建的内容。

最简单的广告最强大的方法是将位于/var/run/docker.sock主机上的Unix套接字安装到同一位置的容器内部。这样,当您在容器内使用Docker客户端时,您将直接与主机上的docker引擎通信。

然而,强大的力量带来了巨大的责任。这是一个很好的设置,但它不是很安全。一旦有人设法进入您的docker,它就可以通过这种方式访问​​您的主机系统。

更好的方法是通过环境设置提供安装列表,或者依靠一些已制定的约定来预测安装。

(你是否意识到有一个安装参数,为你的Docker中的挂载提供一个别名?)


0
投票

docker exec命令可能就是你要找的东西。

这将允许您在现有容器内运行任意命令。

例如:

docker exec -it <mycontainer> bash

当然,您运行的任何命令都必须存在于容器文件系统中。

#docker  cp  >>>> Copy files/folders between a container and the local filesystem
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

复制完整文件夹:

docker cp ./src/build b081dbbb679b:/usr/share/nginx/html

注意 - 这将复制容器的... / nginx / html /目录中的构建目录,以仅复制文件夹中存在的文件:

docker cp ./src/build/ b081dbbb679b:/usr/share/nginx/html

注意 - 这将复制容器的…./nginx/html/ directory中的构建目录的内容

Docker存储选项:

卷存储在由Docker管理的主机文件系统的一部分中(Linux上的/ var / lib / docker / volumes /)。非Docker进程不应修改文件系统的这一部分。卷是在Docker中保留数据的最佳方式。

创建卷时,它存储在Docker主机上的目录中。将卷装入容器时,此目录是装入容器的目录。这类似于绑定挂载的工作方式,除了卷由Docker管理并与主机的核心功能隔离。

给定的体积可以同时安装到多个容器中。当没有正在运行的容器正在使用卷时,该卷仍可供Docker使用,并且不会自动删除。您可以使用docker volume prune删除未使用的卷。

装入卷时,可能会命名或匿名。匿名卷在首次装入容器时未给出明确的名称,因此Docker为它们提供了一个随机名称,该名称在给定的Docker主机中保证是唯一的。除名称外,命名和匿名卷的行为方式相同。

卷还支持使用卷驱动程序,这些驱动程序允许您将数据存储在远程主机或云提供程序上,以及其他可能性。

绑定挂载可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时修改它们。自Docker早期开始供货。与卷相比,绑定装载具有有限的功能。使用绑定装入时,主机上的文件或目录将装入容器中。文件或目录由主机上的完整路径引用。该文件或目录不需要已存在于Docker主机上。如果它尚不存在,则按需创建。绑定安装非常高效,但它们依赖于具有特定目录结构的主机文件系统。如果您正在开发新的Docker应用程序,请考虑使用命名卷。您无法使用Docker CLI命令直接管理绑定装入。

使用绑定装入的一个副作用,无论好坏,都可以通过容器中运行的进程更改主机文件系统,包括创建,修改或删除重要的系统文件或目录。这是一种强大的功能,可能会产生安全隐患,包括影响主机系统上的非Docker进程。

tmpfs挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。

磁盘上没有持久存储tmpfs挂载,无论是在Docker主机上还是在容器中。它可以在容器的生命周期中由容器使用,以存储非持久状态或敏感信息。例如,在内部,swarm服务使用tmpfs挂载将秘密挂载到服务的容器中。

如果需要指定卷驱动程序选项,则必须使用--mount。 -v或--volume:由三个字段组成,用冒号字符(:)分隔。字段必须按正确的顺序排列,并且每个字段的含义不是很明显。 o对于命名卷,第一个字段是卷的名称,在给定主机上是唯一的。对于匿名卷,省略第一个字段。 o第二个字段是文件或目录将在容器中装入的路径。 o第三个字段是可选的,是逗号分隔的选项列表,例如ro。这些选项将在下面讨论。 •--mount:由多个键值对组成,用逗号分隔,每个键组由a =元组组成。 --mount语法比-v或--volume更冗长,但键的顺序并不重要,并且标志的值更容易理解。 o mount的类型,可以是bind,volume或tmpfs。本主题讨论卷,因此类型将始终为卷。 o山的来源。对于命名卷,这是卷的名称。对于匿名卷,省略此字段。可以指定为source或src。 o目标将文件或目录将在容器中装入的路径作为其值。可以指定为destination,dst或target。 o readonly选项(如果存在)使绑定装入以只读方式装入容器中。 o volume-opt选项可以多次指定,它采用由选项名称及其值组成的键值对。


0
投票

假设您要检查从基于Linux的容器中装入的卷,您可以在/ etc / mtab中查找以“/ dev”开头的条目,删除/ etc条目

$ grep "^/dev" /etc/mtab | grep -v " \/etc/"

/dev/nvme0n1p1 /var/www/site1 ext4 rw,relatime,discard,data=ordered 0 0
/dev/nvme0n1p1 /var/www/site2 ext4 rw,relatime,discard,data=ordered 0 0
© www.soinside.com 2019 - 2024. All rights reserved.