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

从我可以告诉,docker图像被安装到/var/lib/docker因为他们被拉。 有没有办法改变这个位置,比如像/mnt这样的挂载音量?

使用Docker的最新版本,您可以在/etc/docker/daemon.json (根据https://docs.docker.com/v1.11/engine/reference/)将;graph参数的值设置为您的自定义path命令行/守护进程/#守护进程configuration文件 )。

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

根据评论意见,我利用Docker systemd文档来改进这个答案。 下面的过程不需要重新启动,而且更干净。

首先为自定义configuration创build目录和文件:

 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" } 

尽pipe你需要重新加载configuration并重启Docker,

 sudo systemctl daemon-reload sudo systemctl restart docker 

为了确认Docker被重新configuration:

 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 

由于我没有在Fedora中find正确的说明(编辑:人们指出这应该也适用于CentOS和Suse)(/ etc / default / docker没有在那里使用),我添加我的回答这里:

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

 OPTIONS=--selinux-enabled 

所以它会成为

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

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

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

对Docker更好地使用-g选项。 在Ubuntu上,您可以在/etc/default/docker.io中将其永久设置。 增强或replaceDOCKER_OPTS行。

这里是一个例子:`DOCKER_OPTS =“ – g / mnt / somewhere / else / docker /”

在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创build存储库文件

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

基本上,您需要configurationsystemd以将新的docker映像位置作为环境variables读取,并将该环境variables传递到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"文件中添加DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images"

最后做一个systemctl daemon-reload && systemctl restart docker

有关更多信息,请查看文档 。

这个解决scheme适用于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文件,请检查此答案。

一个更简单的解决scheme是创build一个软连接点,以任何你想要的,如

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

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

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

仅使用以下内容创build此文件:

$ sudo vi /etc/docker/daemon.json

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

Ubuntu 16.04.2 LTS上testing

在AWS Ubuntu 16.04服务器上,我将Docker映像放在一个单独的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 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作为系统服务启动,则不build议修改/etc/default/docker文件。 这里有一个指引。

正确的方法是在Linux(或Mac)系统上创build/etc/docker/daemon.json文件,或在Windows上创build%programdata%\docker\config\daemon.json 。 如果这个文件没有被用于其他任何东西,下面的字段应该足够了:

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

这是假设您想要/docker/daemon_files持久化数据的新位置是/docker/daemon_files

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

在Fedora 26以及其他许多版本中,如上所述移动基本文件夹位置后,可能会遇到错误。 如果你把它移到/ home下的某个地方,情况尤其如此。 这是因为SeLinux启动并阻止Docker容器在这个位置下运行许多程序。

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