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

Where are Docker images stored on the host machine?

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

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


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

默认情况下,这将是aufs,但可以返回到overlayoverlay2btrfsdevicemapperzfs,具体取决于您的内核支持。在大多数地方,这将是aufs,但红帽与devicemapper是一致的。

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

  • /var/lib/docker/{driver-name}将包含用于图像内容的驱动程序特定存储。
  • /var/lib/docker/graph/现在只在jsonlayersize文件中包含有关映像的元数据。

对于aufs的情况:

  • /var/lib/docker/aufs/diff/具有图像的文件内容。
  • /var/lib/docker/repositories-aufs是一个包含本地图像信息的JSON文件。这可以通过命令docker images查看。

对于devicemapper

  • /var/lib/docker/devicemapper/devicemapper/data存储图像
  • /var/lib/docker/devicemapper/devicemapper/metadata元数据
  • 请注意,这些文件是精简配置的"稀疏"文件,因此没有看上去的大。


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

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

更新(由mmorin提供):

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

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

它包含Docker磁盘以及其中的所有图像和容器。


在Mac OS X或Windows的特殊情况下,使用boot2docker,docker映像存储在由boot2docker管理的virtualbox vm中。

此虚拟机将存储在virtualbox映像的正常位置:

&OS X:~/VirtualBox VMs/boot2docker-vm

&windows:%USERPROFILE%/VirtualBox VMs/boot2docker-vm

您可以通过运行来重置它(警告:这将破坏到目前为止生成和下载的所有图像):

1
2
3
4
boot2docker down
boot2docker destroy
boot2docker init
boot2docker up

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

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

而不是:

1
docker build -t webapp .


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

1
$ docker info

Data file: /var/lib/docker/devicemapper/devicemapper/data

Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata


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

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

当你看到一张图片时。AUF将把所有层"合并"成一个可用的文件系统。


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

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

中。

您还可以打开"Hyper-V管理器"访问docker/mobylinuxvm。


对于使用Docker工具箱(使用Docker机器)的用户,有关Mac OS X上boot2docker的答案无效。docker machine vm称为"默认",它存在于/Users//.docker/machine/machines/default/目录中。


在Ubuntu上,你可以"播放"运行的图像

1
sudo baobab /var/lib/docker

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

screenshot showing disk analyzer tool baobab running on /var/lib/docker


在Docker for Windows(本机Windows)中,默认容器存储位置为:

1
2
3
4
   > docker info
   ...
   Docker Root Dir: C:\ProgramData\Docker
   ...


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


正如这里所回答的,如果您在Mac上,它位于

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


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

In Windows 10,

  • Stop docker etc
  • Type"Hyper-V Manager" in task-bar search box and run it.
  • Select your PC in the left hand pane (Mine is called
    DESKTOP-CBP**)
  • Right click on the correct virtual machine (Mine is
    called MobyLinuxVM)
  • Select"Turn off" (If it is running)
  • Right click on it again and select"Move"
  • Follow the prompts

  • 如果您记住Docker仍然在一个虚拟机中运行,那么系统路径是相对于虚拟机的,而不是来自mac osx系统的。正如它所说,所有内容都包含在一个VM文件中:

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

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

    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文件夹


    我在mac osx上使用boot2docker for docker,所以图像存储在/Users//VirtualBox VMs/boot2docker-vm/boot2docker-vm.vmdk中。


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

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

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

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

    请记住,在所有版本的Docker中,这些东西并不相同。目前,我使用的是1.12.3。


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


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

    图像存储在以下位置:

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


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

    Depending on the storage driver in use, additional information can be shown, such as pool name, data file, metadata file, data space used, total data space, metadata space used, and total metadata space.

    The data file is where the images are stored and the metadata file is where the meta data regarding those images are stored. When run for the first time Docker allocates a certain amount of data space and meta data space from the space available on the volume where /var/lib/docker is mounted.

    下面是有关ubuntu(check root dir)的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    $ 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):

    1
    2
    3
    4
    5
    6
    7
    $ docker info
    Server Version: 17.09.0-ce
    Storage Driver: overlay2
     Backing Filesystem: extfs
    ...
    Docker Root Dir: /var/lib/docker
    ...

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

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

    或:

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

    根据Docker入门指南,"您构建的图像"是"在您的机器的本地Docker图像注册表中"。

    enter image description here

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

    不过,我绝对认为这个信息值得分享作为答案。


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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)。


    在Debian不稳定/Sid上,

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

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

    集装箱存放在/var/lib/docker/containers处。

    docker版本18.06.0-ce,api版本1.38


    在Windows 2016中,docker(dockermsftprovider)使用docker root下的"windowsfilter"文件夹。

    1
    2
    3
    4
    5
    6
    >docker info
    ...
    Storage Driver: windowsfilter
    ...
    Docker Root Dir: C:\ProgramData\docker
    ...

    它使用docker root下的"tmp"文件夹下载文件,并将下载的文件解压缩到"windowsfilter"文件夹后删除文件。


    我无法用MacOS上的Docker 18.09版通过上述答案解决问题,然后再试了一次。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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一起启动后,我终于让macos的/tmp/host-volume作为容器内的可写卷共享:

    1
    2
    3
    4
    5
    > 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

    希望这也能帮助别人。


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

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

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

    C:userspublicdocumentshyper-vvirtual hard disksdockerdesktop.vhdx

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


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

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