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

Mic*_*ton 170 docker

据我所知,docker图像是/var/lib/docker在拉动时安装的.有没有办法改变这个位置,比如装入卷/mnt

Pio*_*ról 134

根据评论的建议,我利用Docker systemd文档来改进这个答案.下面的过程不需要重启,而且更清洁.

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

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf
Run Code Online (Sandbox Code Playgroud)

对于17.06-ce粘贴之前的docker版本:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"
Run Code Online (Sandbox Code Playgroud)

对于17.06-ce粘贴后的码头工具:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"
Run Code Online (Sandbox Code Playgroud)

替代方法通过 daemon.json

我最近在Fedora 25上用17.09-ce尝试了上面的程序,它似乎不起作用.而不是简单的修改就/etc/docker/daemon.json可以了:

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}
Run Code Online (Sandbox Code Playgroud)

尽管有这种方法,你必须重新加载配置并重启Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

要确认Docker已重新配置:

docker info|grep "loop file"
Run Code Online (Sandbox Code Playgroud)

在最新版本(17.03)中,需要不同的命令:

docker info|grep "Docker Root Dir"
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata
Run Code Online (Sandbox Code Playgroud)

要么:

 Docker Root Dir: /mnt
Run Code Online (Sandbox Code Playgroud)

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

rm -rf /var/lib/docker
Run Code Online (Sandbox Code Playgroud)

  • 这是Ubuntu 16.04帮助我的唯一方法! (8认同)
  • `docker info`语句可能已经过时了.在Ubuntu 16.04上,重新配置的检查是`sudo docker info | grep"Docker Root Dir"`.否则,好的答案,应该是公认的;) (6认同)
  • 在新版本的Linux(4.10)和Docker(docker-ce 17.06)中,必须按如下方式更改行:/ usr/bin/dockerd -H fd:// --data-root ="/ mnt" (5认同)
  • 如果你看到`泊坞根目录:/"到/ mnt"'当你运行`泊坞窗资讯| grep的"泊坞根目录"`,你必须更换`--data根="/ MNT"``到--data文件`docker-storage.conf`中的-root =/mnt` (2认同)

mba*_*emy 128

使用最新版本的Docker,您可以将data-root参数的值设置为自定义路径/etc/docker/daemon.json (根据https://docs.docker.com/v1.11/engine/reference/commandline/daemon/#daemon-configuration-文件).

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

  • 是的,将此行更改为"DOCKER_OPTS =" - dns 8.8.8.8 -dns 8.8.4.4 -g/mnt"` (9认同)
  • 在Fedora中不起作用.如果您的发行版是Fedora,请参阅我的回答 (6认同)
  • 我认为最好的解决方案是将这个`-g`选项添加到/ etc/defaults/docker而不是修改Upstart文件,请参阅我的回答. (4认同)
  • 从v17.05.0起,daemon.json中的`graph`属性已被弃用,请改用`data-root`。/sf/answers/3515236651/ (3认同)
  • 您可能需要在某些版本的Debian或Ubuntu中实现此[解决方案](http://stackoverflow.com/questions/30127580/docker-opts-in-etc-default-docker-ignored-on-debian8)如果docker忽略你的`/ etc/default/docker`文件. (2认同)

and*_*art 41

对于新的docker版本,我们需要使用data-root官方弃用的文档 (Deprecated In Release:v17.05.0)

{
  "data-root": "/new/path/to/docker-data"
}
Run Code Online (Sandbox Code Playgroud)
  • 使用data-root更改Docker存储:我最有帮助的 帖子,其中包含要遵循的步骤
  • 在Windows的情况下类似的Windows特定的帖子

  • 我认为是时候给这个答案加上“ accepted”标志,因为它在当前版本中有效。 (7认同)
  • 您的评论帮助我找到了此页面:https://adriel.co.nz/blog/2018/01/25/change-docker-data-directory-in-debian-jessie/ 谢谢! (2认同)
  • 这是最新 docker 的正确答案。我想补充一点,在添加对 `daemon.json` 的更改并重新启动 docker 服务后,只需使用 `docker info|grep "Docker Root Dir"` 确认 docker 已选择该路径(如@piotr所述) -kr在另一个答案中) (2认同)

Vit*_*tor 38

由于我没有在Fedora中找到正确的指令(EDIT:人们在评论中指出这也适用于CentOS和Suse)(/ etc/default/docker不在那里使用),我正在添加我的回答这里:

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

OPTIONS=--selinux-enabled
Run Code Online (Sandbox Code Playgroud)

所以它会成为

OPTIONS="--selinux-enabled -g /mnt"
Run Code Online (Sandbox Code Playgroud)

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

  • 从Docker版本1.8开始,不推荐使用/ etc/sysconfig中的Docker配置文件.相反,您应该在etc/systemd/system/docker.service.d中使用systemd drop-in配置文件.在docker服务运行时添加或修改drop-in文件后,运行命令systemctl daemon-reload告诉systemd重新加载该服务的配置.https://docs.oracle.com/cd/E52668_01/E54669/html/section_kfy_f2z_fp.html (6认同)

sut*_*her 23

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

最好使用-g Option for docker.在Ubuntu上,您可以在/etc/default/docker.io中永久设置它.增强或替换DOCKER_OPTS线.

这里有一个例子:`DOCKER_OPTS =" - g/mnt/somewhere/else/docker /"

  • 使用符号链接时,我对 `docker rm` 会遇到什么样的麻烦? (2认同)

Top*_*era 13

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

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

$ sudo vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }
Run Code Online (Sandbox Code Playgroud)

Ubuntu 16.04.2 LTS在docker 上测试过1.12.6

  • 从 v17.05.0 开始,daemon.json 中的 `graph` 属性已被弃用,请改用 `data-root`,参见。/sf/answers/3515236651/ (2认同)

小智 12

在CentOS 6.5中

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker
Run Code Online (Sandbox Code Playgroud)

添加以下行

other_args=" -g /data/docker -p /var/run/docker.pid"
Run Code Online (Sandbox Code Playgroud)

然后保存文件并再次启动docker

service docker start
Run Code Online (Sandbox Code Playgroud)

并将存储库文件 /data/docker


Sud*_*pta 11

此解决方案适用于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/
Run Code Online (Sandbox Code Playgroud)

执行以下命令

systemctl daemon-reload
systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

执行命令以检查docker目录

docker info | grep "loop file\|Dir"
Run Code Online (Sandbox Code Playgroud)

如果您在Red Hat或docker 1.7.1中有/ etc/sysconfig/docker文件,请检查答案.


fnj*_*njn 11

这样做更简单:

停止docker服务

sudo systemctl stop docker
Run Code Online (Sandbox Code Playgroud)

将现有的Docker目录移动到新位置

sudo mv /var/lib/docker/ /path/to/new/docker/
Run Code Online (Sandbox Code Playgroud)

创建符号链接

sudo ln -s /path/to/new/docker/ /var/lib/docker/
Run Code Online (Sandbox Code Playgroud)

启动docker服务

sudo systemctl start docker
Run Code Online (Sandbox Code Playgroud)

  • 这是IMO正确,最直接的解决方案-对我有用。 (2认同)
  • 对我而言,它就像一个魅力,但没有符号链接命令的结尾斜杠:`sudo ln -s / path / to / new / docker / / var / lib / docker` (2认同)

mod*_*tos 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.

有关详细信息,请查看文档.


Sil*_*ria 6

根据此Linux 安装后步骤指南以及我在网络爬行时发现的内容,执行此操作的官方方法如下:

  1. 覆盖 docker 服务配置:

     sudo systemctl edit docker.service
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加或修改以下行,替换您自己的值。

     [Service]
     ExecStart=
     ExecStart=/usr/bin/dockerd --graph="/mnt/docker"
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 重新加载systemctl配置。

     sudo systemctl daemon-reload
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重新启动 Docker。

     sudo systemctl restart docker.service
    
    Run Code Online (Sandbox Code Playgroud)

/var/lib/docker在此之后,如果您没有任何需要备份的图像,则可以删除文件夹。


mec*_*cov 6

这篇博文对我有帮助

\n

以下是即使在您\xe2\x80\x99 创建了 Docker 容器等之后更改目录的步骤。

\n

请注意,您不需要编辑\xe2\x80\x99docker.service或文件,因为它将从下面提到的文件init.d中读取更改。.json

\n
    \n
  1. 编辑/etc/docker/daemon.json(如果不存在,则创建)

    \n
  2. \n
  3. 添加以下内容

    \n
  4. \n
\n
{\n  "data-root": "/new/path/to/docker-data"\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 停止泊坞窗
  2. \n
\n
sudo systemctl stop docker\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 检查docker是否已经停止
  2. \n
\n
ps aux | grep -i docker | grep -v grep\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将文件复制到新位置
  2. \n
\n
sudo rsync -axPS /var/lib/docker/ /new/path/to/docker-data\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 启动 Docker 备份
  2. \n
\n
sudo systemctl start docker\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 检查 Docker 是否已使用新位置启动
  2. \n
\n
docker info | grep \'Docker Root Dir\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 检查所有应该运行的东西都已经启动
  2. \n
\n
docker ps\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将两个副本保留在服务器上几天,以确保不会出现问题,然后随时将其删除。
  2. \n
\n
sudo rm -r /var/lib/docker\n
Run Code Online (Sandbox Code Playgroud)\n


iva*_*dov 5

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

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

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

{
    "graph": "/docker/daemon_files"
}
Run Code Online (Sandbox Code Playgroud)

这是假设您希望 docker 保留其数据的新位置是 /docker/daemon_files