当我运行 Docker 时,已下载的 Docker 镜像(似乎)存储在 /var/lib/docker
的某个位置。
由于此目录上的磁盘空间有限,并且我正在一次性为多台机器提供 Docker;是否有方法可以更改默认位置为 /mnt/hugedrive/docker/
?
当我运行 Docker 时,已下载的 Docker 镜像(似乎)存储在 /var/lib/docker
的某个位置。
由于此目录上的磁盘空间有限,并且我正在一次性为多台机器提供 Docker;是否有方法可以更改默认位置为 /mnt/hugedrive/docker/
?
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。
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。
systemctl daemon-reload
命令才能使其生效。 - tete您可以使用-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.
-g
选项(或其--graph
长形式的同义词)是做什么的未来访客;显然,它是现在--data-root
的前身。 - undefined# 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
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.8.4 -g /drive/location
"graph":"/path/to/folder",
。 - Alfabravo
daemon.js
文件不存在...因此需要创建它:vi /etc/docker/daemon.json
。我可以确认daemon.json
是正确的文件扩展名。 - Joe Sadoskigraph
选项已在v17.05.0中弃用,请改用data-root
。 - Alireza Mohamadi