如何更改默认的Docker容器位置?

50

当我运行 Docker 时,已下载的 Docker 镜像(似乎)存储在 /var/lib/docker 的某个位置。

由于此目录上的磁盘空间有限,并且我正在一次性为多台机器提供 Docker;是否有方法可以更改默认位置为 /mnt/hugedrive/docker/

5个回答

104

Docker v18.03 的可行解决方案

我发现 @Alfabravo 的 评论 在我的情况下有效,所以感谢他们并点赞。

然而,我认为在这里提供一个答案来详细说明它会增加价值:

确保 Docker 已停止(或首次未启动,例如,如果您刚刚安装了它)

(例如,作为 root 用户):

systemctl stop docker

(或者,如果不是root用户但您的用户属于sudo组,即可以sudo,则可以执行sudo systemctl stop docker

默认情况下,daemon.json文件不存在,因为它是可选的 - 它被添加以覆盖默认设置。(参考 - 参见答案:Docker的deamon.json在哪里?(丢失)

因此,新安装的Docker和那些从未修改过它的设置将没有它,所以需要创建它:

vi /etc/docker/daemon.json

并添加以下内容,告诉Docker将其所有文件放在此文件夹中,例如:

{
  "graph":"/mnt/cryptfs/docker"
}

并保存。

其他评论者提供的更新注释需要考虑(我尚未尝试过,但感谢他们的输入,请在故障排除时考虑这些注释):

根据stackoverflow用户 Alireza Mohamadi 5月11日下午5:01的回答:“graph选项在v17.05.0中已弃用。请改用data-root。” - 如何更改默认的Docker容器位置? 我还没有尝试过,但在我尝试后会更新答案。

“服务文件中的--data-root标志完全正常。 您不需要将json放在那里。 支持json方法,但是我遇到了错误,指定了data-root,因此我删除了json。文件现在在新位置中创建。” ——评论-如何更改默认的Docker容器位置?

现在启动Docker:

systemctl start docker

(如果是root用户,或者其他用户前面加上sudo。)

你会发现docker现在将所有文件放在新位置,对我来说是/mnt/cryptfs/docker

@Alfabravo的回答也得到了支持:这个问题的答案:Docker daemon flags ignored

Docker版本说明和思考

我的主机平台运行的是Ubuntu Linux 16.04.4 LTS 64位。

因此,我认为这个解决方案适用于以后的Docker版本,包括当前的v18.03。换句话说:“这个解决方案应该从v18.03开始有效”。就像其他答案所述,也有可能这个答案在未来的某个Docker版本中不起作用,如果Docker开发人员决定在这个领域做出改变。但目前,在v18.03中它可以工作,至少在我的情况下,希望你也能成功。

可选的清理提示:

如果您在原始位置/var/lib/docker中有文件,并且您自己知道您绝对不再需要它们(即您已经备份或以其他形式保存了其中的所有数据(容器内的数据库、文件等)),则可以删除它们,以保持您的机器整洁。

未能解决的问题-其他答案(不幸的是):

这里的其他解决方案对于我使用的当前版本的docker并没有起作用(在撰写本文时,当前的docker版本为:Docker v18.03(current))。

还要注意(正如@AlfaBravo在他们对我的答案的评论中正确指出的那样),其他答案可能适用于不同或早期版本的docker。

我应该指出,我的主机平台是Ubuntu Linux 16.04.4 LTS 64位。

在尝试其他答案时,在执行解决方案之前停止docker,然后在必要时重新启动它。

  • https://dev59.com/EFwY5IYBdhLWcg3w5raq#47604857 - @Gerald Sabu M的解决方案是修改/lib/systemd/system/docker.service文件中的该行为:ExecStart=/usr/bin/docker daemon -g /mnt/hugedrive/docker/,但对我来说结果仍然是:Docker仍将其文件放在默认原始位置:/var/lib/docker

  • 我尝试过@Fai的评论,但该文件在我的系统上不存在,因此这可能是特定于他们设置的问题:/etc/systemd/system/docker.service.d/exec_start.conf. docker.service

  • 我还尝试了@Hatem Jaber的答案https://dev59.com/EFwY5IYBdhLWcg3w5raq#32072042 - 但与@Gerald Sabu M的答案一样,Docker仍然将文件放在原始默认位置/var/lib/docker

(当然,我要感谢他们的努力)。

为什么我要更改默认的 Docker 位置:加密文件系统以符合 GDPR 目的:

顺便提一下,这可能对您有用,我正在运行 docker 内部的加密文件系统(作为 GDPR 倡议的一部分),以提供数据静止状态加密(也称为静止状态加密)和数据使用中的加密 (定义)。

定义 GDPR 数据映射的过程包括许多其他事项,其中之一是查看存储敏感数据的系统 (参考文献1:GDPR 数据映射模板:一个易于使用的自我评估工具,用于了解数据在您的组织中的移动方式) (参考文献2:数据映射:开始符合 GDPR 的地方)。通过加密存储数据库和应用程序代码以及交换文件的文件系统,可以消除删除或移动虚拟机时留下的残留数据的风险。

我已经使用了以下链接中定义的一些步骤,感谢他们:

我要指出,建议进一步加密:加密数据库字段本身 - 至少是敏感字段,即用户数据。您可能可以了解流行数据库系统实现此功能的各种支持级别。字段加密提供了针对恶意入侵和数据泄漏的防御,同时Web应用程序正在运行。

另外,作为另一个旁白的观点:为了覆盖数据的“运动状态”,我正在使用免费的Let's Encrypt


2
很高兴能够帮到你。 :) 很棒的答案,看到你是如何解决问题的非常重要。同时,也很重要提到版本(从这个版本开始,它以这种方式工作。在之前的版本中,它可能会像其他答案所示那样工作)。 - Alfabravo
3
默认情况下,daemon.js 文件不存在...因此需要创建它:vi /etc/docker/daemon.json。我可以确认 daemon.json 是正确的文件扩展名。 - Joe Sadoski
1
这是一个很好的答案,包含了一些关键细节,比如默认情况下没有文件。至于你提到的另一篇有关编辑 /etc/default/docker 的帖子对我没有任何影响。@havnar 这应该是被采纳的答案。 - Oliver
6
graph选项已在v17.05.0中弃用,请改用data-root - Alireza Mohamadi
1
@therobyouknow 很好地解释了...已验证为docker version 18.09.1...我也尝试了其他编辑docker服务的方法...没有一个成功...这个方法非常好用...谢谢。 - the_D
显示剩余10条评论

18
最好的解决方案是使用正确的数据根路径启动Docker守护进程(dockerd)。根据官方文档,在2019年2月,不存在--graph-g选项。这些选项已被重命名为单个参数--data-root

https://docs.docker.com/engine/reference/commandline/dockerd/

所以,您应该修改 /lib/systemd/system/docker.service 文件,使 ExecStart 命令考虑到该参数。
例如:
ExecStart=/usr/bin/dockerd --data-root /mnt/data/docker -H fd://

然后,您应该重新启动docker守护进程。(请记住,您将不再拥有容器和镜像,请将数据从旧文件夹复制到新文件夹中,如果想要保留所有内容)

service docker restart

请记住,如果您重新启动docker守护程序,您的容器将停止,并且只有具有正确重启策略的容器才会重新启动。


在 Ubuntu 16.04.5 上测试,Docker 版本为 18.09.1,构建版本为 4c52b90。


1
在我的Ubuntu 16.04.1上工作正常,Docker版本为19.03.4。 - Ramvignesh
3
同样的问题。在重启服务命令之前,需要执行 systemctl daemon-reload 命令才能使其生效。 - tete

17

您可以使用-g选项和您选择的目录启动Docker守护程序。这将为Docker设置适当的运行时。

从1.8版本开始,应该是这样的:

docker daemon -g /path/to/directory

使用早期版本,可能是这样的:

docker -d -g /path/to/directory

来自 man 手册:

-g, --graph=""
     Path to use as the root of the Docker runtime. Default is /var/lib/docker.

4
这个不应再被标记为正确的了 @Havnar - Naramsim
对于像我一样好奇那个-g选项(或其--graph长形式的同义词)是做什么的未来访客;显然,它是现在--data-root的前身。 - undefined

16
你可以执行以下步骤来修改默认的Docker镜像存储位置,即/var/lib/docker:
  1. 停止Docker
  2. # systemctl stop docker
    # systemctl daemon-reload
    
    请提供需要翻译的完整内容。
    FROM:
    ExecStart=/usr/bin/dockerd
    TO:
    ExecStart=/usr/bin/docker daemon -g /mnt/hugedrive/docker/
    
    创建一个新目录并将当前的Docker数据同步到新目录。
    # mkdir /mnt/hugedrive/docker/
    # rsync -aqxP /var/lib/docker/ /mnt/hugedrive/docker/
    
    现在,Docker守护进程可以安全启动了。
    # systemctl start docker
    

1
这些步骤非常有帮助。但是我必须改变一件事情。在我的Ubuntu机器上,execStart实际上可以在/etc/systemd/system/docker.service.d/exec_start.conf找到。docker.service也存在,但不控制docker守护进程。我通过运行“systemctl edit docker.service”找到了正确的路径。 - Fai

2
在您的系统中的 /etc/default/docker 或其他位置,将以下内容更改为类似于这样的内容:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.8.4 -g /drive/location

如果您遇到问题并且被忽视了,可以尝试使用此解决方案:Docker Opts in Etc Default Docker Ignored。请注意保留HTML标签。

5
在daemon.json文件中,它被添加为"graph":"/path/to/folder", - Alfabravo
1
+1 赞 - 感谢 @Alfabravo - 希望我提供的额外有价值的信息可以支持您在评论中提供的工作解决方案。我已经将其详细阐述为一个新答案,链接在这里:https://dev59.com/EFwY5IYBdhLWcg3w5raq#50726177 - therobyouknow

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