据我所知,当docker映像被拉出来时,它们被安装到/var/lib/docker中。是否有办法改变这个位置,比如到一个挂载的卷,比如/mnt?


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

在旧版本中,你可以在启动Docker守护进程时使用-goption改变Docker的存储基本目录(容器和映像所在的目录)。(查看docker—help)。 当Docker启动时,您可以通过将其添加到/etc/default/docker来自动应用此设置


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

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

OPTIONS=--selinux-enabled

所以它会变成

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

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


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

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

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


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

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

这里有一个例子: “DOCKER_OPTS = " - g / mnt /地方/其他/码头工人/”


在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中


对于Debian/Ubuntu或Fedora,您可能可以使用其他答案。但是,如果/etc/default/docker或/etc/sysconfig/docker下没有文件,并且您的系统正在运行systemd,您可能希望通过h3nrik来遵循这个答案。我使用Arch,这对我有用。

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

为了完整起见,以下是h3nrick的答案:


你有/lib/systemd/system/docker。服务文件?

如果是,编辑它,以便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。

欲了解更多信息,请参阅文档。


根据评论中的建议,我利用Docker systemd文档来改进这个答案。 下面的程序不需要重新启动,而且更简洁。

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

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"

对于17.06-ce后的docker,粘贴:

[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

Or:

 Docker Root Dir: /mnt

然后你可以安全地删除旧的Docker存储:

rm -rf /var/lib/docker

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

编辑文件 /lib/systemd/system/docker.服务。

在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文件,请检查这个答案。


在一台AWS Ubuntu 16.04服务器上,我把Docker映像放在一个单独的EBS上,挂载在/home/ubuntu/kaggle/上,在Docker目录下

我的初始化脚本的这段代码运行正常

# 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://stackoverflow.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

在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使用我的新目录


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

但如果docker作为系统服务启动,则不建议修改/etc/default/docker文件。这里有一个指南。

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

{
    "graph": "/docker/daemon_files"
}

这是假设你想让docker持久化它的数据的新位置是/docker/daemon_files


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

只创建以下内容的文件:

$ sudo vi /etc/docker/daemon.json

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

在docker 1.12.6中的Ubuntu 16.04.2 LTS上测试


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


在Fedora 26和许多其他版本上,按照上面的描述移动基本文件夹位置后可能会遇到错误。如果你要把它移动到/home下面的某个地方,这一点尤其正确。这是因为SeLinux介入并阻止docker容器在这个位置下运行它的许多程序。

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


更简单的方法:

停止docker服务

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

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

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

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

然后重新启动Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

更详细的一步一步的解释(包括移动数据)使用Docker存储与data-root可以在:博客文章中找到 在Windows的情况下,类似的帖子Windows特定


对于那些期待2020年的人。以下是针对Windows 10 Machine的:

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

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


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

检查这个链接

在/etc/docker/daemon.我在section下面添加了json文件:-

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

基于Linux安装后步骤指南和我在web爬行时发现的官方方法如下:

覆盖docker服务配置文件: Sudo systemctl编辑docker.service 添加或修改以下行,替换您自己的值。 (服务) ExecStart = ExecStart = / usr / bin / dockerd——图=“/ mnt /码头工人”

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

重新加载systemctl配置。 Sudo systemctl daemon-reload 重启码头工人。 Sudo systemctl restart docker.service

在这之后,如果你可以核化/var/lib/docker文件夹,如果你没有任何映像,你可以备份。


这篇博文帮助了我

以下是在创建Docker容器之后更改目录的步骤。

注意,你不需要编辑docker。服务或init。D文件,因为它将从下面提到的.json文件中读取更改。

编辑/etc/docker/daemon.Json(如果它不存在,创建它) 添加以下内容

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

停止码头工人

sudo systemctl stop docker

检查码头已停止

ps aux | grep -i docker | grep -v grep

将文件复制到新位置

sudo rsync -axPS /var/lib/docker/ /new/path/to/docker-data

重新启动Docker

sudo systemctl start docker

检查Docker已使用新位置启动

docker info | grep 'Docker Root Dir'

检查一切已经启动,应该运行

docker ps

在服务器上保留两个副本几天,以确保没有问题出现,然后随意删除它。

sudo rm -r /var/lib/docker