如何更改Docker镜像存储目录?
如何更改Docker镜像存储目录?
在下面的内容中,我们可以找到更改Docker镜像存储目录的原因和解决方法。
根据评论中的建议,我使用Docker systemd文档来改进这个回答。
以下步骤不需要重新启动,而且更加干净。
首先创建目录和文件以进行自定义配置:
sudo mkdir -p /etc/systemd/system/docker.service.d sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf
对于Docker版本17.06-ce之前,粘贴以下内容:
[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上尝试了上述方法,似乎不起作用。而在/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"
。否则,回答是正确的,应该被接受 😉
我刚刚在Debian Sid上测试了Docker 1.12.0,仍然有Data loop file
和Metadata loop file
。显然在Ubuntu上你有不同的版本。
它之前起作用了一段时间,但是从某个时候开始,在启动docker服务时出现错误:Error starting daemon: error initializing graphdriver: invalid argument
(请参见github.com/docker/docker/issues/14026)。删除/etc/systemd/system/docker.service.d/docker-storage.conf
后一切正常。可能的原因是我在此期间升级了内核。
确认工作日期:2017年5月26日,在Xubuntu 16.04 LTS上,Docker版本17.03.1-ce,构建c6d412e。
在Debian上,要编辑的文件似乎是/lib/systemd/system/docker.service(请参见linuxconfig.org/…)。
在新版本的Linux(4.10)和Docker(docker-ce 17.06)中,必须将行更改为以下内容:/usr/bin/dockerd -H fd:// --data-root="/mnt"
小心,如果您还在/etc/systemd/system/docker.service.d/中使用了docker.conf文件。
如果在运行docker info|grep "Docker Root Dir"
时看到Docker Root Dir: /"/mnt"
,则必须在docker-storage.conf
文件中将--data-root="/mnt"
替换为--data-root=/mnt
。
请注意,新的存储位置不应该是NTFS分区,请参见here,如果您确实希望使用vfs驱动程序,请查看提到的线程。
对于19.03.12版本,位于Ubuntu 18.04.3 LTS上,可以在/etc/docker/daemon.json中使用上述方法。
如何更改Docker镜像存储目录?
近期的Docker版本中,您可以在/etc/docker/daemon.json中将data-root参数的值设置为自定义路径(参考https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file)。
在旧版本中,您可以在启动Docker守护进程时使用-g选项来更改Docker的存储基目录(容器和镜像所在的目录)(查看docker --help)。
您可以通过将其添加到/etc/default/docker来实现在Docker启动时自动应用此设置。
谢谢您的回答。您能告诉我如何在docker upstart文件中添加这个要求吗?我是否应该在DOCKER_OPTS变量中添加-g标志?
抱歉给您带来困惑,我指的就是那个文件。在'/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文件,您可能需要实施此解决方案(http://stackoverflow.com/questions/30127580),以解决某些版本的Debian或Ubuntu中的一个错误。
如果您只想更改此设置,请仅更改为:DOCKER_OPTS="-g /mnt",省略-dns参数
谢谢。这个方法很好用。但是当我下载新的镜像时,出现了这个错误:"failed to register layer: Untar re-exec error: exit status 1: output: link /bin/dnsdomainname /bin/domainname: operation not permitted" 有什么想法吗?
不建议在/etc/default/docker中设置此标志。在/etc/default/docker文件中有一条注释指向这个指南(https://docs.docker.com/v1.11/engine/reference/commandline/daemon/#daemon-configuration-file)。
-g选项在哪里有文档?我在dockerd的man页面上没有找到。
那是针对旧版Docker发布的 - 我最初的答案是在3年前写的 😉
在17.09.0-ce上仍然有效,但我还没有找到相关的文档。
对于后续的读者:这个解决方案适用于CentOS 7,使用docker-ce服务器版本19.3
我尝试了几种不同的方法,但编辑/etc/docker/daemon.json配置是最终为我工作的。这里有详细的说明:evodify.com/change-docker-storage-location
如何更改Docker镜像存储目录?
问题原因:新版本的Docker中,将graph
标记废弃,需要使用data-root
来指定镜像存储目录。
解决方法:编辑/etc/docker/daemon.json
文件(如果不存在,则创建文件),并添加以下内容:
{
"data-root": "/new/path/to/docker-data"
}
然后使用以下命令重新启动Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker
此外,还可以参考以下链接中的详细步骤(包括数据的移动)来使用data-root
进行Docker存储设置:
对于Windows操作系统,可以参考以下链接中的文章进行类似操作:
其他用户的评论和回答:
- 一个用户在评论中提到了一个相关的链接:adriel.co.nz/blog/2018/01/25/…
- 另一个用户在评论中指出,该方法适用于最新版本的Docker。
- 一个用户在评论中提到,可以使用docker info|grep "Docker Root Dir"
命令确认Docker是否已经使用新的存储目录。
- 一位用户在评论中表示,在Ubuntu 21.04上该方法适用。
- 最后一个用户提到,在更改后,原始目录/var/lib/docker
仍然存在,可以安全地删除。
通过以上整理,我们可以得出如何更改Docker镜像存储目录的原因和解决方法。