如何更改docker镜像安装目录?

Posted

技术标签:

【中文标题】如何更改docker镜像安装目录?【英文标题】:How to change the docker image installation directory? 【发布时间】:2014-08-10 03:56:30 【问题描述】:

据我所知,docker 镜像在被拉取时会安装到/var/lib/docker。有没有办法改变这个位置,比如像/mnt这样的挂载卷?

【问题讨论】:

您的 docker 在哪个操作系统上运行? 【参考方案1】:

根据这个Post-installation steps for Linux指南和我在网络爬取时发现的官方方法如下:

    覆盖 docker 服务配置:

     sudo systemctl edit docker.service
    

    添加或修改以下行,替换为您自己的值。

     [Service]
     ExecStart=
     ExecStart=/usr/bin/dockerd --graph="/mnt/docker"
    

保存文件。 (它创建:/etc/systemd/system/docker.service.d/override.conf

    重新加载systemctl 配置。

     sudo systemctl daemon-reload
    

    重启 Docker。

     sudo systemctl restart docker.service
    

在此之后,如果您没有任何要备份的图像,您可以核对 /var/lib/docker 文件夹。

【讨论】:

【参考方案2】:

我使用的是 docker 版本 19.03.14。下面的链接帮助了我。

Check this Link

在 /etc/docker/daemon.json 文件中我添加了以下部分:-

 
    "data-root": "/hdd2/docker",
    "storage-driver": "overlay2"
 

【讨论】:

【参考方案3】:

对于新的 docker 版本,我们需要使用 data-root,因为 graph 在 v17.05.0 中已弃用:official deprecated docs

编辑/etc/docker/daemon.json(如果不存在,创建它)并包含:


  "data-root": "/new/path/to/docker-data"

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
使用带有 data-root 的 Docker Storage 的更详细的分步说明(包括移动数据)可以在以下位置找到:Blog post 在 Windows 中类似的帖子Windows specific

【讨论】:

您的评论帮助我找到了这个页面:adriel.co.nz/blog/2018/01/25/… 谢谢! 我认为是时候给这个答案加上“接受”标志了,因为它在当前版本中工作。 我在这里发表评论是为了让人们知道哪个版本可以使用它,github.com/docker/docker.github.io/pull/5978 发布后,它会更改官方网站。 这是最新 docker 的正确答案。我想补充一点,在对daemon.json添加更改并重新启动docker服务后,只需确认docker使用docker info|grep "Docker Root Dir"拾取路径(正如@piotr-kr在另一个答案中提到的那样) 这在 Fedora 33 上对我有用。我没有文件,创建它,运行良好。【参考方案4】:

对于那些期待 2020 年的人。以下适用于 Windows 10 机器:

    在 Hyper-V 管理器的全局操作窗格中单击 Hyper-V 设置… 在虚拟硬盘下更改位置 默认为您想要的位置。 在虚拟机下更改 位置从默认位置更改为您想要的位置,然后单击应用。

    单击“确定”关闭 Hyper-V 设置页面。

【讨论】:

【参考方案5】:

更简单的方法:

停止泊坞窗服务

sudo systemctl stop docker

将现有的 docker 目录移动到新位置

sudo mv /var/lib/docker/ /path/to/new/docker/

创建符号链接

sudo ln -s /path/to/new/docker/ /var/lib/docker

启动docker服务

sudo systemctl start docker

【讨论】:

这是 IMO 正确和最直接的解决方案 - 为我工作。 对我来说就像一个魅力,但没有符号链接命令的斜杠:sudo ln -s /path/to/new/docker/ /var/lib/docker 这是 docker 论坛的建议:forums.docker.com/t/… 这是一个很棒的解决方案,它挽救了我的生命。 :) 我已经在上面执行了,docker 已经启动并运行了。但我找不到我的 docker 图像已经存在。有什么建议吗?【参考方案6】:

使用最新版本的 Docker,您可以将 data-root 参数的值设置为您的自定义路径,在 /etc/docker/daemon.json (根据https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file)。

对于旧版本,您可以在启动 Docker 守护程序时使用-g选项更改 Docker 的存储基目录(容器和映像所在的位置)。 (检查docker --help)。 您可以在 Docker 启动时自动应用此设置,方法是将其添加到 /etc/default/docker

【讨论】:

感谢您的回答。你能告诉我如何在 docker upstart 文件中添加这个要求吗?我将 -g 标志添加到 DOCKER_OPTS 变量的情况是什么? 对不起,我指的是那个文件。在'/etc/defaults/docker.io'中有一行'DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4"'。这是我应该使用 -g 标志设置图形目录的选项吗? 是的,把这行改成DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt" 在 Fedora 中不起作用。如果您的发行版是 Fedora,请查看我的答案 如果 docker 忽略了您的 /etc/default/docker 文件,您可能需要将此 solution 实现到某些 Debian 或 Ubuntu 版本中的错误。【参考方案7】:

根据 cmets 的建议,我利用 Docker systemd documentation 改进此答案。 下面的过程不需要重新启动,而且更干净。

首先为自定义配置创建目录和文件:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

对于17.06-ce之前的docker版本粘贴:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

对于 docker 17.06-ce 之后粘贴:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

通过daemon.json的替代方法

我最近在 Fedora 25 上使用 17.09-ce 尝试了上述过程,但它似乎不起作用。而不是在/etc/docker/daemon.json 中进行简单的修改:


    "graph": "/mnt",
    "storage-driver": "overlay"

尽管您必须重新加载配置并重新启动 Docker 的方法:

sudo systemctl daemon-reload
sudo systemctl restart docker

确认 Docker 已重新配置:

docker info|grep "loop file"

在最新版本 (17.03) 中需要不同的命令:

docker info|grep "Docker Root Dir"

输出应如下所示:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

或者:

 Docker Root Dir: /mnt

然后您可以安全地移除旧的 Docker 存储:

rm -rf /var/lib/docker

【讨论】:

这是在 Ubuntu 16.04 上帮助我的唯一方法! 此链接docs.docker.com/engine/admin/systemd 解释了如何使用 systemd 配置 Docker,它适用于较新的 linux 发行版,例如 Ubuntu 16.04。 docker info 声明可能已过时。在 Ubuntu 16.04 上,重新配置的检查是 sudo docker info | grep "Docker Root Dir"。否则,好的答案应该是公认的;) 在新版本的 Linux (4.10) 和 Docker (docker-ce 17.06) 中,该行必须更改如下: /usr/bin/dockerd -H fd:// --data-root= "/mnt" 如果在运行docker info|grep "Docker Root Dir"时看到Docker Root Dir: /"/mnt",则必须将--data-root="/mnt"替换为文件--data-root=/mnt中的--data-root=/mntdocker-storage.conf【参考方案8】:

在 Fedora 26 和可能的许多其他版本上,您可能会在如上所述移动基本文件夹位置后遇到错误。如果您将其移动到 /home 下的某个位置,则尤其如此。这是因为 SeLinux 启动并阻止 docker 容器从该位置运行它的许多程序。

简短的解决方案是在添加 -g 参数时删除 --enable-selinux 选项。

【讨论】:

这不会为攻击打开空间吗?【参考方案9】:

对于 17.06.0-ce-mac19 版本的 Mac 用户,您可以简单地从用户界面的首选项选项中移动磁盘映像位置只需更改磁盘映像的位置即可(通过单击 移动磁盘映像)并重新启动 docker。使用这种方法,我可以使用我的外部硬盘来存储 docker 图像。

【讨论】:

docker现有的文件怎么样?我们应该手动移动它吗? 您可以尝试在您喜欢的位置重新安装 docker。图像和 docker 文件是独立的。【参考方案10】:

复制并粘贴获胜者答案的版本 :)

仅使用此内容创建此文件:

$ sudo vi /etc/docker/daemon.json

  
      "graph": "/my-docker-images"
  

在 docker 1.12.6 中的 Ubuntu 16.04.2 LTS 上测试

【讨论】:

daemon.json 中的 graph 属性自 v17.05.0 起已弃用,请改用 data-root,参见。 ***.com/a/50217666/743507【参考方案11】:

正如@mbarthelemy 所建议的,这可以在直接启动 docker 守护进程时通过-g 选项来完成。

但是,如果docker作为系统服务启动,不建议修改/etc/default/docker文件。有一个位于here 的指南。

正确的方法是在 Linux(或 Mac)系统上创建 /etc/docker/daemon.json 文件或在 Windows 上创建 %programdata%\docker\config\daemon.json。如果此文件没有用于其他任何用途,则以下字段就足够了:


    "graph": "/docker/daemon_files"

这是假设您希望 docker 持久保存其数据的新位置是 /docker/daemon_files

【讨论】:

【参考方案12】:

在 openSUSE Leap 42.1 上

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

请注意,DOCKER_OPTS 最初是空的,我所做的只是添加参数以使 docker 使用我的新目录

【讨论】:

【参考方案13】:

在 AWS Ubuntu 16.04 服务器上,我将 Docker 映像放在一个单独的 EBS 上,安装在 /home/ubuntu/kaggle/ 的 docker 目录下

我的初始化脚本的这个 sn-p 工作正常

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see https://***.com/questions/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them

【讨论】:

【参考方案14】:

此解决方案适用于 Red Hat 7.2 和 Docker 1.12.0

编辑文件 /lib/systemd/system/docker.service 在您的文本编辑器中。

ExecStart 指令的末尾添加 -g /path/to/docker/。完整的行应如下所示。

ExecStart=/usr/bin/dockerd -g /path/to/docker/

执行以下命令

systemctl daemon-reload
systemctl restart docker

执行命令查看docker目录

docker info | grep "loop file\|Dir"

如果您在 Red Hat 或 docker 1.7.1 中有 /etc/sysconfig/docker 文件,请检查 this 答案。

【讨论】:

我的案例:centos7,最新的docker;我不得不调用“systemctl status docker”来找到“docker.service”文件,并在答案中添加了选项“-g”。谢谢【参考方案15】:

对于 Debian/Ubuntu 或 Fedora,您可能可以使用其他答案。但是如果您在/etc/default/docker/etc/sysconfig/docker 下没有文件,并且您的系统正在运行systemd,您可能需要关注this answer by h3nrik。我正在使用 Arch,这对我有用。

基本上,您需要配置 systemd 以将新的 docker 映像位置作为环境变量读取,并将该环境变量传递给 Docker 守护进程执行脚本。

为了完整起见,这里是 h3nrick 的回答:


您有/lib/systemd/system/docker.service 文件吗?

如果是这样,请对其进行编辑,以便 Docker 服务使用通常的 /etc/default/docker 作为环境文件:EnvironmentFile=-/etc/default/docker

/etc/default/docker 文件中添加DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images"

最后只需执行systemctl daemon-reload && systemctl restart docker

如需更多信息,请查看documentation。

【讨论】:

如果您按照当前 Debian 的 docker 安装说明进行操作,您会获得 SysVinit 脚本,但不会使用它们。见github.com/docker/docker/issues/9889#issuecomment-109766580【参考方案16】:

因为我没有在 Fedora 中找到正确的说明(编辑:人们在 cmets 中指出这也应该在 CentOS 和 Suse 上工作)(/etc/default/docker 没有在那里使用),我'我在这里添加我的答案:

您必须编辑 /etc/sysconfig/docker,并在 OPTIONS 变量中添加 -g 选项。如果有多个选项,请确保将它们括在“”中。就我而言,该文件包含:

OPTIONS=--selinux-enabled

它会变成

OPTIONS="--selinux-enabled -g /mnt"

重启后 (systemctl restart docker) ,Docker 应该使用新目录

【讨论】:

在 CentOS 6.5/6.6 和可能的 7 上,您使用相同的 /etc/sysconfig/docker 文件,但您将参数添加到变量名 other_args。 该选项现在称为 DOCKER_OPTS(docker 版本 1.7.0)。 从 Docker 1.8 版开始,不推荐使用 /etc/sysconfig 中的 Docker 配置文件。相反,您应该使用 etc/systemd/system/docker.service.d 中的 systemd 插件配置文件。在 docker 服务运行时添加或修改一个 drop-in 文件后,运行命令 systemctl daemon-reload 告诉 systemd 重新加载该服务的配置。 docs.oracle.com/cd/E52668_01/E54669/html/… 并使用插入文件docs.docker.com/engine/articles/systemd/…【参考方案17】:

在 CentOS 6.5 中

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

添加以下行

other_args=" -g /data/docker -p /var/run/docker.pid"

然后保存文件并再次启动docker

service docker start

并将在/data/docker中创建存储库文件

【讨论】:

【参考方案18】:

一个更简单的解决方案是创建一个指向您想要的任何内容的软链接点,例如

link -s /var/lib/docker /mnt/whatever

它适用于我的 CentOS 6.5 服务器。

【讨论】:

不要创建软链接。原因请参阅我之前发布的评论...您可能会在使用“docker rm”命令时遇到问题! @suther:五月?现在有没有遇到麻烦的情况? May 对于技术文档来说有点不精确,如果我遇到了问题,那么我想知道究竟是什么时候发生的,这个问题是如何引起的以及结果如何。【参考方案19】:

不要使用符号链接将 docker 文件夹移动到 /mnt(例如)。 这可能会导致 docker rm 命令出现问题。

最好使用 docker 的 -g 选项。 在 Ubuntu 上,您可以在 /etc/default/docker.io 中永久设置它。增强或替换 DOCKER_OPTS 行。

这里是一个例子: `DOCKER_OPTS="-g /mnt/somewhere/else/docker/"

【讨论】:

在我的情况下,我不得不重新启动 在使用符号链接时,docker rm 会遇到什么样的麻烦? 我还必须在 Ubuntu 16.04 ***.com/a/30219552/977622 中执行此操作才能使其正常工作

以上是关于如何更改docker镜像安装目录?的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS 10更改WSL DOCKER镜像目录

最新版docker安装,更改docker安装位置,镜像数据保存路径,配置镜像加速器

docker存储驱动

docker使用Dockerfile安装镜像

Docker教程-9-构建镜像并上传到DockerHub仓库

Docker教程-9-构建镜像并上传到DockerHub仓库