Docker镜像存储在主机上的哪里?

我设法找到目录/var/lib/docker/containers下的容器,但我找不到图像。

/var/lib/docker下的目录和文件是什么?

1046999 次浏览

图像存储在/var/lib/docker/graph/<id>/layer中。

请注意,图像只是与父图像不同。父ID与图像的元数据/var/lib/docker/graph/<id>/json一起存储。

当您docker run图像时。AUFS将“合并”所有层到一个可用的文件系统中。

在Ubuntu上,您可以“玩”运行的图像

sudo baobab /var/lib/docker

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

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

这是旧的做法,现在已经改变了。从2019年开始忽略这个答案

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

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

OS X:~/VirtualBox VMs/boot2docker-vm

窗口:%USERPROFILE%/VirtualBox VMs/boot2docker-vm

您可以通过运行重置它(警告:这将销毁您迄今为止构建和下载的所有图像):

boot2docker downboot2docker destroyboot2docker initboot2docker up

如果在构建/调试构建时没有有用的--rm选项而保留大量中间图像,这尤其有用,我在这里引用它们以供参考:使用:

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

而不是:

docker build -t webapp .

/var/lib/docker目录的内容因Docker用于存储的驱动程序而异。

默认情况下,这将是aufs,但可以回退到overlayoverlay2btrfsdevicemapperzfs,具体取决于您的内核支持。在大多数情况下,这将是aufs,但RedHats去了#4

您可以手动将具有#0或#1选项的存储驱动程序设置为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元数据
  • 请注意,这些文件是精简配置的“稀疏”文件,因此并不像它们看起来那么大。

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

$ docker info

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

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

我在Mac OSX上使用boot2docker for Docker,因此图像存储在/Users/<USERNAME>/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vmdk中。

对于使用Docker工具箱(使用docker-Machine)的人来说,有关Mac OS X上boot2docker的答案无效。docker-Machine VM称为“默认”,它存在于/Users/<username>/.docker/machine/machines/default/目录中。

使用Docker for Mac Application时,容器似乎存储在位于以下位置的VM中:

~/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磁盘及其中的所有映像和容器。

在新发布的使用Hyper-V的“Docker for Windows”上,数据位于Docker虚拟硬盘中:

C:\用户\公共\文档\Hyper-V\虚拟硬盘\MobyLinuxVM.vhdx

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

在Docker for Windows中,日志在这里:%USERPROFILE%\AppData\Local\Docker

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

如回答这里,如果你在Mac上,它位于

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

docker for windows(本机Windows)中,默认容器存储位于:

   > docker info...Docker Root Dir: C:\ProgramData\Docker...

我只能为Ubuntu用户回答这个问题:

当您运行命令docker info时,可以找到docker的根目录

Docker目录将在这一行中给出:“Docker Root Dir: /var/lib/docker

关于docker镜像,它们存储在docker目录中:/var/lib/docker/aufs/diff/

请记住,这些东西在所有版本的docker中都不一样。目前,我使用的是1.12.3。

扩展特里斯坦的答案,在带有Hyper-V的Windows中,您可以使用matthuisman中的这些步骤移动图像:

在Windows 10中,

  1. 停止docker等
  2. 在任务栏搜索框中键入“Hyper-V Manager”并运行它。
  3. 在左侧窗格中选择您的PC(我的称为DESKTOP-CBP**)
  4. 右键单击正确的虚拟机(我的是调用MobyLinuxVM)
  5. 选择“关闭”(如果正在运行)
  6. 再次右键单击它并选择“移动”
  7. 按照提示操作

在Fedora上,Docker使用LVM进行存储(如果可用)。在我的系统docker info上显示:

Storage Driver: devicemapperPool Name: vg01-docker--poolPool Blocksize: 524.3 kBBase Device Size: 10.74 GBBacking Filesystem: xfsData file:Metadata file:Data Space Used: 9.622 GB...

在这种情况下,要增加存储空间,您必须使用LVM命令行工具或兼容的分区管理器,例如blivet

如果您记住Docker仍在VM中运行,则系统路径是相对于VM而不是来自Mac Osx系统的。正如它所说,所有内容都包含在VM文件中:

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

尝试使用此卷选项和ls命令运行Alpine映像,您可以列出VM主机:

docker run--rm-it-v/:/vm-root alpine: dge ls-l /vm-root

在此之后,只需尝试:

docker运行--rm-it-v/:/vm-root aline:边缘ls-l/vm-root/var/lib/docker

现在,您可以从VM主机列出docker文件夹

检查/var/lib中的docker文件夹

图像存储在以下位置:

/var/lib/docker/image/overlay2/imagedb/content

在Debian不稳定/Sid上,

docker info查找系统范围的信息。

图像存储在/var/lib/docker/image/overlay2/imagedb/content

容器存储在/var/lib/docker/containers

docker版本18.06.0-ce,api版本1.38

使用docker info命令显示系统范围的信息,位置可能会有所不同。

根据使用的存储驱动程序,可以显示其他信息,例如池名称、数据文件、元数据文件、使用的数据空间、总数据空间、使用的元数据空间和总元数据空间。

数据文件是存储图像的地方,元数据文件是存储有关这些图像的元数据的地方。第一次运行时,Docker从安装/var/lib/docker的卷上的可用空间中分配一定数量的数据空间和元数据空间。

这是Ubuntu上的示例(检查Root Dir):

$ docker info...Server Version: 18.06.1-ceStorage Driver: aufsRoot Dir: /var/snap/docker/common/var-lib-docker/aufs...Docker Root Dir: /var/snap/docker/common/var-lib-docker...

这是Travis CI的示例(见Docker根目录):

$ docker infoServer Version: 17.09.0-ceStorage Driver: overlay2Backing Filesystem: extfs...Docker Root Dir: /var/lib/docker...

您可以使用--format参数将该信息提取到单个文件中,例如:

$ docker info --format '\{\{.DriverStatus}}'[[Root Dir /var/snap/docker/common/var-lib-docker/aufs] [Backing Filesystem extfs] [Dirs 265] [Dirperm1 Supported true]]

或:

$ docker info --format '\{\{json .DriverStatus}}'[["Root Dir","/var/snap/docker/common/var-lib-docker/aufs"],["Backing Filesystem","extfs"],["Dirs","265"],["Dirperm1 Supported","true"]]

在Windows 2016中,docker(DockerMsftProvider)使用docker根目录下的文件夹“winowsfilter”

>docker info...Storage Driver: windowsfilter...Docker Root Dir: C:\ProgramData\docker...

它使用docker root下的“tmp”文件夹下载文件,并在将下载的文件提取到“windowsfilter”文件夹后删除文件。

我无法使用上述答案解决macos上的Docker版本18.09的问题,然后再试一次。

我唯一的实际解决方案是使用这个docker-compose.yml配置:

version: '3.7'...services:demo-service:volumes:- data-volume:/var/tmp/container-volume
volumes:data-volume:driver: localdriver_opts:type: noneo: binddevice: /tmp/host-volume

使用docker-compose up启动后,我终于将来自macos的/tmp/host-volume共享为容器内的可写卷:

> docker exec -it 1234 /bin/bashbash-4.4$ dfFilesystem           1K-blocks      Used Available Use% Mounted on...osxfs                488347692 464780044  21836472  96% /var/tmp/container-volume

希望这也能帮助到其他人。

环境:Windows 10 Pro,Docker桌面2.0.3.0边缘

右键单击系统托盘中的docker图标,选择设置-高级:

磁盘映像位置(可通过浏览器编辑):

C:\用户\公共\文档\Hyper-V\虚拟硬盘\DockerDesktop.vhdx

(它在那里-文档目录隐藏)

图像存储在/var/lib/docker中,然后存储在适用的storage driver目录下。

正在使用的存储驱动程序可以通过执行docker info命令来确定。

使用docker inspect container_id
查找MergedDir下的文件夹

# example."MergedDir": "/var/lib/docker/overlay2/f40cc2ea8912ec3b32deeef5a1542a132f6e918acb/merged

对于“Docker Desktop”,单击docker系统托盘图标并单击“设置”。

输入图片描述

在高级选项卡上,您可以看到磁盘映像位置。

输入图片描述

如果有人需要它来编写脚本,这里有一个单行解决方案。

在POSIX shell中,启用PCREgrep,尝试:

DOCKER_ROOT_DIR="$(docker info 2>&1 | grep -oP '(?<=^Docker Root Dir: ).*')"

在PowerShell中:

$DOCKER_ROOT_DIR="$(docker info 2>&1 | foreach {if($_ -match "Docker Root Dir"){$_.TrimStart("Docker Root Dir: ")}})"

请注意,在Windows 10上(从10.0.18999.1开始),在默认配置中,它返回:

  • C:\ProgramData\Docker在“Windows容器”模式下
  • /var/lib/docker,在"Linux容器"模式下
sudo docker info | grep -e "Root Dir"

ENV

操作系统:fedora 29 x86_64 workstation

Docker:

[user@localhost ~]$ docker --versionDocker version 19.03.5, build 633a0ea838

图片信息:"DockerVersion": "18.09.7"


默认情况下,图像应存储在/var/lib/docker/overlay2中。


我的榜样

显示图片:

[user@localhost ~]$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEneo4j               latest              8ed7463b8476        12 months ago       548MBhello-world         latest              fce289e99eb9        2 years ago         1.84kB

图像大小548M。

请参阅图像信息8ed7463b8476

[user@localhost ~]$ docker image inspect 8ed7463b8476
... ... ... ...
"DockerVersion": "18.09.7",
... ... ... ...
"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/66dc24704d7ea5f1a5dee0bf4a5297cb78bcbd0d4b36206b8cca62cd4de7f2b1/diff:/var/lib/docker/overlay2/5ab91cf721359d43d01038233d397fd9ed1c4b3857c0c7d9a2dd7f2ac5eccad0/diff:/var/lib/docker/overlay2/e82fdf7ee3e37db0a11d9ca309245ae852425d24d6f5d3313dcf604cdddb397b/diff:/var/lib/docker/overlay2/9394543085d467010d0468fffb388e5616a89e2cf16c1c2b7b31aee4e542ae69/diff:/var/lib/docker/overlay2/c7c7a16e3dbaeea1a3a3b0bbca39f34f08f6b8ab15d753e6e68f9851c80d95b4/diff:/var/lib/docker/overlay2/3b470afdf8939b45159f3171f0bef2a27085b4b980e09f0c666fbdc58b944d97/diff:/var/lib/docker/overlay2/463ba63f79eb6b2f5466e7b71041bc346a8e9c4ebddd34d23422c719824a2340/diff",
... ... ... ...

让我们看看这些文件夹的大小。

[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/66dc24704d7ea5f1a5dee0bf4a5297cb78bcbd0d4b36206b8cca62cd4de7f2b1141M    /var/lib/docker/overlay2/66dc24704d7ea5f1a5dee0bf4a5297cb78bcbd0d4b36206b8cca62cd4de7f2b1[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/5ab91cf721359d43d01038233d397fd9ed1c4b3857c0c7d9a2dd7f2ac5eccad0/28K /var/lib/docker/overlay2/5ab91cf721359d43d01038233d397fd9ed1c4b3857c0c7d9a2dd7f2ac5eccad0/[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/e82fdf7ee3e37db0a11d9ca309245ae852425d24d6f5d3313dcf604cdddb397b/100K    /var/lib/docker/overlay2/e82fdf7ee3e37db0a11d9ca309245ae852425d24d6f5d3313dcf604cdddb397b/[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/9394543085d467010d0468fffb388e5616a89e2cf16c1c2b7b31aee4e542ae69/310M    /var/lib/docker/overlay2/9394543085d467010d0468fffb388e5616a89e2cf16c1c2b7b31aee4e542ae69/[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/c7c7a16e3dbaeea1a3a3b0bbca39f34f08f6b8ab15d753e6e68f9851c80d95b4/36K /var/lib/docker/overlay2/c7c7a16e3dbaeea1a3a3b0bbca39f34f08f6b8ab15d753e6e68f9851c80d95b4/[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/3b470afdf8939b45159f3171f0bef2a27085b4b980e09f0c666fbdc58b944d97/9.5M    /var/lib/docker/overlay2/3b470afdf8939b45159f3171f0bef2a27085b4b980e09f0c666fbdc58b944d97/[user@localhost ~]$ sudo du -sh /var/lib/docker/overlay2/463ba63f79eb6b2f5466e7b71041bc346a8e9c4ebddd34d23422c719824a2340/76M /var/lib/docker/overlay2/463ba63f79eb6b2f5466e7b71041bc346a8e9c4ebddd34d23422c719824a2340/

我们可以看到接近548M的大小。

我们还可以将图像保存到输出文件中。

[user@localhost ~]$ docker save -o neo4j.image.tar 8ed7463b8476[user@localhost ~]$ du -sh neo4j.image.tar528M    neo4j.image.tar

我们可以提取包文件并检查包中文件的大小。

[user@localhost neo4j.image]$ du -sh *16K 2f0dd5fb60a940719a3e781133611cc64c2acded03bd47e04b0997fd0c1dae508.7M    73819037a38eabeb7c622533e4058c84f5ff106475a1aba78a278f8b36c172f7309M    8d31d715b324a2ae3ccb1577e981d492f40e34db6371f0858da925ef02b5762e12K 8ed7463b84760f09b1b86a732ee6f295baaadffe72ce4fdb7ad306fe5e096bbb.json36K 966e726ff1d9be9dca68014cda6f1ecf974365c553b82ea3834fff5d73ea593e70M a32776b9621e916e8714389b1037bf47253a2d3d1c806ad515623d2150c9248560K d82868a318b95466f213136f81cd7258518744da72f46ca51b04b35f2351f46a16K e62169d79fab44bebb0a455b01af5f636bace7673a1d38fc092daad77d51cd0e141M    fe8014622f7933e178b9005deffda3eb4828703eb7eca93b5485232930e3916b4.0K    manifest.json

我们还可以归档文件夹/var/lib/docker/overlay2/以比较包与图像文件的大小。大小也接近图像大小。

更多有用的阅读:

Docker图像-GraphDriver的合并/diff/work/LowerDir组件

Docker映像存储在哪里?Docker容器路径解释

覆盖文件系统

2021年在macOS上,唯一可能的解决方案是使用bash访问Docker VM,然后查看它的本地结构:

  1. docker run -ti --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
  2. cd /var/lib/docker/

别客气!

使用docker info命令获取docker的主机设置,包括其存储路径。

要仅获取docker存储的根路径,您可以使用:

docker info | grep 'Docker Root Dir:' | cut -d':' -f2 | sed 's/^ *//g'

这为默认的Ubuntu 22.04docker --version=Docker version 20.10.17, build 100c701安装提供了路径:

/var/lib/docker

通过命令列出该目录的内容和大小:

du -h -d 1 .

给出结果(其他目录):

444K    ./buildkit4,0K    ./containers4,0K    ./runtimes16K     ./plugins4,0K    ./trust4,0K    ./tmp100K    ./network22M     ./image2,0G    ./volumes4,0K    ./swarm9,0G    ./overlay2

要获得docker根路径后缀与目录名称之一,你可以添加另一个sed在末尾sed 's/$/\/image/g'为后缀与/image

命令:

docker info | grep 'Docker Root Dir:' | cut -d':' -f2 | sed 's/^ *//g' | sed 's/$/\/image/g'

提供:

/var/lib/docker/image

命令:

docker info | grep 'Docker Root Dir:' | cut -d':' -f2 | sed 's/^ *//g' | sed 's/$/\/overlay2/g'

提供:

/var/lib/docker/overlay2

虽然目录的名称似乎不言自明图像的内容不存储在image目录(22M大小),而是图像的信息。/var/lib/docker/image/overlay2在我的情况下,尤其是/var/lib/docker/image/overlay2/repositories.json文件,其中包含图像的名称和与之对应的overlay2层数据。

图像(及其图层)的实际数据存储在/var/lib/docker/overlay2(9,0G大小)中

请注意,存储图像重数据的overlay2是docker使用的分层系统,但该分层系统是docker可能使用的许多系统之一(现在或将来)。因此,基于硬编码路径可能是脆弱的。

特别是如果您的意图是将图像导出/保存到文件中,您应该查找专用命令:

Docker中保存和导出有什么区别?

使用上面问题中的命令,您甚至可以将所有图像保存到一个文件中,压缩它,然后通过单个命令将它们导入其他地方。

如果你想坚持docker路径,即创建备份,我建议总是使用根路径,例如:

/var/lib/docker

docker info命令生成,特别是您可能还包含重要数据:

/var/lib/docker/volumes

这是需要的,例如。通过使用卷来持久化数据的数据库映像。