如何更改默认的docker容器位置?

Hav*_*nar 33 docker

当我运行docker时,下载的docker图像(似乎是)存储在/var/lib/docker某个地方.

由于此目录上的磁盘空间有限,我正在同时为多台机器配置docker; 有没有办法将此默认位置更改为ie /mnt/hugedrive/docker/

the*_*now 64

从Docker v18.03开始的工作解决方案

我发现@ Alfabravo的评论在我的情况下工作,所以对他们有信心并且赞成.

但是我认为它增加了价值,在这里提供一个答案来详细说明:

确保停靠器停止(或者首先不启动,例如,如果您刚刚安装它)

(例如作为root用户):

systemctl stop docker
Run Code Online (Sandbox Code Playgroud)

(或者你可以,sudo systemctl stop docker如果不是root但你的用户是sudo-er,即属于该sudo组)

默认情况下,该daemon.json文件不存在,因为它是可选的 - 它被添加以覆盖默认值.(参考 - 请参阅答案:Docker的deamon.json在哪里?(缺失) )

所以docker的新安装和那些从未修改它的设置都没有,所以创建它:

vi /etc/docker/daemon.json
Run Code Online (Sandbox Code Playgroud)

并添加以下内容告诉docker将其所有文件放在此文件夹中,例如:

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

并保存.

现在启动docker:

graph

(如果是其他用户data-root,systemctl start docker则为if 或前缀.)

您会发现docker现在已将所有文件放在新位置,在我的情况下,位于:root.

来自@Alfabravo的答案也得到以下支持:这个问题的答案:Docker守护程序标志被忽略了

关于Docker版本控制的注意事项和想法

我运行docker的主机平台是Ubuntu Linux 16.04.4 LTS 64bit.

因此,我认为这个解决方案适用于Docker的后续版本,以及当前的写作时间,版本为v18.03.换句话说:"这个解决方案应该从v18.03开始工作".正如其他答案的情况似乎如此,如果Docker开发人员决定改变这方面的内容,那么这个答案可能对Docker的未来版本可能不起作用.但就目前而言,它适用于v18.03,至少在我的情况下,我希望你也发现它适合你.

可选的管家提示:

如果您在原始位置有文件,sudo 并且您知道自己肯定不再需要它们(即您拥有所有数据(容器,文件等内的数据库)备份或以其他形式),您可以删除它们,以保持您的机器整洁.

什么不起作用 - 其他答案在这里(不幸的是):

这里的其他解决方案对于我正在使用的当前版本的docker的情况不起作用(作为编写时,当前的docker版本是:Docker v18.03(当前)).

另请注意(正如@AlfaBravo在对我的回答的评论中正确指出的那样)其他答案可能适用于不同版本或早期版本的docker.

我应该注意我的主机平台是Ubuntu Linux 16.04.4 LTS 64bit.

在尝试其他答案的所有情况下,我都会在执行解决方案之前遵循停止docker的过程,然后根据需要在之后启动它.:

  • /sf/answers/3332340021/ - @ Gerald Sabu M改变的解决方案/mnt/cryptfs/docker- 改变行:/var/lib/docker- 结果对我来说:docker仍将其文件放在默认的原始位置:/lib/systemd/system/docker.service

  • 我尝试了@Fai的评论,但是我的系统上不存在该文件,因此它们的设置是特别的: ExecStart=/usr/bin/docker daemon -g /mnt/hugedrive/docker/

  • 我也尝试了@Hatem Jaber的答案 /sf/answers/2245042971/ - 但同样,@ Gerald Sabu M的回答,docker仍将文件放在原来的默认位置/var/lib/docker.

(我当然要感谢他们的努力).

为什么我要更改默认的docker位置:用于GDPR的加密文件系统:

顺便说一下,也许对你有用,我在加密文件系统中运行docker(作为GDPR计划的一部分),以便提供数据静态数据加密(也称为静态加密) )以及数据使用中的(定义).定义GDPR数据图 的过程包括查看存储敏感数据的系统(参考文献1:GDPR数据地图模板:易于使用的自我评估工具,用于了解数据如何在您的组织中移动)(参考文献2:数据映射:从哪里开始遵守GDPR).并且通过加密存储数据库和应用程序代码的文件系统以及交换文件,可以消除在删除或移动VM时遗留的残留数据的风险.我已经使用了以下链接中定义的一些步骤,相信它们:

  • 很高兴这没有任何帮助。:)很好的答案,重要的是要了解您的工作方式。另外,重要的是要提到该版本(从此版本开始,它是这样工作的。在以前的版本中,它可能如其他答案所示) (2认同)
  • _默认情况下,daemon.js文件不存在..._ _so创建它:_`vi / etc / docker / daemon.json`-我是否正确地认为`daemon.json`是正确的文件扩展名? (2认同)
  • 在v17.05.0中,[graph]选项为[不推荐使用](https://docs.docker.com/engine/deprecated/#-g-and---graph-flags-on-dockerd)。使用`data-root`代替。 (2认同)

Dha*_*mit 17

您可以使用-g选项和您选择的目录启动Docker守护程序.这为Docker设置了适当的运行时.

对于1.8版,它应该是这样的:

docker daemon -g /path/to/directory
Run Code Online (Sandbox Code Playgroud)

对于早期版本,它将是:

docker -d -g /path/to/directory
Run Code Online (Sandbox Code Playgroud)

从手册页:

-g, --graph=""
     Path to use as the root of the Docker runtime. Default is /var/lib/docker.
Run Code Online (Sandbox Code Playgroud)

  • 该答案不再起作用。 (4认同)
  • 这不应该再被标记为正确的@Havnar (3认同)

Jer*_*u M 12

您可以执行以下步骤来修改默认的docker镜像位置,即/ var/lib/docker: -

  1. 停止Docker

    # systemctl stop docker
    # systemctl daemon-reload
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将以下参数添加到/lib/systemd/system/docker.service.

    FROM:
    ExecStart=/usr/bin/dockerd
    TO:
    ExecStart=/usr/bin/docker daemon -g /mnt/hugedrive/docker/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个新目录并将当前docker数据rsync到新目录.

    # mkdir /mnt/hugedrive/docker/
    # rsync -aqxP /var/lib/docker/ /mnt/hugedrive/docker/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,Docker Daemon可以安全启动

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


Nar*_*sim 7

最好的解决方案是dockerd使用正确的数据根路径启动docker daemon()。根据官方文件,为2019年2月,有没有--graph-g选项。这些被重命名为单个参数--data-root

https://docs.docker.com/engine/reference/commandline/dockerd/

因此,您应该修改自己的名称,/lib/systemd/system/docker.service以便ExecStart考虑到该参数

一个例子可能是

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

然后,您应该重新启动docker守护程序。(请记住,您将不再拥有容器和图像,如果要维护所有内容,请将数据从旧文件夹复制到新文件夹)

service docker restart
Run Code Online (Sandbox Code Playgroud)

请记住,如果您重新启动docker守护程序,则您的容器将被停止,只有那些具有正确重启策略的容器才会被重新启动。


在Ubuntu 16.04.5 Docker 18.09.1版上测试,内部版本4c52b90

  • 同上。在服务重新启动命令之前必须执行“systemctl daemon-reload”才能使其工作。 (3认同)