Docker映像存储在主机上的什么位置?


874

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

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


2
在这种情况下,最好在问题标题和/或问题说明中说明操作系统的详细信息。针对linux和macOS(Mac OS X)提供了两个很好的答案。
Webel IT Australia-upvoter,

Answers:


637

/var/lib/docker目录的内容根据Docker用于存储驱动程序而有所不同。

默认情况下,这将是aufs,但可以回落到overlayoverlay2btrfsdevicemapper或者zfs根据您的内核支持。在大多数地方,这是可以的,aufs但是RedHats却接受了devicemapper

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

  • /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 元数据
  • 请注意,这些文件是精简配置的“稀疏”文件,因此没有看起来那么大。

1
我可以通过某种方式装入内部内容吗?
rv

1
如果在存储驱动程序已经运行并且具有一些正在运行的带有映像的容器之后设置存储驱动程序,它将在下次重新启动守护程序时迁移日期吗?如果不是,那么在这种情况下如何修改存储驱动程序?
BTR Naidu


91
帮自己一个忙,不要“检查默认值”。使用docker info并找到特定于您的设置的实际位置。
布鲁诺·布罗诺斯基

5
这似乎已经改变。我正在使用Docker for Mac2张1.5 GB的图像,并且/var/lib没有目录docker
miguelmorin

298

当使用Docker for Mac应用程序时,容器似乎存储在位于以下位置的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 Disk及其中的所有映像和容器。


7
这是所有图像(例如ubuntunginx)的位置,还是所有容器的位置?原始问题要求提供图像,而不是容器 ...
小清庞-明日香根治

2
如果您记住Docker仍在VM中运行,则系统路径是相对于VM的,而不是来自Mac Osx系统的。试试这个命令:docker run --rm -it -v /:/ vm-root alpine:edge ls -l / vm-root nad之后:docker run --rm -it -v /:/ vm-root alpine: edge ls -l / vm-root / var / lib / docker您可以从WM主机中
列出docker

3
这似乎已经改变。我正在使用Docker for Mac两个1.5 GB的图像,并且~/Library/Containers/Data/com.docker.docker/Data没有目录com.docker.driver.amd64-linux,唯一的大文件位于vms/0/Docker.raw3.6 GB中。
miguelmorin

1
是否使用qcow2还是raw是否使用取决于您是否是具有APFS或更低版本的MacOS High Sierra:docs.docker.com/docker-for-mac/faqs/#disk-usage
Peter

1
检查mac大小:du -hd1 ~/Library/Containers/com.docker.docker/Data/
Efren

122

这是过去的做法,现在已经改变了。自2019年起忽略此答案

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

该虚拟机将存储在VirtualBox映像的常规位置:

      OS X: ~/VirtualBox VMs/boot2docker-vm

      视窗: %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 .

16
在Windows 10上新安装Docker之后,我可以确认首次单击Docker Quickstart Terminal快捷方式的结果会创建一个名为“默认”的虚拟机(VM)(在几次失败的启动之后-继续运行直到有用)。该“默认” VM可以位于Windows中的以下位置 %USERPROFILE%\.docker\machine\machines :(请注意路径中的句号)
AnotherLongUsername16年

6
在新版本中,boot2docker现在是docker -machine。参见docs.docker.com/machine/migrate-to-machine
khylo

3
是否可以更改该位置?
dhblah's

13
对于Windows 10,答案不再正确。相反,请参阅来自@tristan的较新答案,其中引用了C:\Users\Public\Documents\Hyper-V\Virtual hard disks\MobyLinuxVM.vhdx
aaronsteers

5
%USERPROFILE%\。docker对于win7设置仍然正确。
RMorrisey

119

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

$ docker info

资料档案: /var/lib/docker/devicemapper/devicemapper/data

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


3
这是针对RedHat变体的。他们选择不使用AUFS,因为它不在主线内核中
马特

8
是的,不幸的是,这两行“(Meta)数据文件”并未出现在每个泊坞窗中。这取决于所使用的驱动程序
Orabîg

@DmitryYudin mirosval的答案适用于Mac的最新Docker
富兰克林于

8
正确的答案不是“这就是我的机器上的位置”。正确的答案是“这是在计算机上找到它的方式 ”。这是一个正确的答案。我加入了一家拥有11个不同的EBS卷的公司,这些卷中满是docker映像。这个答案让我弄清楚了哪个是当前的 “根目录”。
布鲁诺·布洛诺斯基

在Mac OS X上(至少在Yosemite(这是Docker的EOL)上)docker info非常有用,但是输出Docker Root Dir: /var/lib/docker未指示图像存储位置(请参阅上面的Mac特定答案)。
Webel IT Australia-upvoter,

70

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

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

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


13
Windows 10周年更新上的Docker C:\ProgramData\docker\windowsfilter为我放置了图像文件。更多信息:stackoverflow.com/a/39971954/188740
Johnny Oshika

1
答案是“ Hyper-V经理”!
Reza

68

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

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

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


11
现在,这个答案已经过时,他们已经解决了一些问题。
航空

7
@Air您可以发布周围发生的事情吗?
Elijah Lynn

1
没有图形文件夹了
Paddy19 '04

49

在Ubuntu上,您可以“播放”正在运行的图像

sudo baobab /var/lib/docker

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

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


的确不错。在Mac上,DaisyDisk类似(滚轮显​​示),GrandPerspective也有用(矩形)。
Webel IT Australia-upvoter '18

看来,这是找到它的唯一可靠方法。
亚历山大

48

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


3
我在该目录中找不到任何容器或图像文件夹。
lvarayut

3
在该目录中查找disk.vmdk
lukeaus

1
$ docker images -a产生约1 gig的图像,而〜/ .docker中的disk.vmdk约为20 gigs。怎么来的?
重力

它存储在Windows中的何处?
Shreyas

@Grav:虚拟机分配20个演出以供将来使用,但仅将1个演出用于映像。
primavera133

22

Windows的Docker(本地Windows)中,默认容器存储位于:

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

我运行了docker build命令,但没有看到我认为是图像文件的文件。我看到一些文件夹和一些文本文件(例如service.txt)。创建什么类型的文件以及带有什么文件扩展名docker build
user3731622 '19

22

如果您将Docker用于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
但是正如您在此处所说的stackoverflow.com/a/37642236/460885所示,容器位于此图像中。
rhand '17

7

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

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

2
Docker.qcow2吗?我该如何从中拉取特定的Docker映像?
AlxVallejo

7

扩展Tristan的答案,在带有Hyper-V的Windows中,您可以通过matthuisman的以下步骤移动图像:

在Windows 10中,

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

2
这只会移动Hyper-V计算机而不移动图像,图像仍将存储在VHD位置。
olive_tree

@olive_tree我正在尝试查找由docker build命令创建的图像。我在Windows 10电脑上。我查看C:\ Users \ Public \ Documents \ Hyper-V \ Virtual硬盘,但我看到的只是MobyLinuxVM.vhdx。实际图像存储在哪里?
user3731622 '19

5

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

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

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

docker运行--rm -it -v /:/ vm-root alpine:edge ls -l / vm-root

之后,只需尝试:

docker运行--rm -it -v /:/ vm-root alpine:edge ls -l / vm-root / var / lib / docker

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


谢谢!这是在带有Hyper-v的Windows 10上对我有用的唯一答案。我能够清理难以捉摸的/ var / lib / docker / overlay2文件夹下的损坏文件。
阿里·谢伊托

4

我将boot2docker用于Mac OSX上的Docker,因此映像存储在中/Users/<USERNAME>/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vmdk


4

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

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

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

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

请记住,这些事情在所有版本的Docker中都不相同。当前,我正在使用1.12.3。


4

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

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

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

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

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

这是Travis CI上的示例(请参阅Docker Root Dir):

$ docker info
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing 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"]]

3

在适用于Windows的Docker中,日志在此处: %USERPROFILE%\AppData\Local\Docker


3

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

图像存储在以下位置:

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

4
这只有sha256文件夹
toto'19年

我想你的意思是简单的:/var/lib/docker/image/overlay2/。另请注意,这是由于您的Docker引擎正在overlay2用作存储驱动程序。
Guy Avraham

3

使用docker inspect container_id
MergedDir下的find文件夹

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

3

对于“ Docker Desktop”,单击docker系统任务栏图标,然后单击“设置”。 在此处输入图片说明

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

在此处输入图片说明


2

环境:Windows 10 Pro,docker desktop 2.0.3.0 edge

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

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

C:\ Users \ Public \ Documents \ Hyper-V \ Virtual Hard Disks \ DockerDesktop.vhdx

(在那里-隐藏了Documents目录)


C:\ Users \ Public \ Documents \ Hyper-V \ Virtual Hard Disks \ DockerDesktop.vhdx是docker build命令创建的映像吗?
user3731622


1

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

Storage Driver: devicemapper
 Pool Name: vg01-docker--pool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file:
 Metadata file:
 Data Space Used: 9.622 GB
 ...

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


1

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

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

它使用docker根目录下的“ tmp”文件夹下载文件,并将下载的文件解压缩到“ windowsfilter”文件夹后删除文件。


0

在Debian Unstable / Sid上,

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

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

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

docker版本18.06.0-ce,API版本1.38


0

我无法使用上述答案在macOS上使用Docker版本18.09解决此问题,然后重试。

对我来说,唯一的实际解决方案是使用以下docker-compose.yml配置:

version: '3.7'
...
  services:
    demo-service:
      volumes:
        - data-volume:/var/tmp/container-volume

volumes:
  data-volume:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /tmp/host-volume

docker-compose up我一起启动后,我终于/tmp/host-volume从macOS中获得了来自容器内可写卷的共享:

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

希望这也能帮助其他人。


0

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

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


0

根据Docker入门指南, “您构建的映像”是“在您计算机的本地Docker映像注册表中”。

在此处输入图片说明

这对我来说仍然很奇怪,因为现在它引发了问题。我的机器的本地Docker映像注册表在哪里?

不过,我绝对认为此信息值得分享。


哈哈TBH我认为这最多是一条评论。将会是一个很棒的评论!
Mong H. Ng

0

如果有人出于脚本目的需要它,这是一种单行解决方案。

在启用了PCRE的POSIX Shell中grep,尝试:

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容器”模式下

在CentOS上,我不得不使用DOCKER_ROOT_DIR="$(sudo docker info 2>&1 | grep -oP '(?<=Data loop file: ).*')",但最后它是一个文件,而不是目录
HairOfTheDog

您确定它不是目录吗?对我来说,sudo ls "$(docker info 2>&1 | grep -oP '(?<=^Docker Root Dir: ).*')"列出此目录的内容。
火神乌鸦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.