Docker镜像存储在主机上的哪个位置?

1027

我找到了目录 /var/lib/docker/containers 下的容器,但是无法找到镜像。

/var/lib/docker 下有哪些目录和文件?


5
在这种情况下,最好在问题标题和/或问题陈述中具体说明操作系统。有两个关于Linux和macOS(Mac OS X)的好答案已经提供了。 - Webel IT Australia - upvoter
31个回答

715

/var/lib/docker目录的内容取决于Docker用于存储的驱动程序。默认情况下,这将是aufs,但可以根据您的内核支持回退到overlayoverlay2btrfsdevicemapperzfs。在大多数情况下,这将是aufs,但RedHats选择了devicemapper

您可以使用-s--storage-driver=选项手动设置存储驱动程序,以便应用于Docker守护程序

  • /var/lib/docker/{driver-name}将包含图像内容的特定于驱动程序的存储。
  • /var/lib/docker/graph/<id>现在仅包含关于图像的元数据,以jsonlayersize文件形式存储。

对于aufs

  • /var/lib/docker/aufs/diff/<id>包含图像的文件内容。
  • /var/lib/docker/repositories-aufs是一个包含本地镜像信息的JSON文件。可以使用docker images命令查看此文件。

对于devicemapper

  • /var/lib/docker/devicemapper/devicemapper/data 存储镜像
  • /var/lib/docker/devicemapper/devicemapper/metadata 存储元数据
  • 请注意,这些文件是"稀疏"文件,因此占用的空间不如它们看起来的那么大。

2
我能通过某种方式将其挂载以查看内部内容吗? - r.v
1
如果在存储驱动程序已经运行并且有一些正在运行的容器和镜像的情况下设置存储驱动程序,那么它会在下次守护进程重启时迁移数据吗?如果不是这样,那么在这种情况下如何修改存储驱动程序? - BTR Naidu
8
对于MacOS,请查看下面的答案。 - ProfNandaa
143
请自行努力,不要“检查默认设置”。使用 docker info 命令找到实际位置,特定于您的设置。请注意保持原意并使句子通俗易懂。 - Bruno Bronosky
11
似乎有所改变。我正在使用Docker for Mac,其中有2个大小为1.5 GB的镜像,但/var/lib目录中没有docker文件夹。 - miguelmorin
显示剩余7条评论

325

在使用 Docker for Mac 应用程序时,似乎容器存储在位于以下位置的虚拟机中:

~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

更新(感谢mmorin):

截至2019年1月15日,似乎只有这个文件:

~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

它包含了Docker磁盘和其中所有的镜像和容器。


8
这个位置是用于所有镜像(例如 ubuntunginx)还是所有容器?原始问题询问的是镜像,而不是容器 - Siu Ching Pong -Asuka Kenji-
2
如果您记得Docker仍在虚拟机中运行,则系统路径是相对于虚拟机而不是Mac Osx系统的。尝试此命令:docker run --rm -it -v /:/vm-root alpine:edge ls -l /vm-root,然后执行:docker run --rm -it -v /:/vm-root alpine:edge ls -l /vm-root/var/lib/docker,您可以从WM主机列出docker文件夹。 - user1842947
4
这似乎有所改变。我正在使用Docker for Mac,有两个大小为1.5 GB的镜像,而~/Library/Containers/Data/com.docker.docker/Data目录下没有com.docker.driver.amd64-linux目录,唯一的大文件位于vms/0/Docker.raw,大小为3.6 GB。 - miguelmorin
2
使用qcow2或raw取决于您是否在MacOS High Sierra与APFS或以下版本:https://docs.docker.com/docker-for-mac/faqs/#disk-usage - Peter
1
对于 Docker Desktop 的 2.1.0.4 版本,位置略有不同(额外的 data):〜/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw - Alex Martian
显示剩余2条评论

142

实际上,Docker镜像是存储在两个文件中的,如下命令所示

$ docker info

数据文件: /var/lib/docker/devicemapper/devicemapper/data 元数据文件: /var/lib/docker/devicemapper/devicemapper/metadata

4
这是针对RedHat变体的。他们选择不采用AUFS,因为它不在主线内核中。 - Matt
17
抱歉,不幸的是,这两行 "(Meta)data file" 并不会在每个 Docker 中出现。它取决于所使用的驱动程序。 - Orabîg
13
一个恰当的回答不是“这是在我的机器上的位置”,而是“以下是如何在你的机器上找到它”。这才是一个合适的回答。我加入了一家公司,有11个不同的EBS卷满载着docker镜像。这个回答帮助我找出了哪个是当前的“根目录”。 - Bruno Bronosky
1
在Mac OS X上(至少在Yosemite版本上,该版本已经与Docker EOL),docker info非常有用,但输出Docker Root Dir: /var/lib/docker并未指示镜像存储位置(请参见上面的针对Mac的答案)。 - Webel IT Australia - upvoter
2
我在MacOS Catalina 10.15上的docker info中没有看到所述的属性。 - F.S.
显示剩余3条评论

128

这是旧的做法,现在已经改变了。截至2019年,请忽略此答案。

在Mac OS X或Windows的特殊情况下,使用boot2docker时,您的Docker镜像存储在由boot2docker管理的VirtualBox VM中。

这个VM将存储在VirtualBox映像的正常位置:

      OS X: ~/VirtualBox VMs/boot2docker-vm

      Windows: %USERPROFILE%/VirtualBox VMs/boot2docker-vm

您可以通过运行以下命令来重置它(警告:这将销毁您到目前为止构建和下载的所有镜像):

boot2docker down
boot2docker destroy
boot2docker init
boot2docker up

如果您在构建/调试构建时保留了大量中间图像,而没有使用有用的--rm选项,那么这将特别有用。我在此引用它们供参考:

使用:

docker build -t webapp --rm=true --force-rm=true .

替代:

docker build -t webapp .

17
在Windows 10上新安装了Docker后,我确认第一次单击Docker Quickstart终端快捷方式会创建一个名为“default”的虚拟机(在几次不成功的尝试后 - 请一直运行它,直到它正常工作)。可以在Windows的以下位置找到这个“default”虚拟机:%USERPROFILE%\.docker\machine\machines(请注意路径中的句点) - AnotherLongUsername
6
在更新的版本中,boot2docker 现在被称为 docker-machine。请参考 https://docs.docker.com/machine/migrate-to-machine/。 - khylo
3
可以更改那个位置吗? - dhblah
14
答案已经不适用于Windows 10了。相反,请参考@tristan的新答案,其中引用了C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.vhdx - aaronsteers
5
"%USERPROFILE%.docker" 仍然适用于 Windows 7 环境设置。 - RMorrisey
显示剩余3条评论

77

在最新发布的“Docker for Windows”中,使用Hyper-V技术,数据存储在Docker虚拟硬盘中:

C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.vhdx

您还可以打开“Hyper-V管理器”来访问Docker/MobyLinuxVM。


15
对于我来说,Windows 10周年更新版上的Docker将镜像文件放在C:\ ProgramData \ docker \ windowsfilter中。更多信息请参见:https://dev59.com/8F0a5IYBdhLWcg3wFlRH#39971954。 - Johnny Oshika
1
'Hyper-V 管理器' 是答案! - Reza
我没有Hyper V,而是使用Docker Toolbox.. 你知道虚拟磁盘在哪里吗? - S A
我有一个文件在 C:\Users\UserName\AppData\Local\Docker\wsl\data\ext4.vhdx,大小为1.6GB(和 \Docker\wsl\distro\ext4.vhdx 105MB)。不确定是否是镜像。(我没有使用Hyper-V,而是WSL 2。)(我尝试了许多其他答案,例如像 var/lib/dockeroverlay2DockerDesktop 这样的文件夹位置,但这些文件夹要么不存在,要么不包含图像文件,在我的Windows操作系统中。虽然 $ docker info 显示 Storage Driver: overlay2;并且 $ docker inspect container_id 显示 "MergedDir": "/var/lib/docker/overlay2/4zxxxxxxpb/merged"。但我不知道为什么。) - Nor.Z

75
图像存储在/var/lib/docker/graph/<id>/layer中。
注意,图像只是与父级图像不同的部分。 父ID与图像的元数据一起存储在/var/lib/docker/graph/<id>/json中。
当您docker run一个图像时,AUFS会将所有层合并为一个可用的文件系统。

12
这个回答现在已经过时了,他们把东西挪动了。 - Air
7
@Air 你能发布一下移动了什么吗? - Elijah Lynn
1
不再有图形文件夹了。 - Vadim

60
在Ubuntu上,你可以通过运行以下命令来“玩弄”图像:
sudo baobab /var/lib/docker

实际上,图像存储在/var/lib/docker/aufs/diff中。

显示磁盘分析工具Baobab正在/var/lib/docker上运行的屏幕截图


确实不错。在 Mac 上可以使用 DaisyDisk(轮式显示),GrandPerspective 也很有用(矩形)。 - Webel IT Australia - upvoter
似乎这是唯一可靠的找到它的方法。 - Alexandr

51

对于使用 Docker 工具箱(使用 docker-machine)的用户而言,关于在 Mac OS X 上使用 boot2docker 的答案已经不再适用。Docker-machine 虚拟机被称为 "default",它存在于 /Users/<username>/.docker/machine/machines/default/ 目录中。


3
我在那个目录里找不到任何容器或镜像文件夹。 - lvarayut
3
请在该目录下寻找名为disk.vmdk的文件。 - lukeaus
1
$docker images -a 命令返回大约1GB的镜像,而位于~/.docker下的disk.vmdk文件却有20GB。这是怎么回事? - Grav
它在Windows中存储在哪里? - Shreyas
@Grav:虚拟机分配了20GB的空间供未来使用,但仅使用1GB用于图像。 - primavera133
所以在我的情况下,下载的图像存储在disk.vmdk文件中(我使用的是Mac OSX + VirtualBox)。销毁此VB机器并删除其文件将同时删除所有图像。 - jkulak

24
在本地 Windows 版的 Docker 中,默认的容器存储位置为:
   > docker info
   ...
   Docker Root Dir: C:\ProgramData\Docker
   ...

我运行了 docker build 命令,但是我没有看到我认为是镜像文件的文件。我看到一些文件夹和一些文本文件(例如 service.txt)。docker build 创建什么类型的文件以及使用什么文件扩展名? - user3731622
它不在那里。 - akash maurya
@akashmaurya 你运行了 docker info 吗? - Tormod Haugene

23
如果您使用Docker for MAC(不是boot2docker),则位置为/Users/<</>UserName></>/Library/Containers/com.docker.docker/Data/

是的,当我执行了以下命令:jasper@~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux $ ls -lh | grep Docker -rw-r--r--@ 1 jasper staff 6.3G May 25 19:20 Docker.qcow2 我找到了镜像。但那不是容器。实际上在这个Data目录中并没有看到它们。 - rhand
1
但正如在此处 https://dev59.com/PGIk5IYBdhLWcg3we-L5#37642236 中所述,容器位于此图像内部。 - rhand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接