我想列出已装入卷的所有容器目录。
即。能够得到我从
获得的类似信息docker inspect --format "{{ .Volumes }}" <self>
但是从容器内部并没有安装docker
。
我尝试了cat /proc/mounts
,但我找不到合适的过滤器。
答案 0 :(得分: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 :(得分:1)
正如您可以从许多评论中读到的那样,容器最初只是一个受限制的,保留的资源部分,完全与您机器的其他部分隔离开来。它不知道是一个Docker,并且在容器内部的一切行为都好像它是一个单独的机器。有点像矩阵,我想;)
您可以访问主机的内核及其资源,但又被限制为仅过滤掉的设置。这是通过令人敬畏的&#34; cgroups&#34; Unix / Linux内核附带的功能。
现在好消息:您可以通过多种方式向Docker提供信息,但这是您必须自己提供和构建的。
最简单的广告最强大的方法是将位于/var/run/docker.sock
主机上的Unix套接字安装到同一位置的容器内部。这样,当您在容器内使用Docker客户端时,您就直接与主机上的docker引擎进行通信。
然而,强大的力量带来了巨大的责任。这是一个很好的设置,但它不是很安全。一旦有人设法进入您的docker,它就可以通过这种方式访问您的主机系统。
更好的方法是通过环境设置提供安装列表,或者依靠一些已制定的约定来预测安装。
(你是否意识到有一个安装参数,为你的Docker中的挂载提供一个别名?)
答案 2 :(得分:0)
docker exec
命令可能就是你要找的。 p>
这将允许您在现有容器中运行任意命令。
例如:
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选项可以多次指定,它采用由选项名称及其值组成的键值对。
答案 3 :(得分: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