如何更改Docker镜像安装目录?


182

据我所知,泊坞窗映像在安装时即已安装/var/lib/docker。有没有办法更改此位置,例如更改为已安装的卷/mnt


3
您的docker在哪个操作系统上运行?
Thomasleveil 2014年

Answers:


135

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

对于较旧的版本,可以-g在启动Docker守护程序时使用该选项更改Docker的存储基础目录(容器和映像所在的位置)。(检查docker --help)。您可以在Docker启动时自动将该设置添加到/ etc / default / docker


4
我认为最好的解决方案是将此-g选项添加到/ etc / defaults / docker中,而不是修改Upstart文件,请参阅我的答案。
mbarthelemy 2014年

9
是的,将此行更改为DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy,2014年

6
在Fedora中不起作用。如果您的发行版是Fedora
Vitor,

3
如果docker忽略了您的文件,则可能需要对某些版本的Debian或Ubuntu中的错误实施此解决方案/etc/default/docker
尼迪姆

4
graphv17.05.0起,daemon.json中的属性已弃用,请改为使用data-rootcf。 stackoverflow.com/a/50217666/743507
dschulten

141

根据评论的建议,我利用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

要么:

 Docker Root Dir: /mnt

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

rm -rf /var/lib/docker

8
这是唯一在Ubuntu 16.04上对我有帮助的方法!
瓦迪姆

1
此链接docs.docker.com/engine/admin/systemd解释了如何使用systemd配置Docker,该系统适用于更新的Linux发行版,例如Ubuntu 16.04。
约瑟夫·许

6
docker info声明可能已过时。在Ubuntu 16.04上,重新配置的检查为sudo docker info | grep "Docker Root Dir"。否则,好的答案应该是被接受的;)
Guillaume Perrot

5
在新版本的Linux(4.10)和Docker(docker-ce 17.06)中,必须按以下方式更改该行:/ usr / bin / dockerd -H fd:// --data-root =“ / mnt”
lorenzo-bettini

2
如果你看到Docker Root Dir: /"/mnt",当你运行docker info|grep "Docker Root Dir",必须更换--data-root="/mnt"--data-root=/mnt里面的文件docker-storage.conf
丝氨酸

61

因为我们需要用新的泊坞窗版本,data-rootgraph在v17.05.0被弃用:官方过时的文档

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

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

然后使用以下命令重启Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • 可以在以下位置找到更详细的分步说明(包括移动数据),该操作使用带数据根的 Docker存储:博客文章
  • 如果是Windows,则类似Windows的特定帖子

您的评论帮助我找到了此页面:adriel.co.nz/blog/2018/01/25 / ... 谢谢!
nasatome '18

8
我认为是时候给这个答案加上“ accepted”标志,因为它在当前版本中有效。
Bndr '19

github.com/docker/docker.github.io/pull/5978发布之后,我在这里发表评论以让人们知道哪个版本可以使用它,它更改了官方网站。
zhongjiajie

这也对我
有用

39

由于我没有在Fedora中找到执行此操作的正确说明(编辑:人们在评论中指出这也应在CentOS和Suse上起作用)(/ etc / default / docker不在此处使用),因此我添加了在这里回答:

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

OPTIONS=--selinux-enabled

所以它会变成

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

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


在CentOS 6.5 / 6.6以及可能的7上,您使用相同的/ etc / sysconfig / docker文件,但是将参数添加到变量名称other_args中。
dlaidlaw

该选项现在称为DOCKER_OPTS(docker版本1.7.0)。
尼迪姆

6
从Docker版本1.8开始,不建议在/ etc / sysconfig中使用Docker配置文件。相反,您应该在etc / systemd / system / docker.service.d中使用systemd插入配置文件。在docker服务运行时添加或修改了一个插入文件后,运行命令systemctl daemon-reload告诉systemd重新加载该服务的配置。docs.oracle.com/cd/E52668_01/E54669/html/…–
Pablo Marin-Garcia


23

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

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

这是一个示例:`DOCKER_OPTS =“-g / mnt / somewhere / else / docker /”


就我而言,我必须重新启动
psychok7

1
docker rm使用符号链接时,我会遇到什么麻烦?
bjhend

1
为了使它正常工作,我还必须在Ubuntu 16.04 stackoverflow.com/a/30219552/977622中执行此操作
psychok7 '16

21

这样做更简单:

停止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

2
这是IMO正确,最直接的解决方案-对我有用。
马丁·德沃夏克

2
对我来说就像是一种魅力,但对于符号链接命令却没有结尾斜杠:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

码头工人论坛提出了以下建议:forums.docker.com/t/…–
headdab

这是一个很棒的解决方案,挽救了我的生命。:)
Niketh Sudhakaran

我已经在上面执行了,Docker已经启动并正在运行。但是我找不到我的docker镜像已经存在。有什么建议?
Thilina Viraj

13

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

在文本编辑器中编辑文件 /lib/systemd/system/docker.service

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


我的情况:centos7,最新的docker;我必须调用“ systemctl status docker”以找到“ docker.service”文件,并在答案中添加选项“ -g”。谢谢
daddinhquoc

13

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

仅使用以下内容创建该文件:

$ sudo vi /etc/docker/daemon.json

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

Ubuntu 16.04.2 LTS在docker 上测试1.12.6


1
graphv17.05.0起,daemon.json中的属性已弃用,请改为使用data-rootcf。 stackoverflow.com/a/50217666/743507
dschulten

12

在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


6

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

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

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


你有/lib/systemd/system/docker.service文件吗?

如果是这样,请对其进行编辑,以使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

有关更多信息,请参阅文档


如果按照Debian的当前docker安装说明进行操作,则会获得SysVinit脚本,但不会使用它们。见github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside

4

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

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

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


6
不要创建软链接。原因见我之前发表的评论...您可能在使用'docker rm'命令时遇到麻烦!
2015年

2
@suther:可以吗?现在是否有遇到麻烦的情况?对于技术文档而言,可能有点不准确,如果遇到问题,那么我想学习确切的时间,问题的产生原因以及结果。
哈克(Hakre)'16

4

正如@mbarthelemy所建议的那样,-g可以在直接启动docker 守护程序时通过选项完成此操作。

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

正确的方法是/etc/docker/daemon.json在Linux(或Mac)系统或%programdata%\docker\config\daemon.jsonWindows 上创建文件。如果此文件未用于其他任何用途,则以下字段应足够:

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

假设您要让docker保留其数据的新位置是 /docker/daemon_files


2

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


2

在Fedora 26以及可能的许多其他版本上,如上所述移动基本文件夹位置后,您可能会遇到错误。如果将其移动到/ home下的某个位置,则尤其如此。这是因为SeLinux插入并阻止docker容器在此位置下运行其许多程序。

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


那不是开放的攻击空间吗?
yuriploc

1

在一个AWS Ubuntu 16.04服务器上,我将Docker映像放置在单独的EBS上,该EBS安装在docker目录下的/ home / ubuntu / kaggle /上

我的初始化脚本的这一片段正常工作

# 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 /programming/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

0

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


docker的现有文件怎么样?我们应该手动移动它吗?
古斯塔夫

您可以尝试在自己喜欢的位置重新安装docker。映像和docker文件是独立的。
sahu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.