如何更改“docker create volume”命令的默认位置?

64
创建卷时,即使作为容器卷模式,也不一定是最佳实践了。
# docker volume inspect test-data
[
    {
        "Name": "test-data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/test-data/_data"
    }
]

比如,我希望Docker卷存在于/data目录中(该目录已挂载到另一个物理数据卷上)。

这无法通过符号链接实现,但可以使用绑定挂载来实现。不过我想知道是否有Docker配置可以更改每个单独卷的默认位置。


8
我使用符号链接完成了这个操作:# cd /var/lib/docker/volumes # ln -s /mnt/myvolume myvolume然后创建卷并启动你的 Docker 镜像:# docker volume create --name myvolume # docker run -v myvolume:/myvolumemountpoint ... - DoctorBug
1
使用符号链接似乎工作正常,但是您无法删除卷,因为“docker”不允许删除未作为“data_root”子目录的卷。(显然,“docker”会为卷解析符号链接。) - go2null
与上面的评论相关(关于无法删除符号链接所在卷):https://github.com/moby/moby/issues/39446 - Sergey Grechin
4个回答

71

您可以通过更改 Docker 的一个启动参数 --data-root 来更改其存储文件(包括卷)的位置。

如果您使用 systemd 进行服务管理,则该文件通常位于 /lib/systemd/system/docker.service。请编辑该文件:

# Old - taken from the generated docker.service file in Ubuntu 16.04's docker.io package
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

# New
ExecStart=/usr/bin/dockerd --data-root /new_location/ -H fd:// $DOCKER_OPTS

或者您可以编辑 Docker 守护程序配置文件,该配置文件默认位于 /etc/docker/daemon.json

重新启动 Docker 守护进程,您的卷将位于 /new_location/volumes/{volume_name}/_data 下。

注意:在生产环境和本地环境中都要小心!您还必须将现有数据从 /var/lib/docker/ 移动到新位置,以使您的 Docker 安装按预期工作。

如果您希望特定文件夹位于特定位置,则可以使用新位置的符号链接。


5
-g 标志已经被弃用,建议使用新的 --data-root 标志。[来源:https://docs.docker.com/engine/deprecated/#-g-and---graph-flags-on-dockerd] - Serzhan Akhmetov
15
--data-root 参数将 所有 持久化数据移动到指定目录,包括容器数据、镜像数据等。如果能够指定一个目录来存储卷,以便将用户数据与 Docker 内部状态数据分离,那就太好了。 - Sebastian
2
我其实也只想保留我的RAID卷而不是状态数据和容器,因为我总是可以重新拉取镜像 - 所以这里没有必要冗余,但对于卷来说却是必要的... 唉 :/ - Igor

27
2017年,随着17.05.0-ce (2017-05-04)的发布,PR 28696废弃了--graph标志,改用--data-rootcommit 1ecaed0

“graph”名称是一个古老的遗留术语,早期默认位置/var/lib/docker/graph曾经有一个目录。

然而,这个标志将指示包含镜像数据以及卷、容器和网络数据的“graph”目录的父目录路径。
在最新版本的Docker中,此目录还包含Swarm集群状态和节点证书。

随着问题5922PR 5978的解决,文档已更新。

示例

ExecStart=/usr/bin/dockerd -H fd:// --data-root=/mnt/ssd/lib/docker

2016年(现已弃用)

我只知道有一种Docker选项可以更改/var/lib/docker本身,而不是它的子文件夹(由Docker守护进程存储驱动程序使用的"图形" 的一部分)

请参见Docker守护进程“杂项选项”

Docker支持Docker数据目录(/var/lib/docker)和/var/lib/docker/tmp的软链接。
可以像这样设置DOCKER_TMPDIR数据目录:

DOCKER_TMPDIR=/mnt/disk2/tmp /usr/local/bin/docker daemon -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1
# or
export DOCKER_TMPDIR=/mnt/disk2/tmp
/usr/local/bin/docker daemon -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log

如 "在主机上存储docker镜像的位置在哪里?" 中提到的(对于容器/卷也适用):

/var/lib/docker 目录的内容取决于 Docker 使用的存储驱动


10
我成功地通过将 /var/lib/docker 的内容移动到新位置并创建一个符号链接指向新位置(我从这里得到了解决方案https://askubuntu.com/questions/631450/change-data-directory-of-docker)来移动 Docker 存储位置:

注意 - 这些步骤取决于您当前的 /var/lib/docker 是否是实际目录(而不是指向另一个位置的符号链接)。

1)停止 Docker:service docker stop。验证没有 Docker 进程在运行:ps aux | grep -i [d]ocker

2)再次确认 Docker 确实没有运行。查看当前 Docker 目录:ls /var/lib/docker/

2b)备份 - tar -zcC /var/lib docker > /mnt/pd0/var_lib_docker-backup-$(date +%s).tar.gz

3)将 /var/lib/docker 目录移动到新分区:mv /var/lib/docker /mnt/pd0/docker

4)创建符号链接:ln -s /mnt/pd0/docker /var/lib/docker

5)查看目录结构,确保它看起来像移动前一样:ls /var/lib/docker/(注意斜杠后面的空格)

6)重新启动 Docker:service docker start

7)重新启动您的容器(解决符号链接)

在 Azure VM 上的 Ubuntu 18.04.1 LTS 上,使用 Docker 18.09.2 对我有效。


正如预期的那样工作。谢谢。 - Vinoth Ramamoorthy
这种方法是有效的,但是我在权限方面遇到了一些问题。只需要确保在创建副本或移动文件时,用户和权限得到保留。可以使用cp -Rp代替mv命令。 - AFwcxx

1
如果您使用的是 Fedora(已在 32 上测试),只需在 /etc/sysconfig/dockerOPTIONS 变量中更改或添加 --data-root 标志,并将其设置为所需路径。这是 systemd 用于启动 dockerd 服务的环境文件。

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